使用glTexImage2D函数缺少绿色组件,为什么?

时间:2014-11-20 20:20:16

标签: c++ c opengl glut

我正在编写我的3D引擎,没有OpenGL或DirectX。每个3D计算都是我自己的代码。当计算整个帧(2D颜色数组)时,我必须将它绘制到一个窗口,为此我使用GLUT和OpenGL。但是,我不使用OpenGL的3D功能。

所以我有一个2D颜色数组(实际上是一个1D无符号字符数组,用作2D数组),我必须以有效的方式用OpenGL / GLUT绘制它。

有两件重要的事情:

  • 表现(FPS值)
  • 轻松调整大小,自动缩放窗口内容

我写了3个可能的解决方案:

  • 2 for循环,每个像素都是带颜色的GL_QUADS。非常慢,但工作正常,窗口调整大小也很好。
  • glDrawPixels,不是最有效的,但我对FPS值感到满意。不幸的是,当我调整窗口大小时,内容不会自动缩放。我试着编写自己的调整大小回调函数,但它从未奏效。绿色不缺,没关系。
  • 最好的解决方案可能是从unsigned char数组中创建一个纹理,并且只绘制一个GL_QUADS。非常快,窗口调整大小工作良好,内容自动缩放。但是,这是我的问题,绿色成分缺失,我不知道为什么。

几个小时前,我使用了浮点数组,3个组件和0 ... 1个值。绿色丢失,所以我决定使用unsigned char数组,因为它更小。现在,我使用4个组件,但第4个组件始终未使用。值为0 ... 255。绿色仍然缺失。我的纹理代码:

GLuint TexID;
glGenTextures(1, &TexID);
glPixelStorei(GL_UNPACK_ALIGNMENT, TexID); // I tried PACK/UNPACK and ALIGNMENT/ROW_LENGTH, green is still missing
glTexImage2D(GL_TEXTURE_2D, 0, RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, a->output);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glBindTexture(GL_TEXTURE_2D, TexID);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
    // glTexCoord2f ... glVertex2f ... four times
glEnd();
glDisable(GL_TEXTURE_2D);
glDeleteTextures(1, &TexID);

如果我使用glDrawPixels,它工作正常,R,G和B组件在窗口上。但是当我使用glTexImage2D上面的代码时,绿色组件丢失了。我尝试了很多东西,但没有解决这个绿色问题。

我用3D引擎绘制彩色立方体,其中包含绿色成分(例如橙色,白色或绿色),它有不同的颜色,没有绿色成分。橙色是红色,绿色是黑色等。不含绿色成分的3D物体很好,例如红色立方体是红色,蓝色立方体是蓝色。

我认为,glTexImage2D的参数是错误的,我必须改变它们。

1 个答案:

答案 0 :(得分:1)

glPixelStorei(GL_UNPACK_ALIGNMENT, TexID); 非常 错误。

该函数的可接受值为:

  • 1 2 4 8

它们代表您上传的图像数据的行对齐(以字节为单位)。对于8位每分量RGBA图像,通常需要 1 4 (默认值)。

如果这确实有效,你在这里非常幸运。奇迹TexID必须 1 (可能是因为你只加载了1个纹理)。一旦你加载了3个纹理并且最终得到TexID 3 的值,你将生成GL_INVALID_VALUE并且你的程序根本无法工作