原文链接

可编程渲染管线处理数据的流程可分为以下3大阶段

1. 应用阶段

这个阶段大概会由CPU处理4件事情。首先会对模型数据进行可见性判断。模型数据由顶点位置、法线方向、顶点颜色、纹理坐标等构成。然后会将模型数据加载到显存以提高读取速度。再为每个图元设置常数寄存器和渲染状态。最后为一个渲染图元列表调用DrawCall指令。

图元可以是点、线、三角形。

2. 几何阶段

这个阶段由GPU进行处理,会对每一个需要渲染的图元进行逐顶点、逐多边形处理,最根本的任务是将顶点的模型坐标转换到屏幕空间。

2.1 顶点着色器

顶点着色器的基本任务是将顶点转换到齐次裁剪空间,还可以进行的其他任务有:

  • 逐顶点着色操作,如逐顶点光照
  • 纹理计算
  • 逐顶点蒙皮
  • 逐顶点程序式动画(procedural animation)

2.1.1 投影变换

透视投影

在摄像机使用透视投影的时候,为了呈现出近大远小的透视收缩(perspective foreshortening)效果,需要对顶点进行透视投影变换。使用透视投影矩阵进行变换后,并没有进行裁剪,只是使得w值有了意义,为后面的裁剪做准备。

Unity透视投影矩阵(右乘)

会改变空间手系,从右手系变成了左手系,因为Unity的观察空间是右手系,NDC空间是左手系

观察空间中的顶点(x,y,z)透视投影到齐次裁剪空间后变为

透视投影齐次裁剪空间中坐标的w值为

正交投影

$正交投影远(近)裁剪平面高度=2 \cdot Size$

Unity正交投影矩阵(右乘)

会改变空间手系,从右手系变成了左手系,因为Unity的观察空间是右手系,NDC空间是左手系

观察空间种的顶点(x,y,z)正交投影到齐次裁剪空间后变为

正交投影齐次裁剪空间中坐标的w值为1

2.2 曲面细分着色器

用于细分图元

2.3 几何着色器

  • 几何着色器的功能是修改、剔除、创建图元,可以实现以下效果:
  • 阴影体积拉伸(shadow volume extrusion)
  • 渲染立方体贴图(cube map)的6个面
  • 在网格的轮廓边拉伸毛发的鳍(fur in)
  • 从点数据生成例子四边形
  • 动态镶嵌
  • 把线段分形细分(fractal subdivision)以模拟闪电、布料
  • 将数据传到管线开头重新进入管线
    • 用例:在顶点着色器内对头发样条的控制点进行物理模拟,在几何着色器内把样条镶嵌成线段,通过流输出将线段传到管线开头重新进入管线进行渲染

2.4 裁剪

裁剪的作用是将每个三角形在平截头体以外的部分切掉,把在平截头体以外的三角形剔除。

满足以下条件的顶点才会被保留下来:

2.5 齐次除法

所谓的齐次除法就是让x、y、z都除以w,这时就可以得到NDC空间中的坐标

上图右边都是OpenGL的NDC,DirectX的NDC也和上图右边类似,但z范围在[0,1]

2.6屏幕映射

视口空间:程序运行窗口构成的空间

矩阵中的X、Y是视口空间原点的屏幕坐标

3. 光栅化阶段

这个阶段由GPU来决定绘制哪些片元以及这些片元的颜色

片元=片段:三角形被栅格化后,其中的每一个小方块都是一个片元,可以看成是还不确定最终是否可以呈现到屏幕上的像素

3.1 三角形设置

这个阶段的任务是找出三角形边界所覆盖的像素

3.2 三角形遍历

这个阶段会对每个三角形进行栅格化,即找出每个三角形覆盖的像素区域。区域中的片元中信息(屏幕坐标、深度值、法线坐标、纹理坐标)由3个顶点数据进行插值(必要时会采用透视校正插值)得到

3.3 提前深度测试

如果用户没有在片元着色器中改变深度或自我丢弃(discard),显卡会自动开启该功能

3.4 片元着色器

用于执行逐像素着色操作,如纹理采样、多重纹理采样、逐像素光照

3.5 逐片元操作

3.5.1 模板测试

if 开启了模板测试 then
比较参考值(使用读取掩码)和模板缓冲区中的模板值(使用读取掩码)
if not 通过模板测试 then
舍弃该片元
end
根据已设置的渲染状态更新模板缓冲区中的值(使用写入掩码)
end

3.5.2 深度测试

if 开启了深度测试 then
比较该片元的深度值和深度缓冲区中的深度值
if 通过了深度测试 then
if 开启了深度写入 then
将深度值写入深度缓冲区
end
else
舍弃该片元
end
else
if 开启了深度写入 then
将深度值写入深度缓冲区
end
end

3.5.3 混合

if 开启了混合 then
用alpha混合函数(alpha blending function)将该片元的颜色值和颜色缓冲区中的颜色值进行混合
else
直接使用该片元的颜色值
end
更新颜色缓冲区中的颜色值

