Shader 中 SubShader Tags Pass的理解

[UnityShader]多Pass处理透明度 在shader中想让物体出现透明的地方有两种思路。 把物体的渲染队列设置为transparent,此时的物体将会在所有不透明物体之后渲染,从而保证正确的渲染结果。然后我们使用Blend指令来把原颜色缓冲区的颜色乘上当前物体的a通道值,来进行混合。 使用Clip指令来对物体的像素进行裁剪。 Blend指令 每经过一个pass物体就会产生一个临时颜色缓冲区(假设当前为M,上一个颜色缓冲区为N)。 ... 阅读详情

Shader 中 SubShader Tags Pass的理解

SubShader
    {
        Tags
        {"RenderType" = "Opaque"}
        Pass
        {
            Tags
            {"LightMode" = "UniversalForward"}
            HLSLPROGRAM
            .......
            ENDHLSL
        }
        Pass
        {
            Tags
            { "LightMode" = "SRPDefaultUnlit"}
            HLSLPROGRAM
            .......
            ENDHLSL
         }
     }
FallBack "other"

SubShader

这里解释一下 SubShader Tags Pass的意思
一个Shader中可以有多个SubShader,但只执行第一个可执行的SubShader。

当你编写的shader需要在多种GPU下运行时,比如一个游戏同时在手机和电脑端运行,并且使用同一个shader,由于硬件本身的原因,第一个SubShader可能无法运行,可编写多个SubShader,让游戏去使用第二个或者第三个SubShader。

在所有SubShader的后面可定义 Fallback。基本上就是说,“如果没有任何子着色器能够在此硬件上运行,则尝试使用另一个着色器中的子着色器”。Fallback是最后一道防线,如果以上SubShader都不能用就只能用最低级的。不写就是不管了,会出现不可预测的渲染错误。

SubShader的状态设置

ShaderLab提供了一系列渲染状态的设定,这些指令可以设置显卡的各种状态,例如是否开启混合/深度测试等。

Cull     Cull Back|Front|Off
设置剔除模式,剔除背面|正面|关闭剔除,默认CullBack

ZTest    ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always
设置深度时使用的函数, 默认ZTest LEqual 小于或等于目标深度才能被渲染

ZWrite    ZWrite On|Off
开启和关闭深度写入, 默认ZWrite On

Blend    Blend SrcFactor DstFactor
开启并设置混合模式

SubShader的Tags

进入SubShader,第一个遇到的便是Tags,这个Tags定义了该subshader的渲染类型和队列位置。
“RenderType” = “Opaque”
“Queue”=“Geometry”

RenderType和Queue是SubShader最重要的两个tags,下面介绍一下。
此外还有标签
DisableBatching(顶点动画需要关闭和批,True/False)
ForceNoShadowCasting(强制不投射阴影,True/False)
IgnorceProjector(不受projector影响,True/False)
CanUseSpriteAtlas(用于精灵,True/False)
PreviewType(Unity中的预览类型,Plane/SkyBox)

RenderType

RenderType标签将着色器分类为若干预定义组,例如是一个不透明的着色器,或alpha测试的着色器等。被用于着色器替换,或者在某些情况下用于生成相机的深度纹理。

所有Unity 内置的着色器,都设置了一个RenderType类型,便于渲染时的着色器替换。

内置的RenderType类型有:

Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
Background: Skybox shaders. 天空盒着色器。
Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
Grass: terrain engine grass. 地形引擎中的草。
GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。

这些RenderType的类型名称实际上是一种约定,用来区别这个Shader要渲染的对象,当然你也可以改成自定义的名称,RenderType类型名称使用自定义的名称并不会对该Shader的使用和着色效果产生影响,甚至"RenderType"这个名称也可以修改。

指定RenderType的名称,主要是为了配合使用替代渲染的方法。
Unity可以运行时替换符合特定RenderType的Shader。主要通过Camera.RenderWithShader或者Camera.SetReplacementShader这两个接口来实现。

官方对于替代渲染的解释
https://docs.unity3d.com/Manual/SL-ShaderReplacement.html

两个接口的区别
RenderWithShader与SetReplacementShader的区别是RenderWithShader是 当前帧 用指定的Shader渲染,SetReplacementShader是替换后的 每一帧 用指定的Shader渲染。

当把代码SetReplacementShader换成RenderWithShader发现没什么效果,主要是因为RenderWithShader是当前帧用指定的Shader渲染,要与SetReplacementShader同样的效果,必须每帧都调用RenderWithShader。注意必须在OnGUI函数里调用。

