OpenGL,偏移和相机空间

当我在GLSL着色器中遇到这一行时,我正在阅读Arcsyntesis OpenGL教程的第4章 。

vec4 cameraPos = position + vec4(offset.x, offset.y, 0.0, 0.0); 

关于它,教程说

第一条语句简单地应用偏移量来获取顶点的相机空间位置。

我明白cameraPos是什么,但我不明白抵消是什么。 它被定义为一个统一的,它被这样的主程序传递给着色器:

 glUniform2f(offsetUniform, 1.5f, 0.5f); 

所以offset.x = 1.5f和offset.y = 0.5f。 但是在本教程的其余部分我没有看到这个偏移量,它的值对我来说似乎是随机的。 我知道从投影平面到眼睛的偏移总是-1,但是指的是Z的值.X和Y从哪里来? 他们是武断的价值吗? 他们是什么意思,他们做什么? 我明白了一切,但是在教程中我找不到所说的偏移量,我想知道是否有人可以向我解释。

编辑:我发布的最后一行可能被本教程的作者遗忘,可以在本书的源代码分发中find 。

这是第3章用来移动圆周运动顶点的偏移量。 在显示function中提供偏移均匀

 float fXOffset = 0.0f, fYOffset = 0.0f; ComputePositionOffsets(fXOffset, fYOffset); glUniform2f(offsetLocation, fXOffset, fYOffset); 

并且在着色器中位置被更新一致:

 vec4 totalOffset = vec4(offset.x, offset.y, 0.0, 0.0); gl_Position = position + totalOffset; 

第四章同样使用偏移量:

顶点着色器是我们所知道的事物的组合。 它将一个颜色传递到碎片阶段,但是它也需要一个vec2偏移量统一,以便为该位置的X和Y分量添加一个偏移量。

所以我认为这个教程意味着什么

第一条语句简单地应用偏移量来获取顶点的相机空间位置。

是顶点最初是在它们自己的模型空间(围绕原点)中定义的,并且通过在每个顶点上应用变换,我们得到一个新的位置。 这在第6章将会变得更加清晰,在第6章中 ,您将学习更多转换顶点(例如调整对象大小或旋转对象)的方法,以及实现这种转换的更好方法。 现在偏移量用于使示例更有趣,而不必向您介绍更高级的概念。

我明白cameraPos是什么,但我不明白抵消是什么。 它被定义为一个统一的,它被这样的主程序传递给着色器:

这是在教程的非透视版本中使用的相同的偏移量。 这是正交着色器:

 #version 330 layout(location = 0) in vec4 position; layout(location = 1) in vec4 color; smooth out vec4 theColor; uniform vec2 offset; void main() { gl_Position = position + vec4(offset.x, offset.y, 0.0, 0.0); theColor = color; } 

这是透视版本:

 #version 330 layout(location = 0) in vec4 position; layout(location = 1) in vec4 color; smooth out vec4 theColor; uniform vec2 offset; uniform float zNear; uniform float zFar; uniform float frustumScale; void main() { vec4 cameraPos = position + vec4(offset.x, offset.y, 0.0, 0.0); vec4 clipPos; clipPos.xy = cameraPos.xy * frustumScale; clipPos.z = cameraPos.z * (zNear + zFar) / (zNear - zFar); clipPos.z += 2 * zNear * zFar / (zNear - zFar); clipPos.w = -cameraPos.z; gl_Position = clipPos; theColor = color; } 

看看他们是如何以同样的方式开始的? position + offset 。 重要的是他们有什么不同。 因为我已经在教程3中介绍了抵消,所以我不觉得有必要在教程4中再次提到它。

不过,我加了一个说明,指出偏移量与以前的偏移值相同。