Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL_定位三维到二维屏幕空间_Opengl_Transformation - Fatal编程技术网

OpenGL_定位三维到二维屏幕空间

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

我正在努力理解与转换3D图像相关的数学知识 指向二维屏幕位置。我知道这个过程包括从对象空间->世界空间->眼睛空间->剪辑空间->NDC空间->视口空间(屏幕上的最终2D位置)移动

顶点着色器:

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用于解释:)