Vertex shader:OpenGL Vertex Attributs, la position fonctionne mais texcoord ne fonctionne pas?
#version 130
in vec2 position;
in vec2 texcoord;
out vec3 Color;
out vec2 Texcoord;
void main() {
Texcoord = texcoord;
gl_Position = vec4(position, 0, 1);
}
shader Fragment:
#version 130
in vec2 Texcoord;
uniform sampler2D texImage;
void main()
{
gl_FragColor = texture2D(texImage, Texcoord);
}
Où j'initialiser mon image:
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)
}
où je dessine à l'écran:
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)
Sur la la ptop je cours sur 1.30 est la dernière version de langue de GLSL soutenue ainsi je ne peux pas passer à une version plus récente.
imgQuadData
tient la position X/Y de l'endroit où dessiner un coin du quadruple ainsi que ce que les valeurs S/T pour les coordonnées de texture à ce coin devraient être. J'ai suivi this tutorial pour arriver à ce que j'ai. Bien que je travaille dans go, la bibliothèque de go-gl rend assez trivial pour convertir des appels GL de C++ pour passer des appels GL.
Il se comporte comme si Texcoord
dans le fragment shader est toujours vec2(0, 0)
. Si je change cette ligne dans le fragment shader pour utiliser vec2(1, 1)
au lieu de Texcoord
alors le carré change de couleur correctement. Le problème semble être que imgQuadData
n'est pas analysé correctement pour le vertex shader pour obtenir les valeurs S et T comme valeurs non-0 et je ne comprends pas pourquoi.
Comment mes attributs de position peuvent-ils être lus avec succès mais mes attributs texcoord sont toujours égaux à 0?