Unity中Shader的烘培分支的判断

news2024/11/24 17:59:05

文章目录

  • 前言
  • 一、上一篇文章中所需要的 lightmapUV 只有在烘焙时才会使用
    • 1、查看帮助文档后,Unity中判断烘培是否开启,使用的是LIGHTMAP_ON
    • 2、我们在 appdata 和 v2f 中,定义第二套UV


前言

Unity中Shader的烘培分支的判断,基于上一篇文章,继续实现 GI Shader

  • Unity中Shader的GI相关数据的准备

一、上一篇文章中所需要的 lightmapUV 只有在烘焙时才会使用

即只有在 BackGI 和 RealtimeGI 下才会使用到 lightmapUV ,所以我们需要用分支来区别

1、查看帮助文档后,Unity中判断烘培是否开启,使用的是LIGHTMAP_ON

在这里插入图片描述

  1. DYNAMICLIGHTMAP_ON :RealtimeGI是否开启
  2. LIGHTMAP_ON:当对象标记为LightMap Static并且场景烘焙后开启

所以,我们在Pass中,修改 LightMode 为 ForwardBase
定义 multi_compile_fwdbase 变体

Tags{“LightMode”=“ForwardBase”}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase

2、我们在 appdata 和 v2f 中,定义第二套UV

1.在appdata中,第二套UV对应的语义是 TEXCOORD1,这是不能乱改的

struct appdata
{
float4 vertex : POSITION;
//定义第二套 UV ,appdata 对应的固定语义为 TEXCOORD1
#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
float4 lightmapUV : TEXCOORD1;
#endif
};

2.在 v2f 中,也定义第二套UV,不过这里没有语义限制

struct v2f
{
float4 vertex : SV_POSITION;
float4 worldPos : TEXCOORD0;
#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
float4 lightmapUV : TEXCOORD1;
#endif
};

3.在顶点着色器中对其采样

float4 lightmapUV; // .xy = static lightmap UV, .zw = dynamic lightmap UV
lightmapUV的XY代表的是:BackGI
lightmapUV的ZW代表的是:RealTimeGI

//对第二套UV进行纹理采样,这个unity_LightmapST,类似于之前我们定义纹理的Tilling 和 Offset
#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
o.lightmapUV.xy = v.lightmapUV * unity_LightmapST.xy + unity_LightmapST.zw;
#endif

4.在片元着色器,对其赋值

#if defined(DYNAMICLIGHTMAP_ON) || defined(LIGHTMAP_ON)
giInput.lightmapUV = i.lightmapUV;
#endif

以下是准备好所有数据后的代码:

//在这里里面使用 自定义的 cginc 来实现全局GI
//GI数据的准备
//烘培分支的判断
Shader "MyShader/P1_8_4"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Pass
        {
            Tags{"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile DYNAMICLIGHTMAP_ON
            #pragma multi_compile LIGHTMAP_ON
            

            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"
            #include "CGIncludes/MyGlobalIllumination.cginc"
            
            struct appdata
            {
                float4 vertex : POSITION;
                //定义第二套 UV ,appdata 对应的固定语义为 TEXCOORD1
                #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
                float4 lightmapUV : TEXCOORD1;
                #endif
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 worldPos : TEXCOORD0;
                //定义第二套UV
                #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
                float4 lightmapUV : TEXCOORD1;
                #endif
            };
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.worldPos = mul(unity_ObjectToWorld,v.vertex);

                //对第二套UV进行纹理采样
                #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
                    o.lightmapUV.xy = v.lightmapUV * unity_LightmapST.xy + unity_LightmapST.zw;
                #endif
                
                
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //1、准备 SurfaceOutput 的数据
                SurfaceOutput o;
                //目前先初始化为0,使用Unity自带的方法,把结构体中的内容初始化为0
                UNITY_INITIALIZE_OUTPUT(SurfaceOutput,o)

                //2、准备 UnityGIInput 的数据
                UnityGIInput giInput;
                //初始化
                UNITY_INITIALIZE_OUTPUT(UnityGIInput,giInput);
                //修改用到的数据
                giInput.light.color = _LightColor0;
                giInput.light.dir = _WorldSpaceLightPos0;
                giInput.worldPos = i.worldPos;
                giInput.worldViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);
                giInput.atten = 1;
                giInput.ambient = 0;
                
                #if defined(DYNAMICLIGHTMAP_ON) || defined(LIGHTMAP_ON)
                giInput.lightmapUV = i.lightmapUV;
                #endif
                
                //3、准备 UnityGI 的数据
                UnityGI gi;
                //直接光照数据(主平行光)
                gi.light.color = _LightColor0;
                gi.light.dir = _WorldSpaceLightPos0;
                //间接光照数据(目前先给0)
                gi.indirect.diffuse = 0;
                gi.indirect.specular = 0;
                
                LightingLambert_GI1(o,giInput,gi);
                return 1;
            }
            ENDCG
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AITO问界崛起的“临门一脚”,落在了赛力斯汽车的智慧工厂里

