unity里standard pbr(一)
关注forwardbase下的
standard.shader
- #pragma vertex vertBase
- #pragma fragment fragBase
- #include "UnityStandardCoreForward.cginc"
跟踪到UnityStandardCoreForward.cginc
- #if UNITY_STANDARD_SIMPLE
- #include "UnityStandardCoreForwardSimple.cginc"
- VertexOutputBaseSimple vertBase (VertexInput v) { return vertForwardBaseSimple(v); }
- VertexOutputForwardAddSimple vertAdd (VertexInput v) { return vertForwardAddSimple(v); }
- half4 fragBase (VertexOutputBaseSimple i) : SV_Target { return fragForwardBaseSimpleInternal(i); }
- half4 fragAdd (VertexOutputForwardAddSimple i) : SV_Target { return fragForwardAddSimpleInternal(i); }
- #else
- #include "UnityStandardCore.cginc"
- VertexOutputForwardBase vertBase (VertexInput v) { return vertForwardBase(v); }
- VertexOutputForwardAdd vertAdd (VertexInput v) { return vertForwardAdd(v); }
- half4 fragBase (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternal(i); }
- half4 fragAdd (VertexOutputForwardAdd i) : SV_Target { return fragForwardAddInternal(i); }
- #endif
UNITY_STANDARD_SIMPLE开关是简化版意思,进下边的分支
顶点着色器 vertForwardBase
先看输出
- struct VertexOutputForwardBase
- {
- float4 pos : SV_POSITION;
- float4 tex : TEXCOORD0;
- half3 eyeVec : TEXCOORD1;
- half4 tangentToWorldAndParallax[] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:viewDirForParallax]
- half4 ambientOrLightmapUV : TEXCOORD5; // SH or Lightmap UV
- SHADOW_COORDS()
- UNITY_FOG_COORDS()
- // next ones would not fit into SM2.0 limits, but they are always for SM3.0+
- #if UNITY_REQUIRE_FRAG_WORLDPOS
- float3 posWorld : TEXCOORD8;
- #endif
- #if UNITY_OPTIMIZE_TEXCUBELOD
- #if UNITY_REQUIRE_FRAG_WORLDPOS
- half3 reflUVW : TEXCOORD9;
- #else
- half3 reflUVW : TEXCOORD8;
- #endif
- #endif
- UNITY_VERTEX_OUTPUT_STEREO
- };
- UNITY_REQUIRE_FRAG_WORLDPOS要不要worldpos,要
- reflUVW是用来做反射的,要
UNITY_VERTEX_OUTPUT_STEREO 是用来做实例化的,不要
简化成
- struct VertexOutputForwardBase
- {
- float4 pos : SV_POSITION;
- float4 tex : TEXCOORD0;
- half3 eyeVec : TEXCOORD1;
- half4 tangentToWorldAndParallax[] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:viewDirForParallax]
- half4 ambientOrLightmapUV : TEXCOORD5; // SH or Lightmap UV
- SHADOW_COORDS()
- UNITY_FOG_COORDS()
- float3 posWorld : TEXCOORD8;
- half3 reflUVW : TEXCOORD9;
- };
- 再来看顶点着色器
- VertexOutputForwardBase vertForwardBase (VertexInput v)
- {
- VertexOutputForwardBase o;
- UNITY_SETUP_INSTANCE_ID(v);
- UNITY_INITIALIZE_OUTPUT(VertexOutputForwardBase, o);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
- float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
- #if UNITY_REQUIRE_FRAG_WORLDPOS
- o.posWorld = posWorld.xyz;
- #endif
- o.pos = UnityObjectToClipPos(v.vertex);
- o.tex = TexCoords(v);
- o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
- float3 normalWorld = UnityObjectToWorldNormal(v.normal);
- #ifdef _TANGENT_TO_WORLD
- float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
- float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
- o.tangentToWorldAndParallax[].xyz = tangentToWorld[];
- o.tangentToWorldAndParallax[].xyz = tangentToWorld[];
- o.tangentToWorldAndParallax[].xyz = tangentToWorld[];
- #else
- o.tangentToWorldAndParallax[].xyz = ;
- o.tangentToWorldAndParallax[].xyz = ;
- o.tangentToWorldAndParallax[].xyz = normalWorld;
- #endif
- //We need this for shadow receving
- TRANSFER_SHADOW(o);
- o.ambientOrLightmapUV = VertexGIForward(v, posWorld, normalWorld);
- #ifdef _PARALLAXMAP
- TANGENT_SPACE_ROTATION;
- half3 viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
- o.tangentToWorldAndParallax[].w = viewDirForParallax.x;
- o.tangentToWorldAndParallax[].w = viewDirForParallax.y;
- o.tangentToWorldAndParallax[].w = viewDirForParallax.z;
- #endif
- #if UNITY_OPTIMIZE_TEXCUBELOD
- o.reflUVW = reflect(o.eyeVec, normalWorld);
- #endif
- UNITY_TRANSFER_FOG(o,o.pos);
- return o;
- }
- UNITY_SETUP_INSTANCE_ID是instance用的,不要
- UNITY_INITIALIZE_OUTPUT啥也没干,不要
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO不要
- NormalizePerVertexNormal相等于什么都没做
- _TANGENT_TO_WORLD是切线空间和世界空间转换矩阵 保留
- o.ambientOrLightmapUV = VertexGIForward(v, posWorld, normalWorld);
因为打算用pbr来做角色,没有lightmap,所以这儿等于
- o.ambientOrLightmapUV = 0 ;
- _PARALLAXMAP视差贴图,不用
- 去掉分支后代码如下
- VertexOutputForwardBase vertForwardBase (VertexInput v)
- {
- VertexOutputForwardBase o;
- float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
- o.posWorld = posWorld.xyz;
- o.pos = UnityObjectToClipPos(v.vertex);
- o.tex = TexCoords(v);
- o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
- float3 normalWorld = UnityObjectToWorldNormal(v.normal);
- float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
- float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
- o.tangentToWorldAndParallax[0].xyz = tangentToWorld[0];
- o.tangentToWorldAndParallax[1].xyz = tangentToWorld[1];
- o.tangentToWorldAndParallax[2].xyz = tangentToWorld[2];
- //We need this for shadow receving
- TRANSFER_SHADOW(o);
- o.ambientOrLightmapUV = 0;
- o.reflUVW = reflect(o.eyeVec, normalWorld);
- UNITY_TRANSFER_FOG(o,o.pos);
- return o;
- }
至此顶点着色器完事,下篇开始像素着色器
unity里standard pbr(一)的更多相关文章
- 关于unity里pbr技术和材质 unity5默认shader和传统的对比
刚开始也不知道什么是pbr (Physically Based Rendering)后来才发现这是一种新的渲染方式 与之对应的是材质是pbs(Physically Based Shader) unit ...
- 【Unity Shaders】Unity里的雾效模拟
写在前面 熟悉Unity的都知道,Unity可以进行基本的雾效模拟.所谓雾效,就是在远离我们视角的方向上,物体看起来像被蒙上了某种颜色(通常是灰色).这种技术的实现实际上非常简单,就是根据物体距离摄像 ...
- Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)
Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...
- Unity里的Mesh属性
----------------------------------------------------------------------------------------------- Mesh ...
- 用C# 模拟实现unity里的协程
注:需要了解C#的迭代器,不然很难理解. 之前面试有被问到unity协程的原理,以及撇开unity用纯C#去实现协程的方法.后来了解一下,确实可以的.趁这会有空,稍微总结一下. 还是结合代码说事吧: ...
- unity, access standard shared emission by script
unity 5.1.1f1 personal 用下面方法在脚本中设置standard shader的emssion: gameObject.GetComponent<MeshRenderer&g ...
- standard pbr(二)
下一步看像素着色器代码 half4 fragBase (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternal( ...
- Unity里包裹Debug,且不影响Debug的重定向
Debug.Log, Debug.LogWarning, Debug.LogError在project中常常须要再包裹一层.做些定制.也方便开关Log.但有一个问题时.当用一个类将Debug包裹起来后 ...
- FairyGUI编辑器的和unity里的Obj对应关系
1.在FairyGUI官网上下载好unity的工程,用FairyGUI编辑器打开它的官方案例 2.在FairyGUI编辑器和Unity中,从一个最简单的示例"Bag"着手. ...
随机推荐
- [Algorithm] Median Maintenance algorithm implementation using TypeScript / JavaScript
The median maintenance problem is a common programming challenge presented in software engineering j ...
- HNU11376:Golf Bot
Problem description Input The first line has one integer: N, the number of different distances the G ...
- 《Java设计模式》之调停者模式(Mediator)
调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从而使它们能够较松散地耦合.当这些对象中的某些对象之间的相互作用发生改变时,不会马上影响到其它的一些 ...
- linger博客原创性博文导航
linger博客原创性博文导航 http://blog.csdn.net/lingerlanlan 大学研究游戏外挂技术開始了此博客.断断续续写了些博文. 后来,開始机器学习和深度学习的研究工作,因为 ...
- NoSQL之Redis学习小结
大数据时代要求: 三V:Volume海量.Velocity实时.Variety多样: 三高:高并发.高可扩.高性能 高并发操作不建议使用关联查询,而使用冗余数据,分布式系统支持不了太多的并发. 横向 ...
- Linux终端:speedtest_cli检测你的实时带宽速度
你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web ...
- cmd命令速查手册
CMD命令速查手册ASSOC显示或修改文件扩展名关联AT 计划在计算机上运行的命令和程序ATTRIB 显示或更改文件属性BREAK 设置或清除扩展式 CTRL+C检查CACLS显示或修改文件的访问控制 ...
- 高效抽取loading,再多的载入页面也不怕
当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...
- YUV420视频上面添加字幕
1.source_codemain.c中实现了函数draw_Font_Func(),这个函数可以直接移植到C程序中使用.zimo.h里面放的是字模转码后的数据. 2.data_yuv测试用的yuv42 ...
- NPOI 计算单元格高度
需求 要导出一个Excel,第一行是不定长字符串,合并单元格(A-G)已知,现要计算第一行的高度. 思路 已知,NPOI的宽度单位是1/256个英文字符,在本例中,A列的宽度是2048,即 2048 ...