Рассмотрим следующий код:
func makeVaoFromObj(obj *gwob.Obj) (uint32, uint32, uint32) {
// Create VAO
var vao uint32
gl.GenVertexArrays(1, &vao)
gl.BindVertexArray(vao)
// Store coordinates in VBO
var vbo uint32
gl.GenBuffers(1, &vbo)
gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
gl.BufferData(gl.ARRAY_BUFFER, 4 * len(obj.Coord), gl.Ptr(obj.Coord), gl.STATIC_DRAW)
// Vector
gl.VertexAttribPointer(0, 3, gl.FLOAT, false, int32(obj.StrideSize), gl.PtrOffset(obj.StrideOffsetPosition))
gl.EnableVertexAttribArray(0)
// U,V Texture coordinate
gl.VertexAttribPointer(1, 2, gl.FLOAT, false, int32(obj.StrideSize), gl.PtrOffset(obj.StrideOffsetTexture))
gl.EnableVertexAttribArray(1)
// Normals
gl.VertexAttribPointer(2, 3, gl.FLOAT, false, int32(obj.StrideSize), gl.PtrOffset(obj.StrideOffsetNormal))
gl.EnableVertexAttribArray(2)
// Store indices of the coordinates in EBO
var ebo uint32
gl.GenBuffers(1, &ebo)
gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo)
gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 4 * len(obj.Indices), gl.Ptr(obj.Indices), gl.STATIC_DRAW)
return vao, vbo, ebo
}
Это берет загруженную (блендерную) модель и создает для нее VAO. Я пытаюсь нарисовать это с помощью функции gl.DrawElements
следующим образом:
gl.Clear(gl.COLOR_BUFFER_BIT| gl.DEPTH_BUFFER_BIT)
gl.BindVertexArray(m.vao)
gl.UseProgram(program)
# assumes we have 36 indices loaded
gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, 0)
Но каким-то образом я получаю не куб (какой он должен быть), а все треугольники, происходящие из одной точки , Я проверил, что загруженные координаты вершин верны и что загружены правильные индексы, но каким-то образом я получаю искаженную модель на своем экране. Я храню вещи неправильно или нет вообще?
Забавно, что при создании вершин и индексов вручную кажется, что он работает правильно. Поэтому я подумал, что в библиотеке gwob что-то не так. Но все данные оттуда, похоже, тоже верны.