Unity Shader总结一——渲染流水线

文章目录

阅读前的注意事项

该系列文章为个人对书中知识学习总结,详细知识点请参考《Unity Shader入门精要》一书。

渲染流水线

渲染流水线在概念上大致可以分为三个阶段:应用阶段、几何阶段、光栅化阶段。为了更简单直观地来理解渲染流程,我制作了一个思维导图,图中所列为较重要的知识点。大白话总结请直接跳转文末总结(图里的基本就是我想讲的所有内容,下面对其简单的补充)

在这里插入图片描述

一、应用阶段

CPU是渲染流水线的起点,简单说一下其主要任务。

1.把数据加载到缓存中

哪些数据?所有渲染需要的数据都需要。主要有顶点的位置信息、顶点颜色、法线方向、纹理坐标等。

2.设置渲染状态

渲染状态定义了一个网格是怎样被渲染的:使用哪些顶点/片元着色器、材质、光源属性等。如果没有更改渲染状态,那么所有的网格都使用同一种渲染状态。打个比方:一个正方形网格,一个圆形网格,不更改状态的话会看起来材质都一样。

3.调用Draw Call

Draw Call是一个命令,发起方是CPU,接收方是GPU,指向一个需要被渲染的图元列表(渲染图元可以理解为点、线、面等)。给定Draw Call后,GPU就会开始根据渲染状态和数据计算并输出像素。

二、GPU流水线之几何阶段

几何阶段重点是顶点着色器。顶点着色器会将模型顶点的位置变换到齐次裁剪坐标空间下,接着通常再由硬件做透视除法后,最终得到归一化的设备坐标(NDC)。讲点人话:顶点位置会改变,可以模拟水面、布料这些效果。

三、GPU流水线之光栅化阶段

光栅化最重要的在于片元着色器和逐片元操作。片元着色器在图里有解释过,解释一下逐片元操作中的两个测试。《Unity Shader入门精要》中的流程图很直观

在这里插入图片描述

1.模板测试

其中参考值和模板值的比较是通过比较函数实现的,该函数由开发者指定,比如说小于时就舍弃这个片元,最后的修改操作也由开发者指定,例如舍弃时模板缓冲区保持不变,通过时模板缓冲区中对应位置加一。模板测试常用于限制渲染的区域、渲染阴影、轮廓渲染等。

2.深度测试

深度测试中一般把比较函数设置为大于等于缓冲区值就舍弃,因为我们通常只想显示离摄像机最近的物体。但是要注意的是,它跟模板测试不同,如果没有通过测试,就不能修改缓冲区,即使通过了,也可以指定它是否要覆盖掉缓冲区原本的值。

3.混合

为什么要合并?渲染过程是一个物体接着一个物体画到屏幕上,每个像素的颜色信息都被存储在颜色缓冲里。因此,当执行本次渲染时,颜色缓冲中往往已经有了上次渲染后的颜色结果。合并解决的问题是直接用本次渲染的颜色结果覆盖之前的还是做其他处理。对于半透明物体通常使用混合来让它看起来像是透明的。

在这里插入图片描述

注意

以上测试的顺序不唯一,如果测试在最后,那么结果可能会是:经过GPU好不容易计算出片元的颜色最后没有通过测试然后被舍弃。通常会考虑把测试放在片元着色器阶段之前,例如下图:

在这里插入图片描述

需要考虑的是,片元着色器中的操作是否会和提前测试冲突,如果冲突,就禁用提前测试。

四、屏幕显示

GPU通冲采用双重缓冲。对场景的渲染在后置缓冲中,前置缓冲区的内容是屏幕上显示的图像,一旦场景被渲染到了后置缓冲,就和前置交换,保证我们看到的图像是连续的。

五、总结

简单的讲,就是CPU准备好了顶点的相关信息,设置好渲染状态,告诉GPU要开始渲染了,GPU就会把这些顶点数据进行计算,输出的片元颜色会根据测试的结果来决定。

以上为我对《Unity Shader入门精要》基础篇中关于渲染流水线的总结。

原文地址:https://blog.csdn.net/memory_MM_forever/article/details/113570167

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...