OpenGL顶点属性,位置有效,但texcoord没有?

时间:2017-09-25 20:57:13

标签: shader vertex-attributes go-gl

顶点着色器:

#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值应该是什么。我跟着this tutorial来了解我所拥有的东西。虽然我正在使用go,但是go-gl库使得将C ++ GL调用转换为GL调用变得非常简单。

red square on yellow background

片段着色器中的Texcoord始终为vec2(0, 0)。如果我在片段着色器中更改该行以使用vec2(1, 1)而不是Texcoord,则方块会正确更改颜色。问题似乎是imgQuadData没有正确解析顶点着色器将S和T值作为非0值,我不明白为什么。

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

1 个答案:

答案 0 :(得分:0)

事实证明,在gl.VertexAttribPointer中指定最后一个参数时,您应该使用gl.PtrOffset而不是gl.Ptr。我猜GL用gl.Ptr看到的是一个大的地址,它应该是8(跳过大小为4的前2个浮点数)。

proper color blur