gpt4 book ai didi

c++ - 使用 glTexImage2D 函数缺少绿色分量,为什么?

转载 作者:行者123 更新时间:2023-11-28 06:34:03 25 4
gpt4 key购买 nike

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

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

有两点很重要:

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

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

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

几个小时前,我使用了 float 组、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 的参数不对,我必须更改它们。

最佳答案

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

该函数可接受的值为:

  • 1248

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

如果这真的有效,那你就太幸运了。奇迹般地 TexID 必须是 1(可能是因为您只加载了 1 个纹理)。一旦加载了 3 个纹理,并且 TexID 的值为 3,您将生成 GL_INVALID_VALUE 并且您的程序的根本不会工作。

关于c++ - 使用 glTexImage2D 函数缺少绿色分量,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com