OpenGL (pyglet) 问题与 glTexImage2D(条纹纹理)



尝试使用 glTexImage2D() 将编程生成的置换贴图传递给顶点着色器,但由于某种原因,顶点似乎没有从上传的图像中获取统一的值,即使正在上传的数组中的每个值都相同。

python代码如下:

pix = []
for x in range(256):
    for y in range(128):
        pix.append(200)  # pix is just [200, 200, 200, ...]
pix = (GLuint * len(pix))(*pix)
disp_tex_id = GLuint(0)
glGenTextures(1, byref(disp_tex_id))
glActiveTexture(GL_TEXTURE1)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, disp_tex_id)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 256, 128, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pix)
shader.uniformi('disp_texture', 1)

相关的着色器代码在这里:

[vertex]
#version 110
#extension GL_EXT_gpu_shader4 : require
uniform sampler2D disp_texture;
varying vec4 dispColor;
void main() {
  gl_TexCoord[0] = gl_MultiTexCoord0;
  dispColor = texture2D(disp_texture, gl_TexCoord[0].st);
}
[fragment]
#version 110
varying vec4 dispColor;
void main() {
  gl_FragColor = dispColor;
}

我目前只是将球体上的位移显示为颜色值,但它不是均匀的灰色球体,而是条纹。

您遇到的条带化是由于 pix 数组中的数据大小不正确。

GL_LUMINANCE是单组件图像格式,此处组件的大小为 1 字节(GL_UNSIGNED_BYTE glTexImage2D (...) )。

实际上,您

只为每 4 个纹素中的一个赋予颜色,因为您正在创建一个 GLuint 数组(其中最高的 24 位均为 0),然后告诉 GL 您正在向它传递一个GLubyte数组。

要解决此问题,您需要更改:

pix = (GLuint * len(pix))(*pix)

对此:

pix = (GLubyte * len(pix))(*pix)

最新更新