Unity Shader相关的ZTest,ZWrite,Blend

这篇具有很好参考价值的文章主要介绍了Unity Shader相关的ZTest,ZWrite,Blend。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.引导


画家算法:
以一个画布为背景,从远到近画一个画面,先画最远的背景,也就是天空
然后假如是雪山,
然后再画上树木,树木在雪山上
然后山下是若干个居民的房屋,以及若干条道路
其次房屋门前可能有树木又当道部分房屋

其中某片区域一定会进行若干次上色,这样在Unity中是非常耗费性能的。

反画家算法:
所以Unity中出现反画家算法。
这个算法有两个辅助数组,以像素为单位,分别为深度缓冲数组和颜色缓冲数组假设为deep[][]和color[][],如果像素为1024*1024,那么这两个数组就是1024*1024大小
仍然拿上副画来看
假设某个像素点已经是最近的一个房子的某个点已经呈现出来的,它的坐标为(i,j),这个屏幕上的点对应的摄像机空间下的z值(实际上存储的是屏幕上该点对应裁剪坐标的z(是一个-1到0的值)的绝对值)就是deep[i][j] = d的值,然后这个房子该点的的颜色值就是color[i][j] = (r,g,b,a)的值。
当这个点的房子后面的树想呈现自己的信息时,它会先进行比较,发现这个点离摄像机距离d1 > d,那么Unity就不会渲染这个点的颜色,同样不会将这个点的颜色值写入color[i][j]中,那么在最终呈现出的区域内,后边被覆盖的区域就不会被重复上色了,这样就节省了性能

2.ZTest,深度检测


在渲染流程中,深度检测是放在逐片元操作(光栅化阶段后面的),但是如果光栅化完毕后,计算量(颜色的计算)已经产生,如果返现深度检测不通过,那么这些计算就白算了,因此在Unity中ZTest是在片元操作之前就进行了。
在Unity中ZTest的作用是这样的,初始时,deep的所有值为无穷远,color值为天空盒的颜色值。(其中假设红色和绿色的的渲染队列相同)现在在相机中间有一片255*255的红色正方形区域(中心为(0,0,2)),且它离摄像机的距离为2,离摄像机距离为3的地方有一个521*521(中心为(0,0,3))的绿色正方形。此时由于红色正方形离相机最近,那么deep[][](这片区域的深度值)就变成了2,且都呈现出红色,color[][](这片区域)就都是(r,0,0,a).然后渲染距离为3的正方形,再逐片元255*255区域的时候,Unity发现deep[][]这篇区域的值为2,是小于3要渲染的深度值的,此时直接放弃绿色这篇区域的渲染,但是在255到521区域会正常渲染绿色,且同时这篇区域的deep值为3,color值为绿色。最终呈现的颜色就是255内的区域呈现红色,255到521区域呈现绿色

3.ZWrite,深度写入


深度写入是在当深度检测通过后,可选的项目。
这里如果开启深度写入,deep[][]的值(更新)
如果关闭深度写入,拿上边的例子,假设关闭深度写入,红色在完成深度检测时,正常将自己的颜色写入,但是由于深度写入关闭了,此时deep这片区域的值仍然是无穷远,当绿色区域进行深度检测时仍然全部通过,此时真个521区域都会呈现绿色。

4.Blend,混合


这里混合的其实是现在的片元的颜色与color数组中的值,在2中的场景中,如果红色开启混合(默认),它会直接与天空盒的color值进行混合,而不是与绿色进行混合,因为在渲染红色时,绿色还没有渲染,缓存颜色仍然是天空盒的颜色,所以透明效果与天空盒颜色有关。
如果想呈现出红色透明出绿色,可以改变一下红色和绿色的渲染队列,也就是渲染顺序。在Unity中,可以在Tag中设置,它的值越小,越先被渲染。当我们将绿色的渲染队列值改为2000,红色改为2001时,这时就会先渲染绿色,然后渲染红色时,color缓存的时绿色的颜色值,就可以达到预期效果了

混合相关的常见操作:

Blend [_Src]  OP [_Drc]  其中_Src现在的因子数,_Drc则是缓存的color因子数,而OP则是左右两个值的操作
One因子值为1,Zero因子值为0
SrcAlpha现在计算的透明度值(也就是A通道),DstAlpha缓存color中的透明度值
SrcColor与DstColor则是颜色值(是RGB通道)
OneMinusSrcColor是1-现在计算的颜色值,OneMinusDstColor则是缓存的color值
OneMinusSrcAlpha是1-现在的透明度值,OneMinusDstAlpha是缓存的透明度值
整个值的计算则是_Src * 当前的RGBA值,_Drc * 缓存color中的RGBA值
其中OP默认是Add,也就是两边的值相加
其中还有Sub,两个相减(S-D)
RevSub,反过来相减(D-S)
Min,取最小的Min(S,D)
Max,取最大的Max(S,D)

