所以我正在开发一款游戏,我需要绘制很多相同的对象.相同的形状,相同的尺寸,相同的颜色,只是不同的位置.
现在我的设置是这样的.
我有一些类Renderer
,想要在屏幕上绘制的对象可以调用static void addVertex(float x, float y, float z);
哪个将顶点存储到一个std::vector
.当每个人都完成绘图时static void draw();
,Renderer
调用所有东西都塞进VBO并绘制到屏幕上.
绘制看起来像这样:
void Renderer::draw() {
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _quadID);
glBufferSubDataARB(GL_QUADS, 0, _vertexBuffer.dataSize(), _vertexBuffer.toArray());
glColorPointer(4, GL_FLOAT, 0, _colorBuffer.toArray());
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, _vertexBuffer.toArray());
glDrawArrays(GL_QUADS, 0, (_vertexBuffer.size() / 3));
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
_vertexBuffer.clear();
_colorBuffer.clear();
}
Run Code Online (Sandbox Code Playgroud)
为了我的目的或多或少地管理的课程的地点_vertexBuffer
和地点._colorBuffer
template <class T> Buffer
std::vector<T>
通过这种设置,我可以在开始放慢速度之前在屏幕上获得大约300个内容.现在一切都是GL_QUAD.请记住,我对OpenGL有点新鲜,如果以上是令人尴尬的,我很抱歉.
我怎样才能改善这一点来解释相似的多边形?
Kos*_*Kos 21
在现代硬件上,实例化是最佳选择.
我们的想法是将几何体发送到GPU一次(一次绘制调用),指定要绘制的实例数(primCount
参数).
然后在顶点着色器中,您可以使用内部输入变量gl_InstanceID
来了解正在渲染的实例,然后对其使用适当的变换.这种方法意味着您应该在顶点着色器中为所有实例提供转换,例如在Uniform Buffer Object中.
编辑:该glVertexAttribDivisor
功能与实例化非常有用; 它基本上允许一些每顶点属性和一些每个实例属性.
归档时间: |
|
查看次数: |
9710 次 |
最近记录: |