OpenGL_定位三维到二维屏幕空间
我正在努力理解与转换3D图像相关的数学知识 指向二维屏幕位置。我知道这个过程包括从对象空间->世界空间->眼睛空间->剪辑空间->NDC空间->视口空间(屏幕上的最终2D位置)移动 顶点着色器:OpenGL_定位三维到二维屏幕空间,opengl,transformation,Opengl,Transformation,我正在努力理解与转换3D图像相关的数学知识 指向二维屏幕位置。我知道这个过程包括从对象空间->世界空间->眼睛空间->剪辑空间->NDC空间->视口空间(屏幕上的最终2D位置)移动 顶点着色器: GL_Position = Projection Matrix * view Matrix * model Matrix * vec(Position,1); => clip space. 碎片着色器: (Pseudo code) //assuming GL_position is rec
GL_Position = Projection Matrix * view Matrix * model Matrix * vec(Position,1); => clip space.
碎片着色器:
(Pseudo code)
//assuming GL_position is received as a vec4 input variable
vec2 Gl_position_ndc = (Gl_position.xy/Gl_position.w)/2+ .5;
(Gl_position_ndc -> GL_FragColor) after perspective division and converting to Normalized device Coordinate space
片段着色器中的这些自动透视分割和NDC转换是否会自动发生在从顶点着色器接收的
GL\u位置上,如上文在片段着色器中所述?是的,在顶点着色器中输出剪辑空间顶点后,按w
进行分割是自动的
它发生在光栅化之前,因此在片段着色器运行之前。现在,一个有趣的怪癖是在片段着色器的窗口空间(gl\u FragCoord
)中,w
=1/clip\u w。如果您尝试使用gl\u FragCoord
再次进行此分割,您实际上会撤消透视分割,事情会变得很奇怪
可能有一些原因需要除以1/clip.w,但这不是其中之一。碎片着色器中没有收到GL\u位置。您将获得gl\u FragCoord
(窗口空间)。更多细节请参见我的答案。这是应用了深度范围的视口定义的坐标空间,并且是其w
坐标的一个特殊特征。Thnx和on用于解释:)