2

我有绘画应用程序。鼠标事件坐标存储到 VertexArray。然后顶点数组被绘制到屏幕上。我的代码结构看起来像这样

// I get mouse event coordinates and store them to VertexArray
glPushMatrix();
//some new matrix settings
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glClear(GL_COLOR_BUFFER_BIT);
//now I draw first full size textured quad and later I draw vertexArray

glDrawArrays(.....);

//and now I draw second full size textured quad on top of first quad ant that what have been drawn from vertex array

glPopMatrix();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);


//immediately after that I draw FBO to screen:
glBindTexture(GL_TEXTURE_2D, fbTexture);
//Code for drawing textured quad
glBindTexture(GL_TEXTURE_2D, 0);

因此,每次注册新的鼠标事件坐标时,都会重新绘制所有内容。如果有超过 1000 个坐标,绘图会变得非常慢。我的问题可能在哪里?我认为 OpenGL 的 1000 个顶点并不多

4

1 回答 1

3

这不是顶点的数量;这就是你发送它们的方式。

首先,您从未定义过“非常慢”;很多时候人们会错误地认为从 400fps 到 300fps 的变化是“慢”的。它不是。它仅表示渲染时间从每帧 2.5 毫秒增加到 3.3 毫秒,变化不到一毫秒。不平凡,但可能不是在意的事情。

根据渲染时间而不是 FPS 来衡量性能总是很重要的。

话虽如此,您的主要问题是您一次绘制一个四边形。每个都来自一个单独的glDrawArrays命令。这不一定是件好事,尤其是当您在绘图命令之间更改状态时(例如绑定纹理等)。

如果您正在这样做,那么您需要找到避免这样做的方法。您想要做的是通过一次绘制调用渲染大量四边形。这意味着您必须对所有这些都使用相同的纹理。

这个问题的常见解决方案是制作一个更大的纹理,在不同的位置有多个图像。这通常称为“纹理图集”(详细信息请参见 Google)。每个四边形将具有其渲染的特定图像的纹理坐标。文本通常以这种方式绘制,其中每个字母(字形)都存储在相同的纹理中。

于 2012-08-20T12:32:05.353 回答