PNG到Opengl的使用问题

PNG to Opengl usage issues

本文关键字:问题 Opengl PNG      更新时间:2023-10-16

我正在尝试将几个本机PNG图像整理成Opengl &我遇到了一些障碍。我已经在使用Cximage库,所以如果我能帮助它,我宁愿坚持这个。

3相关问题;

  1. png显示为黑色&白色在OpenGL。图像不是其他图像类型工作的问题,但我宁愿不转换,除非它很容易&
  2. PNG具有黑色背景,应该是透明的
  3. OpenGL视图/方向问题。图像在OpenGL中倾斜,即没有正确定向。png包含等距视图,我正在尝试显示。

我当前使用的代码示例;

*是的,我意识到我正在使用贬值的Opengl。由于我正在使用的遗留代码,我需要。

int MyScene::LoadTexture
{
    m_pImgCol = new CxImage((BYTE *)pdatabuffer, (DWORD)filesize, CXIMAGE_FORMAT_PNG);
    DWORD iDest(0), iSrc(0);
    DWORD dwSize = m_pImgCol->GetWidth()*m_pImgCol->GetHeight();
    BYTE  *pSrc = m_pImgCol->GetBits();
    BYTE  *pDest = new BYTE[dwSize * 4];
    BYTE  *pSrcA = m_pImgAlpha ? m_pImgAlpha->GetBits() : NULL;
    BYTE  alpha;
    for (DWORD iX = 0; iX<dwSize; iX++)
    {
        alpha = 255;
        if (pSrcA)
            alpha = pSrcA[iX];
        else
        {
            if (pSrc[iSrc] == 0 && pSrc[iSrc + 1] == 0 && pSrc[iSrc + 2] == 0)
                alpha = 0;
        }
        pDest[iDest++] = pSrc[iSrc++];
        pDest[iDest++] = pSrc[iSrc++];
        pDest[iDest++] = pSrc[iSrc++];
        pDest[iDest++] = alpha;
    }
    GLuint iTexture=0;
    glGenTextures(1, &iTexture);
    glBindTexture(GL_TEXTURE_2D, 0);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, m_pImgCol->GetWidth(), m_pImgCol->GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, pDest);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glEnable(GL_TEXTURE_2D);
}

int MyScene::DrawGLScene()
{
    CRect rWnd;
    GetClientRect(&rWnd);
    glViewport(0,0,rWnd.Width(),rWnd.Height()); 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();                       
    glOrtho(-20 * m_Zoom, 20 * m_Zoom, -15 * m_Zoom, 25 * m_Zoom, 20000, -20000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glTranslatef(0, -0.5f, 0.0f);
    glRotatef(m_rx, 1.0f, 0.0f, 0.0f);   
    glRotatef(m_rz, 0.0f, 0.0f, 1.0f);  
    glRotatef(m_ry, 0.0f, 1.0f, 0.0f);
    DrawScene();
    SwapBuffers(m_pView->m_hDC);
    return TRUE;
}

int MyScene::DrawScene
{
    float dL = -8;
    float dR = 8;
    float dT = -8;
    float dB = 8;
    glBindTexture(GL_TEXTURE_2D, 0);
    glColor3f(1.0f, 1.0f, 1.0f);
    glBegin(GL_QUADS);
    glVertex3f(dL, dT, 0);
    glTexCoord2f(0, 0);
    glVertex3f(dL, dB, 0);
    glTexCoord2f(0, 1);
    glVertex3f(dR, dB, 0);
    glTexCoord2f(1, 1);
    glVertex3f(dR, dT, 0);
    glTexCoord2f(1, 0);
    glEnd();
}

如果有必要,我可以提供更多的代码,但这是最基本的,我可以把它分解为。

  1. 发现http://ysflight.in.coocan.jp/programming/pngdecoder/pngdecodere.html &修改它以读取现有缓冲区。

  2. 通过添加;

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
  3. 成像撕裂;看来我的顺序不对;

    glTexCoord2f(0, 0);
    glVertex3f(dL, dT, 0);