我正在使用 OpenGL ES 作为绘图 api 为 iPhone 开发游戏。我在一个绘图元素中绘制了整个大世界。根据平截头体,对象是可见的。
我想知道对象的另一部分发生了什么,它被绘制了吗?会影响FPS吗?
对于场景的任何顶点,都必须运行顶点着色器,以便将它们的坐标从模型空间转换到剪辑空间。
之后,裁剪体积中不包含的图元(这意味着在裁剪空间中它们要么在屏幕之外,要么太远或太近)被裁剪,因此它们不会被进一步处理并且像素着色器不会不要为他们跑。
这对于 OpenGL 和 OpenGL ES 是一样的。您可以在OpenGL ES 规范(2.13 Primitive Clipping)或 OpenGL 规范(相同标题)中找到详细信息。
这意味着拥有大量几何体,其中大部分在截锥体之外,会稍微影响渲染时间,但比实际渲染所有几何体时要小得多。只需要进行逐顶点变换;不会为它们执行光栅化和每像素操作(片段着色器、实际写入帧缓冲区)。
这也意味着,如果您执行许多逐顶点操作和较少逐像素操作,那么为您的场景编写额外的可见性测试可能更重要。
OpenGL processes all primitives that you tell to draw. That's why you have to determine what to draw yourself. It is really hard problem, as the starting point read this.
几何管道将顶点坐标转换为窗口坐标;此时可以丢弃窗口外的多边形。但是处理了太多不必要的几何图形,从而影响了性能。
考虑使用某种截锥体剔除:将场景划分为更小的部分或切片,并在绘制之前评估切片是否完全位于视锥体之外,从而仅绘制可能位于截锥体内的切片。
即使使用简单的分区,差异也应该很明显。