假设我的程序中有一个顶点(为简化起见),(0, 0, 0)。就在原点。我使用简单的平移矩阵渲染单个帧,将顶点沿 x 轴向下移动两个单位。相应地渲染顶点。相同的顶点现在是否在 VRAM 中显示为
(2, 0, 0)?我已经读到,每次渲染帧时都在 OpenGL 中加载所有相应的身份矩阵很重要——我认为这是因为一切都会不断地移动、旋转等,越来越远,这意味着应用转换确实会修改实际数据,而不仅仅是屏幕上的外观。
最佳答案
严格来说,OpenGL只是一个API定义。只要符合规范,实现就可以为所欲为。
话虽如此,您问题的答案通常是:否。很难想象将转换后的顶点存储回还包含原始顶点的内存中是如何有意义的。
原始顶点位置被传递到顶点着色器,在那里它们被处理,其中可以包括变换。一旦它们退出顶点着色器,转换后的位置很可能会存储在某种缓存或专用的片上 GPU 内存中,直到它们被管道的后续步骤处理,包括透视分割、视口(viewport)变换的应用、和光栅化。一旦这些顶点处理步骤完成,变换后的顶点就可以被丢弃。它们可能会在缓存中停留更长的时间,以便在再次使用相同的原始顶点的情况下可能重用已处理的顶点。但它们不会以任何持久的方式存储。
按照我的解释,您听说必须为每一帧重置矩阵可能是一种误解。如果您想在下一帧中应用相同的矩阵,您根本不需要做任何事情。
他们最有可能谈论的是旧版 OpenGL 中矩阵堆栈的工作原理。大多数修改当前矩阵的调用,如 glTranslatef()
、glRotatef()
等,都以递增方式应用于当前矩阵。例如,如果您调用 glRotatef()
,旋转将与矩阵堆栈中已有的变换相结合。结果是您新指定的旋转首先应用于顶点,然后是已经在矩阵堆栈上的变换。
基于此,如果你想在每一帧开始时从头开始指定变换,你将调用 glLoadIdentity()
在你开始指定新的之前重置矩阵堆栈上的当前变换转换。或者您可以使用 glPushMatrix()
/glPopMatrix()
来保存和恢复矩阵堆栈的所需状态。
如果您使用许多人所说的“现代 OpenGL”,这意味着您不使用遗留的固定管道功能,则您不必担心这些。矩阵堆栈已永久消失,您可以计算自己的变换矩阵,并将它们传递给着色器代码。
关于c++ - 应用变换时,OpenGL 是否会更改内存中的顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792972/