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日
    浏览(42)
  • Unity | Shader基础知识(什么是shader)

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

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

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

    2024年02月07日
    浏览(30)
  • 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日
    浏览(31)
  • 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日
    浏览(31)
  • 【Unity Shader】Unity前向渲染

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

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

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

    2024年02月09日
    浏览(41)
  • 2023-08-22 Unity Shader 开发入门2 —— Shader 开发介绍

    ​ 计算机图形程序接口(Graphics API)是一套可编程的开放标准,不论 2D 还是 3D 游戏都需要这部分的底层 API 支持。 ​ 它本质上是软件,并不是硬件,是前人提前写好的调用系统硬件(GPU)绘制图形的代码。可以简单理解成是显卡厂商定义的一系列的底层的进行图形操作的加

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

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

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

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

    2024年02月04日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包