gl.DrawElements, похоже, использует неверные индексы - PullRequest
0 голосов
/ 24 марта 2020

Рассмотрим следующий код:

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)

Но каким-то образом я получаю не куб (какой он должен быть), а все треугольники, происходящие из одной точки , Я проверил, что загруженные координаты вершин верны и что загружены правильные индексы, но каким-то образом я получаю искаженную модель на своем экране. Я храню вещи неправильно или нет вообще?

Triangles originating from a single point instead of a cube

Забавно, что при создании вершин и индексов вручную кажется, что он работает правильно. Поэтому я подумал, что в библиотеке gwob что-то не так. Но все данные оттуда, похоже, тоже верны.

1 Ответ

0 голосов
/ 25 марта 2020

Я нашел проблему. Это произошло потому, что библиотека gwobj задает индексы int, которые представляют собой 64-битные целые числа со знаком на моей платформе. С drawElements я указал gl.UNSIGNED_INT как тип, который является 32-разрядным целым числом без знака.

Преобразование массива индексов из int в uint32 сработало для меня:

    // Convert indices from int to uint32
    uint32Indices := make([]uint32, len(obj.Indices))
    for i := range(obj.Indices) {
        uint32Indices[i] = uint32(obj.Indices[i])
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...