PNG到Opengl的使用问题

时间:2015-05-28 06:32:07

标签: c++ windows opengl

我试图将几个原生PNG图像整理成Opengl&我有一些障碍。我已经使用了Cximage库,所以如果我能帮助它,我宁愿坚持这个。

3个相关问题;

  1. PNG显示为黑色& OpenGL中的白色。图像不是问题,因为其他图像类型有效,但除非它易于使用,否则我不会转换。不需要磁盘保存或其他库。
  2. 具有黑色背景的PNG,假设是透明的。
  3. OpenGL视图/方向问题。图像在OpenGL中偏斜,即未正确定向。 PNG包含等距视图,我试图显示这些视图。
  4. 示例我正在使用的代码;

    *是的我知道我使用折旧的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 个答案:

答案 0 :(得分:0)

  1. 找到http://ysflight.in.coocan.jp/programming/pngdecoder/pngdecodere.html&amp;将其修改为读取现有缓冲区。最小的麻烦,没有磁盘保存或库。

  2. 通过添加

    获得PNG透明度
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
  3. 成像撕裂;好像我跟着错误的顺序;

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