OpenGL纹理颜色分离

Posted

技术标签:

【中文标题】OpenGL纹理颜色分离【英文标题】:OpenGL texture color separation 【发布时间】:2013-07-05 11:04:07 【问题描述】:

我在 OpenGL 环境中使用 CImg。当我尝试添加纹理时,每种颜色似乎都在纹理中分离成单独的图块。例如,当我尝试使用如下所示的纹理时:

它在我的程序中看起来像这样:

我正在加载的纹理是一个 512x512 .bmp 文件,保存在 Gimp 中,颜色深度为 24 位,RBG。我尝试了 Gimp 允许的其他一些格式,但那些只会导致 CI​​mg 出错。

这是我加载纹理的方式:

glBindTexture(GL_TEXTURE_2D, 13);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

CImg<unsigned char> src("MilkyWay.bmp");
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, src.width(), src.height(), 
    0, GL_RGB, GL_UNSIGNED_BYTE, src);

这就是我显示纹理的方式:

glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, 13);
glBegin (GL_QUADS);         
    glTexCoord2f (0.0, 1.0);
    glVertex3f (-120.0, 120.0, 0.0);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (120.0, 120.0, 0.0);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (120.0, -120.0, 0.0);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (-120.0, -120.0, 0.0);
glEnd ();

【问题讨论】:

【参考方案1】:

CImg 存储非交错(或“平面”)通道,但 GL 期望相反。结果就是你所看到的。

您可以重新排列数据(或让 CImg 为您完成),但由于通道也倾向于以源格式交错,因此图像库仅在某个中间步骤之前对它们进行去交错以重新交错移交给 GL 效率低下。相反,我建议使用不同的方法来加载图像数据,这样它就可以直接使用。

有很多库可以做到这一点,尽管 BMP 是一种非常容易直接读取的格式。

【讨论】:

谢谢!有没有推荐的图片阅读库? 我想更新一下,以防其他人看到这个。我从lonesock.net/soil.html 下载了 SOIL,效果非常好。谢谢你的帮助,JasonD!【参考方案2】:

根据here,您也可以使用:

src.permute_axes("cxyz");

【讨论】:

以上是关于OpenGL纹理颜色分离的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenGL中反转纹理颜色

OpenGL-载入纹理

OpenGL纹理覆盖材质颜色

受彩色矩形影响的所有纹理颜色 - OpenGL

OpenGL中的调色板动画

opengl Framebuffer离屏到纹理,颜色错误