关注forwardbase下的

standard.shader

  1. #pragma vertex vertBase
  2. #pragma fragment fragBase
  3. #include "UnityStandardCoreForward.cginc"

跟踪到UnityStandardCoreForward.cginc

  1. #if UNITY_STANDARD_SIMPLE
  2. #include "UnityStandardCoreForwardSimple.cginc"
  3. VertexOutputBaseSimple vertBase (VertexInput v) { return vertForwardBaseSimple(v); }
  4. VertexOutputForwardAddSimple vertAdd (VertexInput v) { return vertForwardAddSimple(v); }
  5. half4 fragBase (VertexOutputBaseSimple i) : SV_Target { return fragForwardBaseSimpleInternal(i); }
  6. half4 fragAdd (VertexOutputForwardAddSimple i) : SV_Target { return fragForwardAddSimpleInternal(i); }
  7. #else
  8. #include "UnityStandardCore.cginc"
  9. VertexOutputForwardBase vertBase (VertexInput v) { return vertForwardBase(v); }
  10. VertexOutputForwardAdd vertAdd (VertexInput v) { return vertForwardAdd(v); }
  11. half4 fragBase (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternal(i); }
  12. half4 fragAdd (VertexOutputForwardAdd i) : SV_Target { return fragForwardAddInternal(i); }
  13. #endif

UNITY_STANDARD_SIMPLE开关是简化版意思,进下边的分支

顶点着色器 vertForwardBase

先看输出

  1. struct VertexOutputForwardBase
  2. {
  3. float4 pos : SV_POSITION;
  4. float4 tex : TEXCOORD0;
  5. half3 eyeVec : TEXCOORD1;
  6. half4 tangentToWorldAndParallax[] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:viewDirForParallax]
  7. half4 ambientOrLightmapUV : TEXCOORD5; // SH or Lightmap UV
  8. SHADOW_COORDS()
  9. UNITY_FOG_COORDS()
  10.  
  11. // next ones would not fit into SM2.0 limits, but they are always for SM3.0+
  12. #if UNITY_REQUIRE_FRAG_WORLDPOS
  13. float3 posWorld : TEXCOORD8;
  14. #endif
  15.  
  16. #if UNITY_OPTIMIZE_TEXCUBELOD
  17. #if UNITY_REQUIRE_FRAG_WORLDPOS
  18. half3 reflUVW : TEXCOORD9;
  19. #else
  20. half3 reflUVW : TEXCOORD8;
  21. #endif
  22. #endif
  23.  
  24. UNITY_VERTEX_OUTPUT_STEREO
  25. };
  1. UNITY_REQUIRE_FRAG_WORLDPOS要不要worldpos,要
  1. reflUVW是用来做反射的,要
    UNITY_VERTEX_OUTPUT_STEREO 是用来做实例化的,不要
    简化成
  1. struct VertexOutputForwardBase
  2. {
  3. float4 pos : SV_POSITION;
  4. float4 tex : TEXCOORD0;
  5. half3 eyeVec : TEXCOORD1;
  6. half4 tangentToWorldAndParallax[] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:viewDirForParallax]
  7. half4 ambientOrLightmapUV : TEXCOORD5; // SH or Lightmap UV
  8. SHADOW_COORDS()
  9. UNITY_FOG_COORDS()
  10. float3 posWorld : TEXCOORD8;
  11. half3 reflUVW : TEXCOORD9;
  12. };
  1. 再来看顶点着色器
  1. VertexOutputForwardBase vertForwardBase (VertexInput v)
  2. {
  3. VertexOutputForwardBase o;
  4. UNITY_SETUP_INSTANCE_ID(v);
  5. UNITY_INITIALIZE_OUTPUT(VertexOutputForwardBase, o);
  6. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  7.  
  8. float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
  9. #if UNITY_REQUIRE_FRAG_WORLDPOS
  10. o.posWorld = posWorld.xyz;
  11. #endif
  12. o.pos = UnityObjectToClipPos(v.vertex);
  13.  
  14. o.tex = TexCoords(v);
  15. o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
  16. float3 normalWorld = UnityObjectToWorldNormal(v.normal);
  17. #ifdef _TANGENT_TO_WORLD
  18. float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
  19.  
  20. float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
  21. o.tangentToWorldAndParallax[].xyz = tangentToWorld[];
  22. o.tangentToWorldAndParallax[].xyz = tangentToWorld[];
  23. o.tangentToWorldAndParallax[].xyz = tangentToWorld[];
  24. #else
  25. o.tangentToWorldAndParallax[].xyz = ;
  26. o.tangentToWorldAndParallax[].xyz = ;
  27. o.tangentToWorldAndParallax[].xyz = normalWorld;
  28. #endif
  29. //We need this for shadow receving
  30. TRANSFER_SHADOW(o);
  31.  
  32. o.ambientOrLightmapUV = VertexGIForward(v, posWorld, normalWorld);
  33.  
  34. #ifdef _PARALLAXMAP
  35. TANGENT_SPACE_ROTATION;
  36. half3 viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
  37. o.tangentToWorldAndParallax[].w = viewDirForParallax.x;
  38. o.tangentToWorldAndParallax[].w = viewDirForParallax.y;
  39. o.tangentToWorldAndParallax[].w = viewDirForParallax.z;
  40. #endif
  41.  
  42. #if UNITY_OPTIMIZE_TEXCUBELOD
  43. o.reflUVW = reflect(o.eyeVec, normalWorld);
  44. #endif
  45.  
  46. UNITY_TRANSFER_FOG(o,o.pos);
  47. return o;
  48. }
  1. UNITY_SETUP_INSTANCE_IDinstance用的,不要
  1. UNITY_INITIALIZE_OUTPUT啥也没干,不要
  1. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO不要
  1. NormalizePerVertexNormal相等于什么都没做
  1. _TANGENT_TO_WORLD是切线空间和世界空间转换矩阵 保留
  1. o.ambientOrLightmapUV = VertexGIForward(v, posWorld, normalWorld);
    因为打算用pbr来做角色,没有lightmap,所以这儿等于
  1. o.ambientOrLightmapUV = 0
  1. _PARALLAXMAP视差贴图,不用
  1. 去掉分支后代码如下
  1. VertexOutputForwardBase vertForwardBase (VertexInput v)
  2. {
  3. VertexOutputForwardBase o;
  4. float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
  5. o.posWorld = posWorld.xyz;
  6. o.pos = UnityObjectToClipPos(v.vertex);
  7. o.tex = TexCoords(v);
  8. o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
  9. float3 normalWorld = UnityObjectToWorldNormal(v.normal);
  10. float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
  11.  
  12. float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
  13. o.tangentToWorldAndParallax[0].xyz = tangentToWorld[0];
  14. o.tangentToWorldAndParallax[1].xyz = tangentToWorld[1];
  15. o.tangentToWorldAndParallax[2].xyz = tangentToWorld[2];
  16. //We need this for shadow receving
  17. TRANSFER_SHADOW(o);
  18. o.ambientOrLightmapUV = 0;
  19. o.reflUVW = reflect(o.eyeVec, normalWorld);
  20. UNITY_TRANSFER_FOG(o,o.pos);
  21. return o;
  22. }

 至此顶点着色器完事,下篇开始像素着色器

  1.  
  1.  
  1.  

