在旧版OpenGL中,可以通过调用启用空间投影(对象随着距离的增大而变小)
glMatrixMode(GL_PROJECTION);
(至少就我记得这是启用此模式的调用而言)。
在OpenGL 3中-当不再使用这种慢速堆栈模式时-此功能不再起作用。
那么我如何在这里产生相同的空间效果?预期的方法是什么?
答案 0 :(得分:0)
您完全误解了glMatrixMode
的实际操作。老式的OpenGL固定功能流水线保留了一组矩阵,这些矩阵在绘制内容时被随意使用。两个最重要的矩阵是:
modelview 矩阵,用于描述从模型局部空间到视图空间的转换。视图空间仍然是一种抽象,但是可以理解为将世界转换为“相机”的坐标空间。照明计算发生在该空间中。
projection 矩阵,用于描述从视图空间到剪辑空间的转换。剪辑空间是到达设备坐标之前的一个中间阶段(涉及的重要细节很少,但是现在这些并不重要),这主要涉及应用均匀划分,即缩放剪辑坐标矢量由其w分量的倒数得出。
固定转换管道始终是
position_view := Modelview · position
do illumination calculations with position_view
position_clip := Projection · position_view
position_pre_ndc := position_clip · 1/position_clip.w
在旧版OpenGL中,模型视图和投影矩阵始终存在。 glMatrixMode
是一个选择器,现有的哪些矩阵要接受由矩阵操作函数完成的操作。这些功能之一是glFrustum
,它会生成并乘以一个透视矩阵,即一个将通过均匀划分产生透视效果的矩阵。
那么我如何在这里产生相同的空间效果?预期的方法是什么?
您将生成具有所需属性的透视矩阵,并将其用于将指定为模型局部位置的顶点属性转换到剪辑空间中,并将其提交到顶点着色器的gl_Position
输出中。通常的方法是将模型视图和投影矩阵作为制服传入。
要做的最裸露的GLSL顶点着色器
#version 330
uniform mat4 modelview;
uniform mat4 projection;
in vec4 pos;
void main(){
gl_Position = projection * modelview * pos;
}
关于生成投影矩阵:所有流行的计算机图形数学库都使您了解并具有相应的功能。