OpenGL纹理分色

时间:2013-07-05 11:04:07

标签: c++ opengl textures cimg

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

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

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

这就是我加载纹理的方法:

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 ();

2 个答案:

答案 0 :(得分:1)

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

您可以重新排列数据(或让CImg为您完成),但由于通道也倾向于以源格式交错,因此让图像库对它们进行解交织,仅用于某些中间步骤以重新交错交给GL将是低效的。我建议使用另一种加载图像数据的方法,以便它可以直接使用。

有许多库可以做到这一点,虽然BMP是一种非常容易直接阅读的格式。

答案 1 :(得分:0)

根据 here,您还可以使用:

src.permute_axes("cxyz");