一、渲染流水管线总结

《Unity Shader入门精要》读书笔记 之 一

渲染流程可以简单分为三个阶段:应用阶段 → 几何阶段 → 光栅化阶段。


应用阶段:
CPU执行:
CPU为GPU的绘制准备各种“原材料”,如:顶点信息(位置、法向量、UV、颜色等),纹理,材质等,并将这些“原材料”从硬盘经过内存最终拷贝到显存中,并调用DrawCall以通知GPU可以开始绘制。


几何阶段:
GPU执行,分为:
  • 顶点着色器(Vertex Shader)、
  • 曲面细分着色器(Tessellation Shader)、
  • 几何着色器(Geometry Shader)、
  • 裁剪(Clipping)、
  • 屏幕映射(Screen Mapping)

1、Vertex Shader: 顶点变换、顶点着色(高洛德着色)等(模型空间转换为齐次裁剪空间,注意转换后w的值,将用于进行透视除法)。

2、Tessellation Shader: 细分图元。

3、Geometry Shader: 逐图元着色操作,可以产生更多的图元:如在GLSL中通过Geometry Shader显示模型的法线(沿着法向量生成了新的顶点,并连成了line_strip)。
注意:经过了Geometry Shader后,顶点属性的位置会进行透视除法(position.xyz / position.w)而变成NDC坐标系中的位置即(-1, 1)。在Dx中Z的范围为(0, 1)。

4、Clipping:
  • 将不在摄像机视野范围内的顶点裁剪掉,如果切断了某个图元(部分顶点在视野内),则会生成新的顶点,而对于完全不在视野的图元,将直接丢弃。
  • 剔除三角形面片(正面、背面)。

5、Screen Mapping: 将NDC坐标系下的点转换为屏幕坐标系(转换为screen_width, screen_height范围内的坐标,本质上是缩放),注意Z这个时候不会做任何处理,但Z将表示为这个图元的深度,用作光栅化阶段使用。(注意openGL中屏幕的左下角为0,0, 而Dx中左上角为0,0,会导致图像上下翻转的问题)。


光栅化阶段:
GPU执行,主要目的是为了:
  • 计算每个图元覆盖了哪些像素(或屏幕上的像素点都被哪些图元所覆盖了)
  • 每个像素的颜色

光栅化阶段分为:
  • 三角形设置(Triangle Setup)、
  • 三角形遍历(Triangle Traversal)、
  • 片段着色器(Fragment Shader)( Pixel Shader:dx中称为像素着色器)、
  • 逐片元操作(Per-Fragment Operations)(Output-Merge:dx中称为输出合并)
1、Triangle Setup: 接到几何阶段传来的图元数据,注意这是在屏幕空间坐标系下的,这个阶段是为了下个阶段“三角形遍历”做准备。因此这个阶段需要计算出一个三角形所覆盖的区域

2、Triangle Traversal: 也叫作扫描变换,由上个阶段"三角形设置"获取了这个三角形所覆盖的区域,这个阶段将会对这个区域所有的像素进行扫描,用插值法计算每个像素的信息,这些信息所附着的对象称之为“片元(fragment)”。片元所携带的信息包含:插值后的屏幕坐标位置深度纹理坐标法向量等。为下一个阶段"片段着色器"做准备。注意:像素不等同与片元。这个阶段的输出是“(三角形所覆盖的)片元的序列”。

3、Fragment Shader: 这个阶段仍然不能将片元转换为像素。主要是为了计算并输出一个或多个颜色值(多个纹理)。
在这个阶段会进行很多渲染技术,比如最常用的:
  • 纹理采样,用上个阶段的片元信息(插值后的纹理坐标),结合bind的Texture,计算出这个片元的颜色值、或漫反射、高光反射率等。
  • 光照计算,根据片元信息(片元的位置、片元法向量等) 及 其他信息(光源信息、漫反射率、高光反射率、高光系数等)计算(Phong或Blinn-Phong)出这个片元的颜色值。
但是,这个片元对应的像素是否显示这个颜色值,需要在下个阶段"逐片元操作"中确定,因为没准这个片元压根就被挡住了而不会显示。

4、Per-Fragment Operations:
  • 决定片元可见性:
    • 模板测试
    • 深度测试
  • 与颜色缓冲区的颜色进行混合
只有通过了所有测试的片元,才能考虑混合,并最终计算为像素点颜色。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity提供了几种不同的渲染管线供开发者选择使用。其中包括: 1. Built-in Render Pipeline:默认渲染管线,是一个通用渲染管线,相对固定,仅可以有限度的进行控制。 2. Universal Render Pipeline (URP):可编程渲染管线,可以方便地进行自定义渲染,针对不同的平台进行优化。 3. High Definition Render Pipeline (HDRP):也是一种可编程渲染管线,可以在高端平台上创建技术领先的,高逼真度的图形渲染。 4. Scriptable Render Pipeline (SRP):可以基于可编程渲染管线API,创建自定义的渲染管线。你可以从头开始创建一个全新的渲染管线,也可以通过修改URP和HDRP来适应自己的项目。\[1\] 在Unity中,默认情况下,会自动选择适合游戏运行平台的图形API。如果需要自定义使用特定的图形API,可以取消自动勾选框,并从下拉选择框中选择合适的图形API。常见的图形API包括DirectX和OpenGL,而Unity提供的下拉选择框中的第一个选项是Direct3D11。\[2\] 渲染管线是将网格、纹理等信息从加载到展现在屏幕上的整个过程,也叫做渲染流水线。它是给定坐标系、镜头、物体、纹理、光源等信息后如何呈现为二维画面的流程渲染管线流水线的方式工作,各个环节互相干扰小,渲染效率也高了很多。\[3\] #### 引用[.reference_title] - *1* [Unity 渲染管线](https://blog.csdn.net/lrh3025/article/details/104274169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [第二十章 Unity 渲染管线](https://blog.csdn.net/konkon2012/article/details/130457514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Unity渲染管线基础](https://blog.csdn.net/xiaoyaoACi/article/details/119899933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值