【发布时间】:2018-10-02 23:05:47
【问题描述】:
我正在使用 OpenGL 在体素游戏中渲染块块。每个chunk都有自己的顶点缓冲区,现有的render函数(简化)如下:
foreach (Chunk c in chunks)
{
glBindBuffer(BufferID.Array, c.handle);
if (c.dirty)
{
glBufferData(BufferID.Array, ... , BufferUsage.StaticDraw);
c.dirty = false;
}
// For position, normal, colour and UV
glEnableVertexAttribArray(...);
glVertexAttribPointer(...);
glUseProgram(shader.Handle);
glDrawArrays(DrawMode.TriangleStrip, 0, c.vertexBuffer.Length);
}
上面的代码可以运行,但是 glEnableVertexAttribArray、glVertexAttribPointer 和 glUseProgram 的 CPU 使用率很高。
我可以在循环开始之前调用这些函数,还是必须在每个 glBindBuffer 之后调用?
【问题讨论】:
-
这些函数背后的操作对于每个“块”是否需要不同?如果不是,那么为什么他们首先在循环中?如果是这样,那么这个问题就没有实际意义了。这些不是您以任意顺序组装的随机事物;这些函数中的每一个都做一些事情。因此,如果您知道这些函数的作用,那么您就有了问题的答案。
-
地图不断变化并被分割成块,这样我就不必在每次添加/删除/更改颜色时重新计算整个地图。这些函数(glEnableVertexAttribArray、glVertexAttribPointer 和 glUseProgram)背后的操作对于每个块都是相同的。
标签: c# opengl rendering render