Атрибуты вершин OpenGL, позиция работает, а texcoord - нет?
Вершинный шейдер:
#version 130
in vec2 position;
in vec2 texcoord;
out vec3 Color;
out vec2 Texcoord;
void main() {
Texcoord = texcoord;
gl_Position = vec4(position, 0, 1);
}
Фрагмент шейдера:
#version 130
in vec2 Texcoord;
uniform sampler2D texImage;
void main()
{
gl_FragColor = texture2D(texImage, Texcoord);
}
Где я инициализирую свое изображение:
func initImage() {
gl.UseProgram(texProgram)
var vao uint32
gl.GenVertexArrays(1, &vao)
gl.BindVertexArray(vao)
imgQuadData := []float32{
-.5, .5, 0, 0, // Top Left
.5, .5, 1, 0, // Top Right
.5, -.5, 1, 1, // Bottom Right
-.5, -.5, 0, 1, // Bottom Left
}
gl.GenBuffers(1, &imgQuadBuffer)
gl.BindBuffer(gl.ARRAY_BUFFER, imgQuadBuffer)
gl.BufferData(gl.ARRAY_BUFFER, len(imgQuadData)*4, gl.Ptr(imgQuadData), gl.STATIC_DRAW)
posAttrib = gl.GetAttribLocation(texProgram, gl.Str("position\x00"))
gl.EnableVertexAttribArray(uint32(posAttrib))
gl.VertexAttribPointer(uint32(posAttrib), 2, gl.FLOAT, false, 4*4, gl.Ptr(nil))
texAttrib = gl.GetAttribLocation(texProgram, gl.Str("texcoord\x00"))
gl.EnableVertexAttribArray(uint32(texAttrib))
ptr := 2 * 4
gl.VertexAttribPointer(uint32(texAttrib), 2, gl.FLOAT, false, 4*4, gl.Ptr(&ptr))
pixels := []float32{
1, 0, 0, 0, 1, 0, // Red / Green
0, 0, 1, 1, 1, 1, // Blue / White
}
gl.ActiveTexture(gl.TEXTURE0)
gl.GenTextures(1, &bcTexture)
gl.BindTexture(gl.TEXTURE_2D, bcTexture)
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGB, 2, 2, 0, gl.RGB, gl.FLOAT, gl.Ptr(&pixels[0]))
gl.Uniform1i(gl.GetUniformLocation(texProgram, gl.Str("texImage\x00")), 0)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
}
Где я рисую на экране:
gl.ClearColor(1, 1, 0, 1)
gl.Clear(gl.COLOR_BUFFER_BIT)
gl.UseProgram(texProgram)
gl.BindBuffer(gl.ARRAY_BUFFER, imgQuadBuffer)
gl.DrawArrays(gl.QUADS, 0, 4)
На ноутбуке, который я использую 1.30, поддерживается последняя версия языка GLSL, поэтому я не могу перейти на более новую версию.
imgQuadData
содержит положение X/Y, где нужно нарисовать угол квадрата, а также то, какими должны быть значения S/T для координат текстуры в этом углу. Я следовал этому уроку, чтобы получить то, что у меня есть. Хотя я работаю в go, библиотека go-gl делает довольно простым преобразование вызовов C++ GL в вызовы GL.
Ведет себя так, как будто Texcoord
во фрагменте шейдер всегда vec2(0, 0)
, Если я изменю эту строку в фрагментном шейдере, чтобы использовать vec2(1, 1)
вместо Texcoord
тогда квадрат правильно меняет цвет. Кажется, проблема в том, что imgQuadData
неправильно анализируется вершинным шейдером, чтобы получить значения S и T как отличные от 0, и я не понимаю, почему.
Как мои атрибуты позиции могут быть успешно прочитаны, но мои атрибуты texcoord всегда равны 0?
1 ответ
Оказывается, при указании последнего параметра в gl.VertexAttribPointer
ты должен использовать gl.PtrOffset
вместо gl.Ptr
, Я думаю, что GL видел с gl.Ptr
был большой адрес, когда он должен был быть 8 (пропустите первые 2 числа с плавающей точкой, которые имеют размер 4).