Queue

Queue渲染队列,用来指定当前shader作用的对象的渲染顺序:
Unity中的几种内置的渲染队列,按照渲染顺序,从先到后进行排序,队列数越小的,越先渲染,队列数越大的,越后渲染。

  • Background(1000) 最早被渲染的物体的队列。
  • Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染,也是UnityShader中默认的渲染队列。
  • AlphaTest (2450) 有透明通道,需要进行Alpha Test的物体的队列,比在Geomerty中更有效。
  • Transparent(3000) 半透物体的渲染队列。一般是不写深度的物体,Alpha Blend等的在该队列渲染。
  • Overlay (4000) 最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的

Queue也可以参与运算得出一些特殊的位置:
“Queue”=“Transparent - 50”
Transparent对应的是3000,-50,渲染的位置就在2950。这种情况下,渲染的顺序在Transparent之后,而在Overlay之前

Pass

在一个SubShader可以有一个和多个pass,这多个pass会按照顺序逐个进行渲染。称为多pass。

比如:在处理光照和阴影时,灯光编写一个Pass,阴影编写一个Pass。

当GPU执行时,先计算灯光Pass输出颜色,然后再计算阴影Pass再输出颜色。

Pass的Tags

Pass的tags有LightMode和RequireOptions

Unity URP中的多Pass Shader和Planer shadow 一 .Unity移动端软阴影技术总结: https://blog.youkuaiyun.com/jxw167/article/details/82422891 二. 平面阴影的原理 https://zhuanlan.zhihu.com/p/42781261 https://zhuanlan.zhihu.com/p/31504088 王者荣耀游戏使用的就是该方法,已经有上线产品验证过的方法,这说明我们的游戏产品也可以使用,该技术叫平面投影阴影(Planar Projected Shadows)技术,由Jim B 阅读详情

相关推荐

unity shader入门精要_Unity Shader 入门(二):shader 基础

一、参考与说明(需要写在开始东西):1.1 Unity Shader 入门精要学习https://github.com/candycat1992/Unity_Shaders_Book/tree/unity_5_4​github.com1.2 写在开头,最近一直在关注渲染方面的文章,越看越发现,还是自下而上的学习路线比较好,了解背景原理,学习上层知识才更容易。但也确实发现,一头扎进去很容易迷茫,要学...

weixin_39989443的博客 611

UnityShader两个Pass的使用

基于上一篇UnityShader的透明度混合,改进的双Pass,可以让一些物体看起来更真实。 建议阅读下面的解释再回过来看代码 Shader "ShaderPath/DoublePassAlphaShader"//shader的选择路径 { Properties//该Shader可控的属性 { _DiffuseColor ("DiffuseColor",Color) = (1,1,1,1)...

weixin_40301728的博客 9405

Shader基本语法

