缺少使用glTexImage2D功能的绿色组件,为什么

Missing green color component using glTexImage2D function, why?

本文关键字:组件 为什么 功能 glTexImage2D      更新时间:2023-10-16

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

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

有两件重要的事情:

  • 性能(FPS 值)
  • 易于调整大小,自动缩放窗口内容

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

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

几个小时前,我使用了浮点数组、3 个组件和 0...1 个值。绿色不见了,所以我决定使用无符号字符数组,因为它更小。现在,我使用了 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的参数是错误的,我必须更改它们。

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

该函数的可接受值为:

  • 1248

它们表示您上传的图像数据的行对齐方式(以字节为单位)。对于每个组件的 8 位 RGBA 图像,通常需要 14(默认值)。

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