由于还要搬砖,没有办法一一回复私信把学习资料发给大家。我直接整理出来放在下面,觉得有帮助的话可以下载下来用于学习

链接:https://pan.baidu.com/s/1C-9TE9ES9xrySqW7PfpjyQ 提取码:cqmd

感谢各位人才的点赞收藏关注

微信搜「三年游戏人」收获一枚有情怀的游戏人,第一时间阅读最新内容,获取优质工作内推

可编程渲染管线(Scriptable Render Pipeline, SRP)的更多相关文章

  1. Scriptable Render Pipeline

    Scriptable Render Pipeline SRP的核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程. SRP API为原有的Unity构件提 ...

  2. Scriptable render pipeline unity

    https://www.youtube.com/watch?v=zbjkEQMEShM LWRP https://blogs.unity3d.com/cn/2018/02/21/the-lightwe ...

  3. Lightweight Render Pipeline

    (翻译) Lightweight Render Pipeline (LWRP),轻量级渲染管线,是一个Unity预制的Scriptable Render Pipeline (SRP).LWRP可以为移 ...

  4. 1.5:Unity Render Pipeline

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 这一节主要是为上一节中没有提到的一些概念作补充. 上一节提到了Unity中 ...

  5. 聊聊2018.2的Scriptable Build Pipeline以及构建Assetbundle

    0x00 前言 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了Scriptable Build Pipeline ...

  6. [Unity] Shader Graph Error 当前渲染管道与此主节点不兼容(The current render pipeline is not compatible with this master node)

    Shader Graph Error  : The current render pipeline is not compatible with this master node 问题产生环境: Un ...

  7. 1.3:Render Pipeline and GPU Pipeline

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 在学习SubShader之前,我们有必要对 Render Pipeline ...

  8. Real-Rime Rendering (1) - 渲染管线(Rendering Pipeline)

    提要 渲染管线是实时渲染中最重要的部分,它的最主要的任务就是在给定一个虚拟的场景,包括相机,object,灯光,纹理等等,生成一副2D的图像. 最基础的渲染管线如下图所示: 主要的阶段包括三个:App ...

  9. OpenGLES 2.0 可编程渲染管线

    OpenGL ES 2.0 与 OpenGL ES 1.x 渲染管线的最大区别就是: 顶点着色器.片元着色器是可编程的,替代了原来的固定管线的很多功能.

随机推荐

  1. 关于virtio_net网卡命名的小问题

    最近看了一个小问题,涉及到一致性网络设备命名(Consistent Network Device Naming),在此记录一下. 系统是 4.18.0-240.el8.x86_64,centos 8. ...

  2. 给网站添加pjax无刷新,换页音乐不中断

    自从博客加了悬浮音乐播放器后就一直在折腾换页音乐不中断的功能 在网上查找后发现想要实现换页音乐不中断的功能必须要为博客加pjax,于是又苦苦寻找并尝试了一番 最后发现网上实现pjax功能基本上是两种方 ...

  3. html + css 实现无需 js 的打字效果

    以前要达到类似在电脑上打字的效果,需要 js+html.今天我将介绍一种新方法.本文主要介绍纯 html+css 实现打字效果,有一定的参考价值,大家可以学习一下.提供所有代码,可以直接使用. 一.原 ...

  4. 【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)

    题意 出题人吃华 莱 士拉肚子了,心情不好,于是出了一道题面简单的难题. 共 T T T 组数据,对正整数 n n n 求 F ( n ) = ∑ i = 1 n μ 2 ( i ) i F(n)=\ ...

  5. 【JDBC】学习路径9-dbcp数据源的使用

    第一章:下载 要下载三个东西:commons pool.commons log.dbcp dbcp中有些东西是依赖于commons pool 和 commons log 的. 缺一不可,否则无法正确运 ...

  6. 【MySQL】从入门到掌握1-一些背景知识

    这个系列的文章带各位学习MySQL数据库. 不需要任何基础知识,便可以学习. 学习MySQL对学习Java的JDBC有很大的好处! 想要开发游戏服务器,那么学习MySQL也是必不可少的. 学习完本系列 ...

  7. 批量获取代理ip

    获取站大爷免费代理ip,然后打印出来,也可以把他存放在其他容器中 # coding:utf-8 import requests, re requests.packages.urllib3.disabl ...

  8. Karmada v1.3:更优雅 更精准 更高效

    摘要:最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服). 本文分享自华为云社区 ...

  9. .NET 6当中的Web API版本控制

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 为了了解ASP.NET Core Web API的版本控制,我们必须了解API中的 ...

  10. 阿里云SLB的http强制转https

    公司的要求:要求强制http转https 我的环境是: 域名<--->slb的ip<-->源服务器nginx 具体做法是: 第一步:证书放到slb的https上,通过443端口 ...