Shader1. Shader名字 "ShaderLab Tutorials/TestShader"{ // ... }2014-0720-1707-17-42.png Shader的名字会直接决定shader在material里出现的路径2. SubShader(渲染方案) 一个Shader有多个SubShader。一个SubShader可理解为一个Shader的一个渲染方案。即S

c414978460的博客 4928

神临的 Unity shader 学习之多Pass渲染 (八)

最近又是一阵瞎忙,至于忙啥,忙工作,忙生活,然后现在想想有感觉是一瞬间的事情,好像只是过往云烟,吹之即散. 突然感觉做人真的应该学会留下点什么,哪怕是毫无意义的东西呢. 那么接着说,这次是学习多Pass的渲染,在shader的使用中会发现有时候只进行一次渲染是不够的,还要在它的基础上在加上一次或者多次才行,这就是多Pass的渲染的由来. 之前的shader使用都是基于surface shad

如同神临的博客 1万+

自建TVBox源管理系统:告别接口失效,打造稳定影视仓配置

在流媒体播放器的使用中,配置源是连接内容与用户的关键桥梁。无论是TVBox还是影视仓,其核心都依赖于稳定可用的接口地址,这一机制决定了资源获取的效率与可靠性。对于普通用户而言,公共接口常因生命周期短、内容不可控而频繁失效,造成“配置加载失败”或“首页无数据”等困扰。技术实践中,通过自建云端仓库并采用多仓txt聚合机制,可以实现接口地址的统一管理、自动检测与快速切换,从而大幅提升播放体验的稳定性。该方案无需高性能服务器,仅借助Gitee等平台即可落地,适用于家庭多设备场景及对长期稳定有要求的用户。从工程视角看

weixin_33768481的博客 312

Unity使用shader渲染时的操作顺序

确定Active SubShader SubShader列表 Unity在使用一个Shader Object之前,会创建一个SubShader列表,将该Shader Object中所有的SubShader加入该列表中。并且也会把fallback shader object的所有SubShader加入到这个列表中。 Active SubShader选择 当第一次使用这个Shader object渲染几何体时,或者当shader LOD value改变时,又或者当前激活的render pipleline改变时,

聚焦游戏和图形引擎开发技术 3661

Unity3D Shader 结构详解

Unity3D Shader 结构详解

2301_76984003的博客 1010

[Unity Shader] 【游戏开发】Unity Shader的结构2-深入理解 SubShader 的结构与应用

SubShader 是 Unity Shader 中的一个重要结构,它允许开发者根据硬件支持不同的显卡和平台实现不同的渲染路径。通过合理的使用 Tags、RenderSetup 和 Pass,开发者可以灵活控制渲染过程,实现高效的图形效果。UsePass和GrabPass等特殊 Pass 更是增强了 Shader 的灵活性,支持更加复杂和多样的渲染需求。

每日出拳老爷子的博客 307

Unity Shader的结构

Unity Shader是Unity为开发者提供的高层级的渲染抽象层。 ShaderLab是Unity提供的编写UnityShader的一种说明性语言。 UnityShader基础结构 Shader "ShaderName" { Properties{属性} subShader{//显卡A使用的子着色器} subShader{//显卡B使用的子着色器} Fallback "VertexLit" } UnityShader的结构 设置名字及材质面板位置: ...

qq_39419629的博客 1378

海康视觉通讯配置实战:TCP与Modbus协议深度解析

本文深度解析海康视觉系统与PLC通讯的实战配置,聚焦TCP与Modbus两大核心协议。详细阐述了TCP协议如何实现精准触发拍照,包括服务器端配置、数据转换(字符串与十六进制)的关键技巧与避坑指南;同时详解了Modbus协议用于读写PLC寄存器的配置方法、变量绑定及数据类型匹配。文章结合典型应用场景与高级调试技巧,旨在帮助工程师快速打通视觉系统与自动化设备间的数据通道。

m2n3o4p5的博客 826

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2221

Shader学习过程(一)

最近加入一家公司,开始让我学习做特效,我一脸懵逼,不会啊!浅薄的理解了一下粒子系统又开始学习Shader 的编写。在没了解之前还以为Shader会和C#一样,上手简单,但是到直到现在,还没理解Shader的逻辑。老天了,送我一个大佬吧! 经过最近的学习,整理了以下自己对Shader编写的认知,都比较浅薄,有错误希望大佬及时指出。 就写一下自己整理的Shader的框架吧。 名字(自己命名) 属性 Properties{} 2.1 属性名字由一个下划线开始,括号中的第一个参数,是属性显示在材质面板上的名

studentye的博客 748

通过ssh进行宇树g1机器人进行连接

原因:就是g1机器人输出接口损坏,无法连接外部显示器。前期准备:本文电脑是联想Y7000p(windows)2.进入页面后:3.出现是一个压缩包,解压后:4.安装时:要注意,需要在文件夹中找到这个文件目录,然后在此鼠标右键开启终端进行安装:接着按照提示next下去即可,可以自定义安装路径。

m0_72207463的博客 1284

ShaderLearning_2_UnityShader文件结构

ShaderLearning_2_UnityShader文件结构

qq_43369406的博客 2514

基于Lumerical FDTD的光栅耦合器宽带特性仿真与实验验证

本文详细介绍了基于Lumerical FDTD软件对光栅耦合器进行宽带特性仿真的完整流程。通过复现一个针对1310nm波段优化的经典光栅耦合器案例,文章从结构建模、光源设置、监视器布置到仿真运行与结果分析,逐步解析了如何准确模拟其耦合效率与带宽特性,并将仿真结果与实验数据进行对比验证,为硅光芯片的设计与优化提供了实用指导。

weixin_29294597的博客 512

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

Unity:Shader学习笔记(一)——Shader Lab基础语法

一、Shader Lab语法基础 (一) Shader"name"{//name shader名字//定义的一些属性,定义在这里的会在属性查看器里面显示; //子着色器列表,一个Shader必须至少有一个子着色器; Subshaders:{...} //如果子着色器显卡不支持,就会降级,即Fallback操作; [Fallback] } (二)Properties定义 name(“display name”,type)=值; name:指的是属性的名字,Unity中用下划线开始_Name; displ

cHeShirE_的博客 439

万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!

见到汇编就害怕?读完这篇,扫除汇编拦路虎!!(示例丰富,可做手册,随手查阅!)

车载系统攻城狮 1万+

shader概述

shader概述渲染管线shader分类GPU编程语言Shader Lab语法基础Properties定义SubShaderTagsPassRegularPass渲染设置UsePassGrabPassFallbackCategory分类 渲染管线 图形数据在GPU上经过运算处理,最后输出到屏幕的过程。 顶点处理图元装配光栅化像素处理缓存 shader即是给GPU执行的程序,在标准流水线中插入执行,...

xuan的博客 780

激光打标轴坐标计算分析

‌:基于坐标差的平方和开方运算,勾股定理将几何关系转化为代数计算,从而实现了从坐标到距离的精确转换‌12。直角三角形的应用从上图可以看到A,B,P三个点连起来就是一个直角三角形了。用勾股定理计算距离 C#有相关的方法直接传参数就可以了。很方便。

StevenChen的博客 311

2023年全国青少年信息素养大赛C++编程初中组决赛真题+答案解析

2023年全国青少年信息素养大赛C++编程初中组决赛真题+答案解析

伶俐角少儿编程 818

[Shader] Unity SubShader.

着色器的第二个组件是 SubShader。每个shader都由至少一个SubShader组成,以保证程序的完美加载。当有多个 SubShader 时,Unity 会对每个 SubShader 进行处理,并根据硬件特性从列表中的第一个到最后一个选择最合适的。为了理解这一点,我们假设着色器将在支持 Metal graph API (iOS) 的硬件上运行。为此,Unity 将运行第一个支持metal graph的 SubShader 并运行它。

unity尧明的博客 481

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SubShader和pass之间的区别和联系

SubShader是Shader的一个主要组成部分,通常用于定义一组渲染设置和效果。一个Shader可以包含多个SubShader,每个SubShader可以针对不同的渲染需求(如不透明、透明、阴影等)进行优化。Pass是SubShader中的一个组成部分,表示一次渲染的过程。每个Pass可以包含不同的渲染设置、着色器程序和效果。SubShader是Shader的一个主要组成部分,定义了不同的渲染路径和效果,适用于不同的渲染需求。Pass是SubShader。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 249

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

1.4:SubShader

目录什么是SubShaderSubShader包含了什么TagsCommonStatePassPass的种类Regular PassNameTagsRenderSetupUsePassGrabPass 在了解了渲染流水线之后,我们可以开始SubShader的学习了。 什么是SubShader 我们在1.1节中提到: SubShader:SubShader是Shader代码的核心部分。由于运行终端...

LiF 390

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Unity Shader多Pass机制详解:从原理到实战应用

在计算机图形学中,渲染管线是决定三维场景如何转换为二维图像的核心流程。其原理基于GPU对顶点和片元的逐层处理,通过深度测试、混合等操作实现复杂视觉效果。这一技术价值在于能够突破单次渲染的限制,实现透明物体、描边、多光源等高级渲染特性。在游戏开发与实时图形应用场景中,Unity引擎的ShaderLab框架通过SubShader与Pass的层级结构,为开发者提供了灵活的渲染控制能力。其中,多Pass机制允许同一物体被多次渲染,通过精心设计的渲染状态(如ZWrite、Blend、Cull)与帧缓冲交互,能够高效实

diankui6178的博客 480

shader基本语法、变量类型、shader的三种形式、subshader、fallback、Pass LOD、tags

新建一个shader,名为MyShader1内容如下:1、_MainTex 为变量名2、“Base (RGB)”表示在unity编辑面板中显示的名字,可以定义为中文3、2D 表示变量的类型4、white 表示初始值(默认值),默认为白色变量名建议下划线开头我们也来定义几个变量试试:_My2D ("Base (RGB)", 2D) = "white" {}_myfloat("浮点数",float)=...

宫文佳的博客 3620
上一篇: URP 下的 Shadedr 基础写法的总结
下一篇: Shader的属性和语义
王璨14715
博客等级 码龄11年 36粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值