我不能保证这种技术的效率,但这是我所做的,如果文本渲染会减慢我的程序,那我就完了。
我有一个专门用于存储网格的类,它由一些数据向量和一些GLuint
指针组成,用于存储上传到OpenGL的数据。我像这样上传数据到OpenGL:
glBindBuffer(GL_ARRAY_BUFFER, position);
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * data.position.size(), &data.position[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, normal);
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * data.normal.size(), &data.normal[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, uv);
glBufferData(GL_ARRAY_BUFFER, sizeof(vec2) * data.uv.size(), &data.uv[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * data.index.size(), &data.index[0], GL_DYNAMIC_DRAW);
然后,我按照以下方式进行绘制:
glEnableVertexAttribArray(positionBinding);
glBindBuffer(GL_ARRAY_BUFFER, position);
glVertexAttribPointer(positionBinding, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(normalBinding);
glBindBuffer(GL_ARRAY_BUFFER, normal);
glVertexAttribPointer(normalBinding, 3, GL_FLOAT, GL_TRUE, 0, NULL);
glEnableVertexAttribArray(uvBinding);
glBindBuffer(GL_ARRAY_BUFFER, uv);
glVertexAttribPointer(uvBinding, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, NULL);
glDisableVertexAttribArray(positionBinding);
glDisableVertexAttribArray(normalBinding);
glDisableVertexAttribArray(uvBinding);
这个设置是为了一个完整的3D引擎设计的,所以你可以缩小一些。基本上,我有四个缓冲区,位置、纹理坐标、法向量和索引。你可能只需要前两个,所以忽略其他的就可以了。
无论如何,每次我想要绘制一些文本,我使用我展示的第一个代码块上传我的数据,然后使用第二个代码块绘制它。这工作得相当不错,而且非常优雅。这是我用它来绘制文本的代码:
vbo(genTextMesh("some string")).draw(); //vbo is my mesh containing class
希望这能帮到你,如果你有任何问题,请随时提出。