我确信这不只是一个答案,但游戏引擎是否实际上改变了内存中的向量,还是使用了gltransformations?因为一直推送和弹出矩阵似乎效率低下,但是如果你不断修改顶点,你就无法使用显示列表。所以我想知道它是如何完成的。感谢
答案 0 :(得分:3)
根据游戏引擎的不同,有很多方法可以做到这一点。
但最常见的方法可能是游戏引擎和显卡之间的责任分工,如下所示:
游戏引擎通过修改事件循环中的适当向量和矩阵来跟踪游戏中所有对象的位置,方向,速度等。游戏逻辑,物理,碰撞检测等应用于游戏对象的这种记忆模型。
当需要渲染对象时,OpenGL调用用于设置适当的渲染状态和变换矩阵 - 这可以基于每个对象,尽管经常进行优化以最小化状态变化的数量
然后进行OpenGL调用以使用glDrawElements绘制必要的网格(假设您使用的是顶点缓冲区对象)。这意味着各个网格顶点所需的所有变换都由图形硬件执行。由于可以通过单个OpenGL调用有效地绘制数百个单独的基元,因此这对于性能非常重要。
答案 1 :(得分:3)
取决于您的目标/对象。
通过设置矩阵来移动永不改变的对象(可以使用glRotatef / glTranslatef这样做)。它肯定比逐个顶点转换对象顶点更快。对象存储在DisplayList,VertexArray或VBO中。你可以每次使用glVertex *命令发送整个对象,但如果对象永远不会改变,则不需要这样做。
使用多个矩阵变换角色(蒙皮/装配),这些矩阵通常由顶点着色器处理。如果需要,你可以在CPU上进行,但除非你有一个非常先进的索具/皮肤引擎,否则没有必要。
在Videocard上无法完全执行的计算是在CPU上执行的。通常它是粒子系统,布料和程序几何,有时是阴影(使用模板阴影计算阴影体积)。像这样的对象通常至少部分地存储在存储器中,并且在CPU上执行变换。这严格依赖于硬件。根据视频卡和OpenGL版本的强大功能,可以在视频卡上执行部分或全部任务(不涉及CPU),但并非总是如此。例如,通常不可能在GPU上为程序几何构建阴影体积(即,拓扑在每个帧以及顶点位置上变化)。但是,有一些技巧可以避免它,并且情况可能会随着未来的版本而改变。
答案 2 :(得分:1)
将16位数矩阵写入堆栈是一项简单的操作,当然比修改不同顶点的负载要快得多。想想典型3D模型中的顶点数量,你会明白为什么。