UnityShader源码2017---学习笔记与自我拓展039

2024-08-20 15:48

本文主要是介绍UnityShader源码2017---学习笔记与自我拓展039,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源自 Illumin-Bumped,Illumin-BumpSpec,Illumin-Diffuse,Illumin-Glossy,Illumin-Parallax,Illumin-ParallaxSpec,Illumin-VertexLit

记得很久很久以前。。。。long long ago

那还是4.x的年底,shader中如果这么写

Shader "Self-Illumin/New Unlit NoFog"

是的,只有shader的一级文件夹是Self-Illumin,那么shader的自发光部分就可以bake到lightmap中

时过境迁,unity迎来的PBR的时代。之前的套路已经没有了效果。

先搁置下Illumin-VertexLit这个shader,看其他的

其他shader中能说的之前都说了,只有一处,这一处也是这些shader的共同点

#if defined (UNITY_PASS_META)o.Emission *= _Emission.rrr;
#endif

也就是说如果定义了UNITY_PASS_META这个宏,就会让自发光的强度与_Emission做倍率乘法。

而META是unity用来做GI等的。

所以就是说,可以bake到lightmap中。

我为了减少变量的影响,注释掉了fallback

//FallBack "Legacy Shaders/Self-Illumin/VertexLit"

然后bake,效果如下。

也就是说,lightmap的bake不是fallback里的meta的pass做的。可能是surface shader的一些魔法吧

后来我测试了直接只有一个pass,然后fallback到vertexlit里的meta 的pass似乎找不到meta,不知为何,表现的结果就是lightmap烘焙结果没有预期。

 

然后返回shader中,定睛一看。。。

CustomEditor "LegacyIlluminShaderGUI"

然后我有开始扒拉源码中,并没有发现这个Editor的cs源码。

unity真是爸爸。。。

算了,看一眼mat里的吧

也就是说,这个是这个editor的关键之处。

可惜找不到出处。。。。。(这个留给之后看PBR时再说吧。。。)

想了想还是这里一下子说完这一块吧。。。

using UnityEngine;namespace UnityEditor
{internal class LegacyIlluminShaderGUI : ShaderGUI{public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props){base.OnGUI(materialEditor, props);materialEditor.LightmapEmissionProperty(0);foreach (Material target in materialEditor.targets)target.globalIlluminationFlags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack;}}
}

这个问题先导此位置。

看一眼Illumin-VertexLit,

直接定位meta(vertex mode下没有什么可说的)

先说一个疑似bug的部分。

metaIN.Emission = c.rgb * tex2D(_Illum, i.uvIllum).a;
#if defined (UNITY_PASS_META)o.Emission *= _Emission.rrr;
#endif

o从何而来。。。。应该是这样

metaIN.Emission = c.rgb * tex2D(_Illum, i.uvIllum).a;
#if defined (UNITY_PASS_META)metaIN.Emission *= _Emission.rrr;
#endif

个人觉得是个bug

然后去看了下builtin_shaders-2018.1.6f1中的发现

这里已经修复。。。删除了#if的判断,直接保留了语句变成了这样

 metaIN.Emission = c.rgb * tex2D(_Illum, i.uvIllum).a;

但是同样的。发现_Emission的使用却消失了。。。。官方还是留了个bug?

 

纵使如此,fallback的问题(后来我测试了直接只有一个pass,然后fallback到vertexlit里的meta 的pass似乎找不到meta,不知为何,表现的结果就是lightmap烘焙结果没有预期。)还是遗留下来了,随着2018版本的一次又一次更迭,我觉定放弃这部分的问题。或许官方就是这么想的。。。。

 

关于lightmap的研究下面还有实验。

回归正题,把vert部分的UnityMetaVertexPosition()说完这一部分就结束了

o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);
float4 UnityMetaVertexPosition (float4 vertex, float2 uv1, float2 uv2, float4 lightmapST, float4 dynlightmapST)
{if (unity_MetaVertexControl.x){vertex.xy = uv1 * lightmapST.xy + lightmapST.zw;// OpenGL right now needs to actually use incoming vertex position,// so use it in a very dummy wayvertex.z = vertex.z > 0 ? 1.0e-4f : 0.0f;}if (unity_MetaVertexControl.y){vertex.xy = uv2 * dynlightmapST.xy + dynlightmapST.zw;// OpenGL right now needs to actually use incoming vertex position,// so use it in a very dummy wayvertex.z = vertex.z > 0 ? 1.0e-4f : 0.0f;}return mul(UNITY_MATRIX_VP, float4(vertex.xyz, 1.0));
}

先看unity_MetaVertexControl,在UnityMetaPass.cginc里

CBUFFER_START(UnityMetaPass)// x = use uv1 as raster position// y = use uv2 as raster positionbool4 unity_MetaVertexControl;// x = return albedo// y = return normalbool4 unity_MetaFragmentControl;// Control which VisualizationMode we will// display in the editorint unity_VisualizationMode;
CBUFFER_END

unity_MetaVertexControl的x分量是个布尔值(在C的语法里,0为false,非零为true):是否使用uv1作为光栅化的坐标

y分量:是否使用uv2作为光栅化的坐标

下面的码很明显的,就是做了TRNASFOMR_TEX这个函数做的,只不过把判断Z,如果大于零z=0.0001,否则就是0

带来的疑问是什么时候会用uv1做光栅化的坐标呢?

不明白这里是用做干什么的,或许unity还有一些未发觉的技能。下面是一个简单的测试

 

 

 

下面是lightmap的一点实验性的操作(这里不测试_Emission为负值时带来的反色的lightmap的效果)

这里就意思一下,具体含义不细说,详情看手册吧

效果如上。

4.x年代的手法已经失效,那么在新版unity里如何做的,手册里也说了meta的pass管这个。

于是,就有了meta的pass

Pass
{Tags { "LightMode"="Meta" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};fixed4 _Color;float _Emission;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = _Color*_Emission;return col;}ENDCG
}

这里简单的写的meta,或许不会符合unity的规范,这里先简单的测试。

我们把_Emission调到0.1,然后bake(使用这个shader的材质在light explorer的static  emissives页签下并没有记录)

效果如下图

这里有个问题就是,自己写的meta中的_Emission的值竟然影响旁边红色的材质(自带的standard shader的mat)。可以调_Emission成1试试,整个都是爆掉的,然后红色的部分用来黄绿色。

说明了什么,只能说明我的操作不规范。

然后我用了自带的过来时的shader  bake一下

也是有问题的。

然后两个standard。

看来Emission的值不能过大。

 

 

 

这篇关于UnityShader源码2017---学习笔记与自我拓展039的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090496

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++