第一章_基础_1.1渲染流水线

基础夯实

  • 渲染流水线

    • 渲染管线大致可以划分为:

      • 1.应用阶段:粗粒度剔除,进行渲染设置,准备基本数据,输出到几何阶段
      • 2.几何阶段:顶点着色器,曲面细分,几何着色器,顶点裁剪,屏幕映射
      • 3.光栅化阶段:三角形(点/线)设置,三角形(点/线)遍历,片元着色器
      • 4.逐片元操作:裁剪测试[Clip],透明度测试[Alpha],深度测试[Depth],模板测试[Stencil],混合[Blend]
      Blend[_SrcBlend][_DstBlend]
      ZWrite[_ZWrite]
      Cull[_Cull]
      
      • 5.后处理
    • 应用阶段:[CPU]

      • 1.准备基本的场景物体数据
        • 场景物体数据:
          物体变换矩阵:[MVP]
          网格顶点数据
          VertexBufferObject:[顶点数据UV坐标,切线,法线,模型空间坐标]
          glGenBuffers生成VBO,glBindBuffer绑定VBO
          VertexArrayObject:[绑定的VertexBufferObjectIndex,VertexBufferObject的attribute数组]
          glGenVertexArrays生成VAO,glBindVertexArray绑定VAO
          参考链接:https://blog.csdn.net/davidsu33/article/details/10060149
          贴图数据:[glTexImage2D读取贴图,glGenerateMipmap是否生成Mipmap,glTexParameteri贴图信息(Warp_S/T,MAG/MIN_FILTER),glBindTexture绑定贴图]
        • 光源信息:
          • 光源类型:DirectionLight,PointLight,SpotLight
          • 光源数据:Direction,Position,Range,Inner/OuterSpotAngle,Color,Intensity,IntensityMultiplier。
          • CasterShadow:
            是否需要阴影,判断该光源可见范围是否有投射阴影的物体
            阴影参数:LightIndex,ShadowIntensity,CascadeIndex[CSM Cascaded Shadow Maps],DepthOffset,
            NearPlaneOffset[Control NearPlane when rendering shadow map]
            ShadowType,RenderMode等解析光源如何渲染的参数
          • 逐光源绘制阴影贴图:
            设置Render参数[NearPlaneOffset,CascadeCount...]
            逐级联绘制:计算当前级联对应的ViewMatrix,ProjectionMatrix,ViewPort视口区域
        • 摄像机数据:
          Position,Direction,Near/FarClipPlane,Perspective/Orthographic,FieldOfView
        • 其他全局数据
          Global Illumination [GI]
      • 2.加速算法 粗粒度剔除
        • 可见光裁剪,点光和聚光都有衰减,聚光光椎体区域与摄像机的视锥体不想交则可以剔除掉,不参与渲染。
        • 可见场景物体裁剪:八叉树,BSP树,K—D树,BVH
      • 3.设置渲染状态,准备渲染参数
        • 视口比例[glViewPort]
        • 绘制设置
          • 使用的shader,GPU instance,不同对象使用不同的合批方式[静态物体,动态物体]
        • 绘制顺序
          • 相对摄像机距离的顺序
          • RenderQueue
          • 使用UGUI时依据UICanvas的一些属性决定Render顺序
        • 渲染目标
          • [RenderTexture]
          • [FrameBuffer]
        • 渲染模式
          • 前向渲染
          • 延迟渲染
      • 4.调用DrawCall[glDrawElement]输出渲染图元到显存当中
        • 按照渲染设置和渲染模式把顶点数据和其他数据[矩阵/贴图/光照信息等]发送到GPU中处理
    • 几何阶段:[GPU:GPU并行性较好]

      • 1.顶点着色
        • 视图变换,MVP矩阵运算
          [model=>world=>view=>projection=>NDC]
        • 顶点着色,传入着色数据到下一阶段
      • 2.可选顶点处理
        • 曲面细分 Tessellation Shade: Vertex->ConstantHS+hull->domain->Fragment
        • 几何着色器 Geometry Shader:从输入的图元生成更多的图元
      • 3.投影 Projection
        • 正交 Orthgraphic projection
        • 透视 Perspective projection
      • 4.裁剪 Clipping
        • CVV 视锥体剔除
        • 正面或背面剔除
          [ps:opengl:x,y∈[-1,1],z∈[0,1];D3D:x,y,z∈[-1,1];]
      • 5.屏幕映射[NDC=>Screen]
        • 从连续到离散
          • Opengl的屏幕空间原点在左下方,D3D在左上方
    • 光栅化阶段:

      • 1.三角形设置 Triangle Setup
        • 计算图元边界信息
      • 2.三角形遍历 Triangle Traversal
        • 得到三角形的边界信息之后,遍历所有相关的像素,寻找被三角形网格覆盖的像素的过程叫做三角形遍历
      • 3.抗锯齿
        • SSAA 渲染到高分辨率的Buffer中后对Buffer进行采样
        • MSAA 多重采样,在一个像素点中设置多个采样点。
          采样点需要做覆盖测试和遮挡测试,如果测试都通过,则当前采样点的值取子采样点的值平均值
          覆盖测试:是测试子采样点是否在三角形之内
          遮挡测试:是子采样点的深度值跟DepthBuffer的作比较。
        • FXAA/TXAA[后处理技术不在这个阶段]
    • 逐片元操作:
      对光栅化阶段得到的片元序列进行处理

      • 1.片元着色 Fragment Shader
        • 线性插值计算三角形内的一个片元的颜色
      • 2.颜色混合 Color Blending
        • Alpha Test
          透明度小于给定的Thersold则直接被Clip掉
        • Depth Buffer Test
          片元的深度值跟深度缓冲当中的深度值作比较,深度测试的方式是可以配置的
        • Stencil Test
          shader写入模板的mask值可以自己定义,跟模板测试的方式也同样可以配置
          同一个像素点对应多个片元时,需要做透明度测试,深度测试,模板测试,通过测试才保留
        • Blending
          通过测试的片元,混合
      • 3.输出到目标缓冲区
        • FrameBuffer
        • RenderTexture
    • 后处理:

      • Bloom
      • HDR=>LDR Tone Mapping
      • FXAA
      • Depth of view
      • Edge detect
      • Radius Blur
  • 数学基础

    • 1.向量运算
    • 2.矩阵运算
    • 3.MVP矩阵推导
    • 4.傅里叶变换
    • 5.其他
posted @   凶恶的真实  阅读(196)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示