缺少使用glTexImage2D功能的绿色组件,为什么
Missing green color component using glTexImage2D function, why?
我正在编写我的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);
是非常错误的。
该函数的可接受值为:
- 1、2、4 和 8
它们表示您上传的图像数据的行对齐方式(以字节为单位)。对于每个组件的 8 位 RGBA 图像,通常需要 1 或 4(默认值)。
如果这真的有效,你在这里非常幸运。奇迹般地TexID
必须是 1(可能是因为您只加载了 1 个纹理)。一旦你加载了 3 个纹理,并且你最终得到一个 3 TexID
的值,你就会生成GL_INVALID_VALUE
并且你的程序根本无法工作。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 为什么 icc 为简单的主电源生成奇怪的组件?
- 为什么鼠标按下会阻止组件的重新绘制?
- 为什么QT的iOS组件会占用这么多磁盘空间?
- 为什么删除执行组件指针会导致"Program.exe has triggered a breakpoint"
- 为什么RGB组件被打印为符号,直到我添加+'0'-'0'?
- 缺少使用glTexImage2D功能的绿色组件,为什么
- 为什么WP8.1运行时组件在调用boost::filesystem::file_size()时抛出C++异常
- 为什么 wchar_t* 的第一个字符在传递给 WinRT 组件时会被擦除
- 为什么 CoCreateInstance 无法创建我的组件的实例?