我正在尝试使用元素缓冲区对象在 Golang 中使用 OpenGL 的 go-gl 绑定(bind)来渲染一个简单的矩形。主要代码如下:
package main
import (
"gogame/shaders"
"runtime"
"github.com/go-gl/gl/v4.1-core/gl"
"github.com/go-gl/glfw/v3.2/glfw"
log "github.com/sirupsen/logrus"
)
var vertices = []float32{
-0.5, -0.5, 0.0,
-0.5, 0.5, 0.0,
0.5, 0.5, 0.0,
0.5, -0.5, 0.0,
}
var rectangle = []uint{
0, 1, 2,
2, 3, 0,
}
func init() {
runtime.LockOSThread()
}
func main() {
window := initGLFW()
defer glfw.Terminate()
program := initOpenGL()
var vertexBuffer uint32
var elementBuffer uint32
var vertexArray uint32
gl.GenBuffers(1, &vertexBuffer)
gl.GenBuffers(1, &elementBuffer)
gl.GenVertexArrays(1, &vertexArray)
gl.BindVertexArray(vertexArray)
gl.BindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
gl.BufferData(gl.ARRAY_BUFFER, 4*len(vertices), gl.Ptr(vertices), gl.STATIC_DRAW)
gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer)
gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 4*len(rectangle), gl.Ptr(rectangle), gl.STATIC_DRAW)
gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil)
gl.EnableVertexAttribArray(0)
gl.BindBuffer(gl.ARRAY_BUFFER, 0)
gl.BindVertexArray(0)
if err := gl.GetError(); err != 0 {
log.Error(err)
}
for !window.ShouldClose() {
gl.ClearColor(0.5, 0.5, 0.5, 0.5)
gl.Clear(gl.COLOR_BUFFER_BIT)
gl.Clear(gl.DEPTH_BUFFER_BIT)
gl.UseProgram(program)
gl.BindVertexArray(vertexArray)
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, gl.PtrOffset(0))
//gl.DrawArrays(gl.TRIANGLES, 0, 3)
glfw.PollEvents()
window.SwapBuffers()
if err := gl.GetError(); err != 0 {
log.Error(err)
}
}
glfw.Terminate()
}
理论上,这应该绘制一个矩形。然而,这是我在线框模式下运行它时得到的结果:
我省略的代码只是编译非常基本的着色器并初始化 GLFW 和 OpenGL。
最佳答案
您可能使用的是 64 位操作系统。在 64 位操作系统中,数据类型 uint 的大小为 64 位。 请参阅Go language data types或A Tour of GO - Basic types .
矩形的坐标指定如下:
1: -0.5, 0.5 2: 0.5, 0.5
x-----------x
| |
| |
| |
| |
x-----------x
0: -0.5, -0.5 3: 0.5, -0.5
索引数组是 64 位整数值的数组:
var rectangle = []uint{
0, 1, 2,
2, 3, 0,
}
但在绘制几何图形时,它被视为 32 位整数数组 (gl.UNSIGNED_INT
):
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, gl.PtrOffset(0))
这会导致数组的每个索引被分成 2 个索引,每个索引 32 位,其中第一个值是数组的索引,第二个值为 0:
[0, 0, 1, 0, 2, 0, 2, 0, 3, 0 0, 0]
所以前 2 个三角形(前 6 个索引)是
0 - 0 - 1
0 - 2 - 0
在图像中,您可以看到这 2 个三角形,它们缩小为 2 条线,因为每个三角形的 2 个点相等。
使用数据类型uint32
解决问题:
var rectangle = []uint32{
0, 1, 2,
2, 3, 0,
}
关于Golang OpenGL元素缓冲对象无法正确渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51582064/