我在构建基于体素的游戏时遇到了一个奇怪的错误。此视频最能说明正在发生的事情: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.
非常感谢任何帮助。
答案 0 :(得分:0)
这是通过在初始化顶点缓冲区之后和每次调用glDrawArrays之后解除VBO和VAO的绑定来解决的。