裁剪空间是一个顶点乘以MVP矩阵之后所在的空间
,Vertex Shader
的输出就是在裁剪空间
上(划重点)
接上面,由GPU自己做
透视除法将顶点转到NDC空间
透视除法将Clip Space顶点的4个分量都除以w分量,就从Clip Space转换到了NDC了。
而NDC是一个长宽高取值范围为[-1,1]的立方体,超过这个范围的顶点,会被GPU剪裁。
Vertex Shader的输出在Clip Space,那Fragment Shader
的输入在什么空间?不是NDC,而是屏幕空间
Screen Space。
我们前面说到Vertex Shader的输出在Clip Space,接着GPU会做透视除法变到NDC。这之后GPU还有一步,应用视口变换,转换到Window Space(Screen Space),输入给Fragment Shader:
坐标系转换流程:
(Vertex Shader MVP) => Clip Space => (透视除法(GPU自己完成)) => NDC => (视口变换(GPU自己完成)) => Window Space => (Fragment Shader)
前面提到了Fragment Shader的输入是经过视口变换后的坐标,Shader中访问的方法是:OpenGL中通过gl_FragCoord
来访问
此输入参数的xy分量表示Screen Space的坐标,z表示写入到深度缓冲中的值,那么w分量表示什么呢?OpenGL中gl_FragCoord来说,存的是1/w
https://sites.cs.ucsb.edu/~lingqi/teaching/games101.htm