第一章_基础_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中处理
- 1.准备基本的场景物体数据
-
几何阶段:[GPU:GPU并行性较好]
- 1.顶点着色
- 视图变换,MVP矩阵运算
[model=>world=>view=>projection=>NDC] - 顶点着色,传入着色数据到下一阶段
- 视图变换,MVP矩阵运算
- 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.顶点着色
-
光栅化阶段:
- 1.三角形设置 Triangle Setup
- 计算图元边界信息
- 2.三角形遍历 Triangle Traversal
- 得到三角形的边界信息之后,遍历所有相关的像素,寻找被三角形网格覆盖的像素的过程叫做三角形遍历
- 3.抗锯齿
- SSAA 渲染到高分辨率的Buffer中后对Buffer进行采样
- MSAA 多重采样,在一个像素点中设置多个采样点。
采样点需要做覆盖测试和遮挡测试,如果测试都通过,则当前采样点的值取子采样点的值平均值
覆盖测试:是测试子采样点是否在三角形之内
遮挡测试:是子采样点的深度值跟DepthBuffer的作比较。 - FXAA/TXAA[后处理技术不在这个阶段]
- 1.三角形设置 Triangle Setup
-
逐片元操作:
对光栅化阶段得到的片元序列进行处理- 1.片元着色 Fragment Shader
- 线性插值计算三角形内的一个片元的颜色
- 2.颜色混合 Color Blending
- Alpha Test
透明度小于给定的Thersold则直接被Clip掉 - Depth Buffer Test
片元的深度值跟深度缓冲当中的深度值作比较,深度测试的方式是可以配置的 - Stencil Test
shader写入模板的mask值可以自己定义,跟模板测试的方式也同样可以配置
同一个像素点对应多个片元时,需要做透明度测试,深度测试,模板测试,通过测试才保留 - Blending
通过测试的片元,混合
- Alpha Test
- 3.输出到目标缓冲区
- FrameBuffer
- RenderTexture
- 1.片元着色 Fragment Shader
-
后处理:
- Bloom
- HDR=>LDR Tone Mapping
- FXAA
- Depth of view
- Edge detect
- Radius Blur
-
-
数学基础
- 1.向量运算
- 2.矩阵运算
- 3.MVP矩阵推导
- 4.傅里叶变换
- 5.其他
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 让容器管理更轻松!