渲染队列相关:


BackGround(1000~2000)最早被渲染的物体队列
Geometry(2000~2450)不透明物体
AlphaTest(3000~4000)半透明物体
Overlay(4000~∞)最后渲染,一般用于UI渲染
其中值越小,越先被渲染

深度测试相关:

Greater  大于缓冲区通过
Less     小于
GEqual   大于等于
LEqual     小于等于
Euqal     等于
NotEqual 不等于
Always     一直通过
Never     永远不通过
Off      关闭文章来源地址https://www.toymoban.com/news/detail-778453.html

到了这里,关于Unity Shader相关的ZTest,ZWrite,Blend的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity Shader】Unity阴影

    记录下在unity中如果想实现阴影,有哪些路子可以选择,目前看有两种 1.经典的shadowmap 2.planar projection 如果开启renderer组件的cast shadows为on,开启平行光的light组件的shadow type,那么就会在物体shader中寻找LightMode=ShadowCaster的Pass进行渲染 场景有两个物体,平面和球体,使用unity内

    2024年02月09日
    浏览(57)
  • Unity | Shader基础知识(什么是shader)

    Shader的中文名叫着色器。 着色器的作用: 这个世界是3D的,包括在Unity的场景中,我们建的球球,方块块之类的,都是3D的,但是,屏幕是2D的,把3D的东西,通过颜色的汇总,显示在2D的屏幕上。 想知道颜色是怎么合到一起的,我们就找个图片,把它拆开看。 因为世界上所有

    2024年02月15日
    浏览(61)
  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(41)
  • Unity中Shader裁剪空间推导(在Shader中实现)

    我们在上一篇文章中,进行了正交相机视图空间下转化到裁剪空间下的矩阵推导。 Unity中Shader裁剪空间推导(正交相机到裁剪空间的转化矩阵) 我们在这篇文章中,在Unity的Shader中实现一下。 OpenGL下: [ 2 w 0 0 0 0 2 h 0 0 0 0 2 n − f n + f n − f 0 0 0 1 ] begin{bmatrix} frac{2}{w} 0 0 0

    2024年02月03日
    浏览(40)
  • Unity中Shader观察空间推导(在Shader中实现)

    在上篇文章中,我们是实现了Shader中的观察空间推导。 Unity中Shader观察空间推导 我们在这篇文章中,根据上篇文章的推导,在Shader中实现观察空间矩阵的推导。 P view = [W view ] * P world P view = [V world ] -1 * P world P view = [V world ] T * P world 在属性面板定义测试使用到的 摄像机坐标

    2024年01月24日
    浏览(37)
  • 【Unity Shader】Unity前向渲染

    ForwardBase Pass(优先渲染),渲染一个逐像素平行光和所有的顶点/球面调和光,阴影只和平行光有关系,那阴影应该是这个Pass中实现的 ForwardAdd Pass(需要和Base配合使用,否则不生效),渲染剩余全部逐像素灯光 Unity会根据场景中各个光源的设置以及这些光源对物体的影响程

    2024年02月08日
    浏览(55)
  • Unity Shader:常用的C#与shader交互的方法

      俗话说久病成医,虽然不是专业技术美术,但代码写久了自然会积累一些常用的shader交互方法。零零散散的,总结如下:   有时候我们需要改变ui的一些属性,从而实现想要的效果。通常UGUI上有如下属性,而我们想要改变,就需要获取到Material这个属性:   这里拿Image来举

    2024年02月14日
    浏览(29)
  • Shader学习第七篇:几种Unity的Shader的例子

    下面是几种Shader的例子,从简单到复杂,一步一步了解 Shader 的编写机制。 顶点/片元着色器 Vertex/Fragment Shader,下面我们介绍的示例就是这个。 表面着色器 Surface Shader ,而这个底层Unity也是转成了顶点/片元着色器 固定函数着色器 Fixed Function Shader (已弃用) 在一些低端设备使

    2024年02月09日
    浏览(52)
  • Unity Shader 入门(零基础到敢上手敲Shader)

    目录  创建Shader 一.Standard Surface Shader 二.Unlit Shader 三.Image Effect Shader 四.Compute Shader 五.Ray Tracing Shader 着色器语言 Shader默认代码格式和一些常用API讲解 标准表面着色器,它是一种基于物理的着色系统,可以理解为 它是通过对物理现象的简单模拟,可以实现生活中各种物品的效

    2024年02月04日
    浏览(40)
  • 【Unity Shader】Shader中内置文件目录与自定义

    在unity shader中经常会使用一些 #include ,可以看这些文件包含了什么吗,当然可以,具体路径是在Unity安装目录下的 EditorDataCGIncludes 这里是在 EditorDataCGIncludes 目录下新建一个 mycginc 目录,里面新建一个 sbin.cginc 文件,这个文件命名好像还必须是 sbin.cginc 或者 sbin2.cginc ,

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包