unity里standard pbr(一)的更多相关文章

  1. 关于unity里pbr技术和材质 unity5默认shader和传统的对比

    刚开始也不知道什么是pbr (Physically Based Rendering)后来才发现这是一种新的渲染方式 与之对应的是材质是pbs(Physically Based Shader) unit ...

  2. 【Unity Shaders】Unity里的雾效模拟

    写在前面 熟悉Unity的都知道,Unity可以进行基本的雾效模拟.所谓雾效,就是在远离我们视角的方向上,物体看起来像被蒙上了某种颜色(通常是灰色).这种技术的实现实际上非常简单,就是根据物体距离摄像 ...

  3. Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)

    Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...

  4. Unity里的Mesh属性

    ----------------------------------------------------------------------------------------------- Mesh ...

  5. 用C# 模拟实现unity里的协程

    注:需要了解C#的迭代器,不然很难理解. 之前面试有被问到unity协程的原理,以及撇开unity用纯C#去实现协程的方法.后来了解一下,确实可以的.趁这会有空,稍微总结一下. 还是结合代码说事吧: ...

  6. unity, access standard shared emission by script

    unity 5.1.1f1 personal 用下面方法在脚本中设置standard shader的emssion: gameObject.GetComponent<MeshRenderer&g ...

  7. standard pbr(二)

    下一步看像素着色器代码 half4 fragBase (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternal( ...

  8. Unity里包裹Debug,且不影响Debug的重定向

    Debug.Log, Debug.LogWarning, Debug.LogError在project中常常须要再包裹一层.做些定制.也方便开关Log.但有一个问题时.当用一个类将Debug包裹起来后 ...

  9. FairyGUI编辑器的和unity里的Obj对应关系

    1.在FairyGUI官网上下载好unity的工程,用FairyGUI编辑器打开它的官方案例 2.在FairyGUI编辑器和Unity中,从一个最简单的示例"Bag"着手.     ...

随机推荐

  1. [Algorithm] Median Maintenance algorithm implementation using TypeScript / JavaScript

    The median maintenance problem is a common programming challenge presented in software engineering j ...

  2. HNU11376:Golf Bot

    Problem description Input The first line has one integer: N, the number of different distances the G ...

  3. 《Java设计模式》之调停者模式(Mediator)

    调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从而使它们能够较松散地耦合.当这些对象中的某些对象之间的相互作用发生改变时,不会马上影响到其它的一些 ...

  4. linger博客原创性博文导航

    linger博客原创性博文导航 http://blog.csdn.net/lingerlanlan 大学研究游戏外挂技术開始了此博客.断断续续写了些博文. 后来,開始机器学习和深度学习的研究工作,因为 ...

  5. NoSQL之Redis学习小结

    大数据时代要求: 三V:Volume海量.Velocity实时.Variety多样: 三高:高并发.高可扩.高性能 高并发操作不建议使用关联查询,而使用冗余数据,分布式系统支持不了太多的并发. 横向 ...

  6. Linux终端:speedtest_cli检测你的实时带宽速度

    你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web ...

  7. cmd命令速查手册

    CMD命令速查手册ASSOC显示或修改文件扩展名关联AT 计划在计算机上运行的命令和程序ATTRIB 显示或更改文件属性BREAK 设置或清除扩展式 CTRL+C检查CACLS显示或修改文件的访问控制 ...

  8. 高效抽取loading,再多的载入页面也不怕

    当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...

  9. YUV420视频上面添加字幕

    1.source_codemain.c中实现了函数draw_Font_Func(),这个函数可以直接移植到C程序中使用.zimo.h里面放的是字模转码后的数据. 2.data_yuv测试用的yuv42 ...

  10. NPOI 计算单元格高度

    需求 要导出一个Excel,第一行是不定长字符串,合并单元格(A-G)已知,现要计算第一行的高度. 思路 已知,NPOI的宽度单位是1/256个英文字符,在本例中,A列的宽度是2048,即 2048 ...