文 | 智能相对论 作者 | 沈浪 AITO问界新M7的销量爆了,口碑也紧接着“爆”了。 AITO问界新M7系列上市以来50天,累计大定突破8万辆。AITO问界M9预计今年12月上市,预订超过了1.5万辆。根据最新公布的产销数据,在过去的10月份&…

Contec SolarView Compact < 6.00 远程命令执行漏洞 (CVE-2023-23333)

Contec SolarView Compact < 6.00 远程命令执行漏洞 &#xff08;CVE-2023-23333&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"SolarView Compact" 漏洞复现1. 构造poc2. 执行命令id命令pwd命令 免责声明 仅用于技术交流,目的是向相关安全人…

c++qt学习对象树

1.当创建的对象在堆区时候&#xff0c;如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类&#xff0c;可以不用管理释放的操作&#xff0c;将对象会放在对象树中。 2.一定程度上简化了内存回收机制 构造顺序与析构顺序相反

Java实现驼峰命名的字符串转化

目录 一、场景描述 二、代码示例 1、下划线大写方式命名的字符串转换为驼峰式 2、驼峰式命名的字符串转换为下划线大写的方式 3、完整代码 一、场景描述 在开发场景中&#xff0c;我们会遇到一些涉及字符串的转化。例如&#xff1a;数据库字段的名称叫TYPE_NAME&#xff0c…

Verilog刷题[hdlbits] :Module addsub

题目&#xff1a;Module addsub An adder-subtractor can be built from an adder by optionally negating one of the inputs, which is equivalent to inverting the input then adding 1. The net result is a circuit that can do two operations: (a b 0) and (a ~b …

2023/11/3 JAVA学习

默认执行toString方法 在类中重写toString方法,会自动写 默认比较的是对象的地址 equals主要也是为了重写 克隆必须要Cloneable标记接口,虚拟机才会允许克隆 调用对象中的克隆方法时会报错(异常),按住ctrl 回车扔掉异常 如果用对象自己的equals方法,如果本身是null会报错 效率…

内审数字化:防范化解企业风险的灵丹妙药

某家制造业公司的审计部负责人王经理&#xff0c;最近对公司的各种风险感到焦虑。供应商管理、招标采购、市场竞争激烈、法规变化等因素都可能对他的公司构成威胁。如何防范化解这些风险&#xff0c;成为王经理的首要任务。 正当王经理一筹莫展时&#xff0c;一次偶然的机会&a…

【软著写作】软著写作过程记录

文章目录 整体流程图&#xff1a;写在前面&#xff1a;一、准备材料1 准备材料2 申请盖章 二、软件登记1 注册账号2 填报软著 整体流程图&#xff1a; 写在前面&#xff1a; 这两天填报了一篇软著&#xff0c;正好将以前第一次填报时&#xff0c;踩的一些坑和过程记录了一下&am…

ngxin 正向代理配置 访问互联网

如果本地无法访问互联网&#xff0c;则通过nginx的正向代理&#xff0c;可以将本地的所有流量进行代理&#xff0c;从而达到访问互联网的目的&#xff0c;话不多说&#xff0c;上代码&#xff1a; 1、下载nginx并安装相关依赖 yum -y install gcc yum install -y gcc-c yum …

