Некоторые буферы вершин OpenGL не отображаются

Я столкнулся со странной ошибкой при создании игры на основе вокселей. Это видео лучше всего показывает, что происходит: https://youtu.be/CKhf7SbBKGU

Я создаю эту игру на С# с отдельной библиотекой, управляющей привязками OpenGL (OpenGLContext).

Карта разделена на фрагменты размером 32 x 32 x 32 вокселя, каждый из которых рисуется с помощью отдельных вызовов glDrawArrays (ctx.DrawArrays):

public void RenderMapNear(OpenGLContext ctx, List<Int3> nearPositions)
{
    mapShader.UseProgram();
    foreach (Int3 c in nearPositions)
    {
        m.data[c.X, c.Y, c.Z].vertexBuffer.Bind();
        ctx.DrawArrays(DrawMode.TriangleStrip, 0, m.data[c.X, c.Y, c.Z].vertexBuffer.Length);
    }
}

Функция Bind vertexBuffer выглядит следующим образом:

public void Bind()
{
    ctx.BindBuffer(BufferID.Array, _bufferHandle);
    ctx.BindVertexArray(_arrayHandle);

    if (_used > 0 && _dirty)
    {
        unsafe
        {
            // _data is an array of BlockVertex, which contains a Vector3 (3 floats) for the vertex position and a uint for the vertex colour
            fixed (BlockVertex* p = _data)
            {
                 ctx.BufferData(BufferID.Array, (IntPtr)(_used * Marshal.SizeOf(typeof(BlockVertex))), (IntPtr)p, BufferUsage.StaticDraw);
            }
        }
        _dirty = false;
    }
}

Однако на всей карте есть только два фрагмента, которые отказываются рисовать, с местоположением (0,0,4) и (1,0,4).

Информация OpenGL и GLSL выглядит следующим образом:

OpenGL Version: 4.5.13521 Compatibility Profile Context 24.20.11016.4
ShadingLanguageVersion: 4.50
OpenGL Renderer: Radeon RX 580 Series
OpenGL Vendor: ATI Technologies Inc.

Любая помощь будет принята с благодарностью.


person Community    schedule 03.06.2018    source источник
comment
Ой, привычка. Спасибо   -  person    schedule 03.06.2018
comment
Добавьте MCVE.   -  person derhass    schedule 03.06.2018


Ответы (1)


Это было решено путем отвязки VBO и VAO после инициализации буферов вершин и после каждого вызова glDrawArrays.

person Community    schedule 03.06.2018