来自今天openGpu上的一个
帖子,以前自己对这块也是一知半解,导致了曾经在一次面试中在这个问题上卡壳(反正最后是没过。。哭。。。),这次看到正好最近看shaderX1里有介绍,所以就一鼓作气理解下吧!!
这是shaderX1里从vertex到pixelshader之前的pipeline
我具体解释下从vertex shader到pixel shader中间的部分:
face culling:根据triangle的两边向量叉乘得到的面法线方向来确定是顺时针还是逆时针,从而达到裁剪。
user clip planes:除了使用投影矩阵定义出的6个clipplane之外我们也可以额外自己定义对应的clipplane来剪裁。
frustum culling:视锥裁剪,不说了
homogeneous divide:这就是你说的除以什么w的地方,变换后的定点的xyz均会除以起w,以opengl的列为主(没记错的话。。反正就是matrix X vector的那个。。)透视投影矩阵的最后一行为0 0 1 0, 所以w值就是未经变换前的z值,所以根据透视投影的特性使得:-1=<x/w<=1, -1=<y/w<=1, -1=<z/w<=1。但是为何我们要这么做捏。。答案是我没看懂。。。我觉得纯粹是为了下一步。。下面说
viewport mapping:上一步后x,y,z现在已经是-1到1之间,上一步的齐次坐标系又被称为normalized device coordinates(NDC),那么我们要将这些顶点映射到屏幕空间就很简单了,x = NDC(x) * width + width / 2, y = NDC(y) * height + height/2。
呼。。如果有错的话还请指正哈!~~