0
点赞
收藏
分享

微信扫一扫

ShdaderLearning_问题解决1_GPU渲染管线

苦茶如歌 2022-04-08 阅读 51
unity

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中的颜色进行合并或者说混合。
举报

相关推荐

0 条评论