这些天来,我正在阅读 Jason L. McKesson 的Learning Modern 3D Graphics Programming一书。基本上这是一本关于 OpenGL 3.3 的书,我现在在第 4 章,即关于正交视图和透视图。
在本章的最后,在“进一步研究”部分,他建议尝试一些事情,例如实现可变视点(他在相机空间的开头使用 (0, 0, 0) 以实现 semplicity)和任意透视平面地点。他说我需要将顶点的 X、Y 相机空间位置分别偏移 E_x 和 E_y。
我无法理解这段话,我应该如何使用仅修改 X、Y 偏移的可变眼点?
编辑:可能是这样的吗?
#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;
smooth out vec4 theColor;
uniform vec2 offset;
uniform vec2 E;
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 + vec4(E.x, E.y, 0.0, 0.0);
clipPos.z = cameraPos.z * (zNear + zFar) / (zNear - zFar);
clipPos.z += 2 * zNear * zFar / (zNear - zFar);
clipPos.w = cameraPos.z / (-E.z);
gl_Position = clipPos;
theColor = color;
}
Edit2:谢谢鲍里斯,你的照片帮了很多忙:) 特别是因为:
- 它清楚地说明了您之前所说的将 E 视为投影位置而不是眼点位置
- 它强调了项目平面的大小必须始终为 [-1, 1],这是我在书上阅读的段落,但没有完全理解它的含义
只是好奇,你为什么在减法之后提到乘法?是不是和书上说的一样,就是纵横比?因为从逻辑上讲,一切都迫使我做相反的事情,即首先翻译(-2)然后乘法(/5)。或者也许用“缩放”一词,这本书指的是重塑功能?