应用转换时,OpenGL是否会更改内存中的顶点?

时间:2015-09-26 02:18:33

标签: c++ opengl matrix transformation vertex

所以假设我的程序中有一个顶点(为了方便起见),(0,0,0)。就在原点。我使用简单的平移矩阵渲染单个帧,将顶点沿x轴向下移动两个单位。相应地渲染顶点。现在,VRAM中的相同顶点是否显示为
(2,0,0)?我已经读过每次渲染帧时在OpenGL中加载所有相应的标识矩阵很重要 - 我认为这是因为一切都会不断地移动,旋转等等,这意味着应用变换会修改实际数据,而不仅仅是屏幕上的外观。

2 个答案:

答案 0 :(得分:4)

严格来说,OpenGL只是一个API定义。只要符合规范,实现就可以做任何想做的事情。

话虽如此,您的问题的答案通常是:。很难想象如何将变换后的顶点存回到包含原始顶点的内存中是有意义的。

原始顶点位置被传递到顶点着色器,在顶点着色器中处理它们,其中可以包括变换。一旦它们退出顶点着色器,变换后的位置很可能存储在某种缓存或专用片上GPU内存中,直到它们被管道的后续步骤处理,其中包括透视划分,视口变换的应用,和光栅化。一旦完成这些顶点处理步骤,就可以丢弃变换后的顶点。它们可以在缓存中停留一段时间,以便在再次使用相同的原始顶点的情况下重新使用已处理的顶点。但它们并没有以任何持久的方式存储。

我解释它的方式,你听说不得不重置每帧的矩阵可能是一个误解。如果你想在下一帧中应用相同的矩阵,你根本不需要做任何事情。

他们最有可能谈论的是与传统OpenGL中的矩阵堆栈如何工作有关。修改当前矩阵的大多数调用(如glTranslatef()glRotatef()等)将逐步应用于当前矩阵。例如,如果调用glRotatef(),则旋转将与矩阵堆栈中已有的变换组合。结果是新指定的旋转首先应用于顶点,然后是矩阵堆栈中已有的变换。

基于此,如果要在每个帧的开头从头开始指定转换,则在开始指定新转换之前,将调用glLoadIdentity()来重置矩阵堆栈上的当前转换。或者您可以使用glPushMatrix() / glPopMatrix()来保存和恢复矩阵堆栈的所需状态。

如果您使用许多人所称的现代OpenGL",这意味着您不使用传统的固定管道功能,那么您不必担心任何问题。矩阵堆栈已经消失了,您可以计算自己的转换矩阵,并将它们传递给着色器代码。

答案 1 :(得分:1)

这是wiki上关于转换矩阵所涉及的数学的链接。 https://en.wikipedia.org/wiki/Transformation_matrix这将让你了解幕后的数学知识。另一种看待它的方法也是线性或向量代数。因此,渲染场景时在幕后发生的事情是所有顶点(像素)数据都从CPU发送到GPU进行光栅化并绘制到屏幕上。这是你的批处理或渲染调用,现在你还有一个帧效应,它每秒会发生x次,这将为你提供每秒帧数。因此,如果您在60 FPS处渲染,那么这些像素,顶点,三角形等将每秒绘制60次。当您将变换应用于此顶点集时,此处发生的是您有一个与模型视图投影矩阵相乘的变换矩阵。 MVP * T,如果这是您设置计算的方式,它将保存回现有的MVP矩阵。从OpenGL v1.0 Pure CPU调用到v4.5,您使用的OpenGL版本之间存在一些差异。据我所知,在版本3.2或3.3之后,我不记得你手头有哪个版本需要自己实现MVP,其中大于v1.5的版本首次引入着色器已经为你处理了。这是关于OpenGL https://www.opengl.org/的文档,在主页上将有一个主题,说明那里的文档,您可以选择OpenGL注册表或您想要查看的特定版本。从这里您可以阅读他们关于OpenGL API的文档,因为该网站涵盖了其API中可用的所有内容。因此,当您开始理解这个过程时,是的,这些顶点的实际坐标数据确实会发生变化,但是除非您使用时间因子递增静态类型变量,否则它不会持续变化,从而为您提供某种运动或动画模拟。如果仅应用单个变换,则这些像素,顶点,三角形等将根据您要应用的变换进行旋转,平移,缩放或剪切。我会告诉你,这些操作的顺序很重要,但我不会告诉你它们是哪个顺序,这将是你要阅读并弄清楚的。这很重要的原因是并非所有Matrix Multiplication都有一个有效的逆矩阵。身份用于诸如舍入误差和浮点精度之类的原因,因此如果您恰好在大约10秒钟内应用了1,000次转换,则不会出现天文错误。这应该足以指出您正确的方向,也可以作为OpenGL API如何工作的指南。