Nacos报错Connection refused (Connection refused)(最后原因醉了,非常醉)

目录 一、问题产生二、排查思路1.nacos拒绝连接&#xff0c;排查思路&#xff1a;2.Nacos启动成功但是拒绝连接的几种原因&#xff1a; 三、实操过程&#xff08;着急解决问题直接看这个&#xff09;1.启动Nacos2.查看Nacos启动日志3.根据日志处理问题4.修改Nacos5.重启Nacos 一…

安全防御——一、防火墙的基本概念

安全防御 一、了解防火墙1、防火墙的区域及发展史2、下一代防火墙 二、win10添加环回网卡ENSP连接真机1、导入设备包并登录2、创建环回网卡并配置IP地址3、解决云未显示环回网卡的问题4、绑定网卡并登录Web界面 一、了解防火墙 路由交换终归结底是连通性设备 五元组&#xff0…

会声会影2024出来了吗?会声会影2024这款视频剪辑软件怎么样?

众所周知&#xff0c;每每有新兴行业逐渐崛起壮大的时候&#xff0c;随机而来的就是这个行业创造出的衍生行业&#xff0c;比如说现在的短视频平台或者是视频剪辑行业&#xff0c;都是很明显例子&#xff0c;今天我们就针对剪辑软件来和大家聊一聊&#xff0c;会声会影2024这款…

低代码开发,一场深度的IT效率革命

目录 一、前言 二、低代码迅速流行的理由 三、稳定性和生产率的最佳实践 四、程序员用低代码开发应用有哪些益处&#xff1f; 1、提升开发价值 2、利于团队升级 五、总结 一、前言 尽管IT技术支撑了全球的信息化浪潮&#xff0c;然而困扰行业已久的软件开发效率并未像摩尔定律那…

双生幻想礼包码,双生幻想兑换码在哪里输入?

兑换码是玩家享受珍贵福利和钻石资源的捷径&#xff0c;即刻获得&#xff01;如果你尚未了解&#xff0c;千万不要错过我们的最新兑换码&#xff01;不容错过的真实有效双生幻想礼包兑换码大全&#xff0c;小编已亲测&#xff0c;真实可行。双生幻想是一款风靡的二次元角色战斗…

AHD摄像头和普通摄像头

AHD摄像头和普通摄像头是两种常见的监控摄像设备&#xff0c;它们在技术原理、视频传输质量和适应环境等方面存在一些区别。本文将详细介绍AHD摄像头和普通摄像头的区别。 一、技术原理的区别 AHD&#xff08;Analog High Definition&#xff09;摄像头采用模拟高清技术&…

使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)

目录 1、Redis 单机版安装1.1 拉取 Redis1.2 创建数据卷目录1.3 修改 redis.conf1.4 启动 Redis 容器1.5 进入容器连接 Redis 2、Redis 一主两从集群搭建2.1 复制三份 redis.conf2.2 启动 master2.3 启动 两个redis slave2.4 三者关系查看2.5 数据测试 1、Redis 单机版安装 1.…

快速批量重命名:高效修改文件名并转换为大写扩展名

在文件管理中&#xff0c;批量重命名文件是一个常见的需求。通过快速批量重命名&#xff0c;我们可以高效地修改文件名并将扩展字母转换为大写形式。这样做不仅可以提高文件的可读性&#xff0c;还可以更好地组织和管理文件。用云炫文件管理器可以快速批量重命名&#xff0c;能…

数据结构——基于顺序表实现通讯录

一、. 基于动态顺序表实现通讯录 1.1 功能要求 1&#xff09;⾄少能够存储100个⼈的通讯信息 2&#xff09;能够保存⽤⼾信息&#xff1a;名字、性别、年龄、电话、地址等 3&#xff09;增加联系⼈信息 4&#xff09;删除指定联系⼈ 5&#xff09;查找制定联系⼈ 6&…

Spring Cloud智慧工地源码,利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术开发,微服务架构

智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术&#xff0c;以PC端&#xff0c;移动端&#xff0c;设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…