0

顶点着色器:

#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 调用转换为 go GL 调用变得非常简单。

黄色背景上的红色方块

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

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

4

1 回答 1

0

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

适当的颜色模糊

于 2017-09-25T21:57:52.427 回答