无法获取要在 OpenGL ES2 中显示的 RGB 纹理

Cannot get RGB texture to display in OpenGL ES2

本文关键字:显示 RGB 纹理 ES2 OpenGL 获取      更新时间:2023-10-16

我可以使用以下代码获取 1 个纹理通道以显示:

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, image_width, image_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, image_grayscale);
point bbox[4] = {
{ -0.5, 0.5, 0, 0 },
{ 0.5, 0.5, 1, 0 },
{ -0.5, -0.5, 0, 1 },
{ 0.5, -0.5, 1, 1 },
};
glBufferData(GL_ARRAY_BUFFER, sizeof bbox, bbox, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glVertexAttribPointer(uniform_color, 4, GL_FLOAT, GL_FALSE, 0, bbox);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

但是当我更改为

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, button_image_width, button_image_height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_rgb);

我得到的是纯色而不是图像

下面是片段着色器

GLbyte fShaderStr[] =  
"varying vec2 texpos;                                                n"
"uniform sampler2D tex;                                              n"
"uniform vec4 color;                                                 n"
"void main()                                                         n"
"{                                                                   n"
"   gl_FragColor = vec4(1, 1, 1, texture2D(tex, texpos).a) * color;  n"
"}         

如何绘制 RGB 纹理?

当你这样做时

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, image_width, image_height,
0, GL_ALPHA, GL_UNSIGNED_BYTE, image_grayscale);

结果是纹理图像,只有 Alpha 通道。texture2D红色、绿色和蓝色通道返回 0。alpha 通道将相应的值返回到纹理坐标。
因此,在片段着色器中,采样器的 alpha 通道被读取:
(请参阅旋转(

texture2D(tex, texpos).a

但是当你这样做时

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, button_image_width, button_image_height,
0, >GL_RGB, GL_UNSIGNED_BYTE, image_rgb)

然后纹理图像有 3 个颜色通道,但所有纹素的 alpha 通道为 1。

您必须针对第二种情况调整片段着色器:

gl_FragColor = vec4(texture2D(tex, texpos).rgb, 1.0);

gl_FragColor = texture2D(tex, texpos);