2017-09-25 3 views
0

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.

red square on yellow background

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?

Répondre

0

Il s'avère que lors de la spécification du dernier paramètre dans gl.VertexAttribPointer, vous devez utiliser gl.PtrOffset au lieu de gl.Ptr. Je suppose que ce que GL voyait avec gl.Ptr était une grosse adresse alors qu'elle aurait dû être 8 (passez les 2 premiers flotteurs de taille 4).

proper color blur