【MVP矩阵】裁剪空间、NDC空间、屏幕空间

裁剪空间概述

裁剪空间是一个顶点乘以MVP矩阵之后所在的空间Vertex Shader的输出就是在裁剪空间上(划重点)

NDC空间概述

接上面,由GPU自己做透视除法将顶点转到NDC空间

两者的转换

透视除法将Clip Space顶点的4个分量都除以w分量,就从Clip Space转换到了NDC了。

而NDC是一个长宽高取值范围为[-1,1]的立方体,超过这个范围的顶点,会被GPU剪裁。
【MVP矩阵】裁剪空间、NDC空间、屏幕空间_第1张图片
【MVP矩阵】裁剪空间、NDC空间、屏幕空间_第2张图片

屏幕空间

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

备注

【MVP矩阵】裁剪空间、NDC空间、屏幕空间_第3张图片

参考

https://sites.cs.ucsb.edu/~lingqi/teaching/games101.htm

你可能感兴趣的:(图形学,矩阵,线性代数)