gpt4 book ai didi

objective-c - 如果顶点数组计数 > 1000,glDrawArrays 会变慢吗?

转载 作者:行者123 更新时间:2023-12-04 05:35:16 24 4
gpt4 key购买 nike

我有绘画应用程序。鼠标事件坐标存储到 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 个顶点并不多

最佳答案

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

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

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

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

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

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

关于objective-c - 如果顶点数组计数 > 1000,glDrawArrays 会变慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com