2017-09-25 106 views
0

顶点着色器: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) 

在啦ptop我在1.30上运行是最新的GLSL语言版本,因此我无法升级到更新的版本。

imgQuadData保存绘制四角的角的X/Y位置以及该角的纹理坐标的S/T值应该是多少。我跟着this tutorial去了我所拥有的。虽然我正在努力工作,但go-gl库使得将C++ GL调用转换为GL调用变得非常简单。

red square on yellow background

它表现得好像Texcoord在片段着色器总是vec2(0, 0)。如果我在片段着色器中更改该行以使用vec2(1, 1)而不是Texcoord,那么正方形会正确更改颜色。问题似乎是imgQuadData没有被正确解析,顶点着色器得到S和T值为非0值,我不明白为什么。

我的位置属性如何成功读取,但我的texcoord属性始终等于0?

回答

0

事实证明,当指定gl.VertexAttribPointer中的最后一个参数时,应该使用gl.PtrOffset而不是gl.Ptr。我想,当gl.Ptr应该是8时,GL所看到的是一些大的地址(跳过前两个大小为4的浮动块)。

proper color blur