我有绘画应用程序。鼠标事件坐标存储在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个顶点并不多
答案 0 :(得分:3)
这不是顶点的数量;这就是你发送它们的方式。
首先,你从未定义过“真的很慢”;人们经常会错误地认为从400fps到300fps的变化是“缓慢的”。不是。它仅表示渲染时间从每帧2.5ms增加到3.3ms,变化小于一毫秒。非平凡,但可能不是太关注的事情。
根据渲染时间衡量效果始终很重要,而不是FPS。
话虽这么说,你的主要问题是你一次只画一个四边形。每个来自单独的glDrawArrays
命令。如果你在绘图命令之间改变状态(比如绑定纹理等等),这不一定是好事,尤其是。
如果你这样做,那么你需要找到避免这样做的方法。你想要做的是通过一次绘制调用渲染很多四边形。这意味着你必须为所有这些使用相同的纹理。
此问题的常见解决方案是制作在不同位置具有多个图像的较大纹理。这通常被称为“纹理图集”(谷歌的细节)。每个四边形将具有其渲染的特定图像的纹理坐标。文本通常以这样的方式绘制,其中每个字母(字形)都存储在相同的纹理中。