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调用变得非常简单。
它表现得好像Texcoord
在片段着色器总是vec2(0, 0)
。如果我在片段着色器中更改该行以使用vec2(1, 1)
而不是Texcoord
,那么正方形会正确更改颜色。问题似乎是imgQuadData
没有被正确解析,顶点着色器得到S和T值为非0值,我不明白为什么。
我的位置属性如何成功读取,但我的texcoord属性始终等于0?