【发布时间】:2021-09-09 03:04:57
【问题描述】:
我正在制作一个小型 2D 引擎/游戏来学习 OpenGL(使用 OpenGL 330 Core),并且我正在尝试抽象出大多数 OpenGL 函数调用。
现在,我正试图弄清楚如何最好地处理文本渲染。我有一个字体图集,但我不确定如何处理文本的顶点。现在,我有一个 Renderer 类,它有一个 drawText(const Text& text) 方法,如下所示:
const std::vector<Text::Vertex>& vertices = text.getVertices();
glBufferData(GL_ARRAY_BUFFER, sizeof(Text::Vertex) * vertices.size(), vertices.data(), GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
我不确定这是否好,因为我正在为每个绘制的 Text 对象重新定义 VBO 的内容,并且每帧可能绘制多个 Text 对象。
注意:我没有使用 Text 进行批量渲染,因为:
- 这是一款简单的 2D 游戏,所以我宁愿等绘制调用成为实际问题后再优化它们
-
Text可以通过多种方式更新(即在工具提示旁边可见、悬停时更改颜色等),这需要我修改包含批处理顶点数据的单个 VBO
所以,既然我的 Text 对象在转换时是如此不稳定,我是否应该只为每个实例设置一个 VBO,在适当的时候进行修改,并在我在屏幕上绘制文本时绑定一个新的 VBO?
我的理解是,如果这样做,每次绑定新 VBO 时都需要手动调用 glVertexAttribPointer() 方法,因为绑定新 VBO 本身不会影响绘图调用。
或者我应该只拥有一个 VBO 并不断更新其值?
我不确定哪种方法是首选方法,并且我了解到重新绑定 VBO 可能会很昂贵,但我不确定覆盖它们的数据是否更快/更慢。另外,查看 SFML 的源代码以获取一个真实世界的示例,他们似乎每次绘制某些东西时都会设置新顶点(尽管他们的情况可能与我的不同,因为他们不使用 OpenGL 3+ 并且不做任何批处理渲染)。
【问题讨论】: