我正在编写我的3D引擎,没有OpenGL或DirectX。每个3D计算都是我自己的代码。当计算整个帧(2D颜色数组)时,我必须将它绘制到一个窗口,为此我使用GLUT和OpenGL。但是,我不使用OpenGL的3D功能。
所以我有一个2D颜色数组(实际上是一个1D无符号字符数组,用作2D数组),我必须以有效的方式用OpenGL / GLUT绘制它。
有两件重要的事情:
我写了3个可能的解决方案:
几个小时前,我使用了浮点数组,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的参数是错误的,我必须改变它们。
答案 0 :(得分:1)
glPixelStorei(GL_UNPACK_ALIGNMENT, TexID);
非常 错误。
它们代表您上传的图像数据的行对齐(以字节为单位)。对于8位每分量RGBA图像,通常需要 1 或 4 (默认值)。
如果这确实有效,你在这里非常幸运。奇迹TexID
必须 1 (可能是因为你只加载了1个纹理)。一旦你加载了3个纹理并且最终得到TexID
3 的值,你将生成GL_INVALID_VALUE
并且你的程序根本无法工作