【问题标题】:OpenGL Certain VertexBuffers Not RenderingOpenGL 某些 VertexBuffers 不渲染
【发布时间】:2018-06-03 13:57:42
【问题描述】:

我在构建基于体素的游戏时遇到了一个奇怪的错误。该视频最能说明正在发生的事情:https://youtu.be/CKhf7SbBKGU

我正在用 C# 用一个单独的库管理 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);
    }
}

vertexBuffer的Bind函数如下:

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.

任何帮助将不胜感激。

【问题讨论】:

  • 糟糕,习惯了。谢谢
  • 请添加MCVE。

标签: c# opengl voxel


【解决方案1】:

通过在初始化顶点缓冲区和每次 glDrawArrays 调用后解除绑定 VBO 和 VAO 来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2012-06-13
    • 2021-10-30
    • 2014-08-09
    相关资源
    最近更新 更多