ShaderLearning_问题解决1_GPU渲染管线
本文使用的环境windows10,unity2020,vs2019
待解决的问题有如下
- GPU渲染管线
- 两种投影的矩阵变换
- 法线变换
↑
图
G
P
U
渲
染
管
线
↑图 GPU渲染管线
↑图GPU渲染管线
GPU渲染管线
- vertex shader
必须要完成将Vetex从LocalSpace转换到ClipSpace,即改变了w值得视椎体中,然后由硬件做透视除法,获得NDC - Clipping(裁剪)
将NDC(正方体)外的裁剪。 - ScreenMapping(屏幕映射)
真正的降维打击,将每个primitives的x,y转换到ScreenCoordinates下。要注意DirectX和OpenGL屏幕坐标是上下颠倒的。
-----光栅化阶段开始,目标:计算每个图元覆盖那些像素,为这些像素计算它们的颜色。----- - TriangleSetup(三角形设置)
上一个阶段输出的是三角网格的顶点,而这个阶段是计算光栅化一个三角网格所需要的信息。计算三角网格表示数据的过程。 - ScanConversion(扫描变换),也叫TriangleTraversal(三角形遍历)
检查每个像素是否会被一个三角网格覆盖,如果被覆盖的话,就会生成一个Fragment,这个阶段也称为ScanConversion(扫描变换)。而这一步输出一个片元序列。**注意,一个Fragment !== pixel,Fragment是包含很多状态的集合,这些状态用于计算每个pixel的最终颜色。**这些状态包括(不止)屏幕坐标,深度信息,以及从GeometryStage中输出的顶点信息,如法线,纹理坐标等。
↑ 图 1 S c a n C o n v e r s i o n ↑图1 ScanConversion ↑图1ScanConversion - FragmentShader
给结算的输入是根据VertexShadr中输出的数据插值得到的,而他的输出是一个或者多个颜色值,图2显示了这样的过程。 这一个阶段可以完成很多重要渲染技术,但是最重要的技术之一就是纹理采样。为了方便在FragmentShader中进行纹理采样,我们会在VertexShader中输出每个顶点对应的纹理坐标,然后在光栅化阶段对三角网格的3个顶点对应的纹理坐标插值后得到其覆盖的Fragment的纹理坐标。FragmentShader的局限性在于仅可以影响单个Fragment,即不会影响邻居。特殊情况除外。
↑ 图 2 ↑图2 ↑图2 - Per-FragmentOperations(逐片元操作)
这一阶段有几个主要任务
1)决定每个片元的可见性。如进行深度测试,模板测试等。
2)如果通过测试,就需要把这个Fragment的颜色值和已经存储在颜色Buffer中的颜色进行合并或者说混合。