Проблема OpenGL (pyglet) с glTexImage2D (полосатая текстура)

Попытка использовать glTexImage2D() для передачи программно сгенерированной карты смещения в вершинный шейдер, но по какой-то причине кажется, что вершины не получают однородных значений из загруженного изображения, хотя все значения в загружаемом массиве одинаковы.

Код питона выглядит следующим образом:

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;
}

В настоящее время я просто отображаю смещение на сфере как значение цвета, но вместо равномерно серой сферы она полосатая.


person Shane Moore    schedule 14.12.2014    source источник
comment
Кроме того, разве это не должно быть: pix = (GLubyte * len(pix))(*pix)?   -  person Andon M. Coleman    schedule 14.12.2014
comment
@ AndonM.Coleman писал в gl_Position, я просто не понял, что это имеет отношение к моей проблеме. Ошибка GLubyte была именно тем, что вызывало ошибку, так что спасибо!   -  person Shane Moore    schedule 15.12.2014


Ответы (1)


Это чередование, которое вы испытываете, связано с неправильным размером данных в вашем массиве pix.

GL_LUMINANCE — это однокомпонентный формат изображения, и размер вашего компонента здесь составляет 1 байт (GL_UNSIGNED_BYTE в glTexImage2D (...)).

Фактически вы задаете цвет только одному из каждых 4 ваших текселей, потому что вы создаете массив из GLuint (где старшие 24-битные значения равны 0), а затем сообщаете GL, что вы его передаете. массив GLubyte.

Чтобы решить эту проблему, вам нужно изменить:

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

Вместо этого:

pix = (GLubyte * len(pix))(*pix)
person Andon M. Coleman    schedule 14.12.2014