#pragma multi_compile_fwdbase是unity内置的用于前向渲染的关键字快捷方式,它包含了前向渲染光照计算需要的大多数关键字,因此会被shader带来很多的变体。

下面这个简单的shader有8个变体:

  1. Shader "James/Texture"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Base (RGB)", 2D) = "white" {}
  6. }
  7.  
  8. SubShader
  9. {
  10. Tags { "RenderType"="Opaque" "Queue"="Geometry" }
  11. LOD
  12.  
  13. Pass
  14. {
  15. Tags { "LightMode"="ForwardBase" }
  16. Lighting Off
  17.  
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. #pragma multi_compile_fwdbase
  22.  
  23. uniform sampler2D _MainTex;
  24. uniform half4 _MainTex_ST;
  25.  
  26. struct vertexIN_base
  27. {
  28. float4 vertex : POSITION;
  29. float2 texcoord : TEXCOORD0;
  30. };
  31.  
  32. struct v2f_base
  33. {
  34. float4 pos : SV_POSITION;
  35. half2 uv : TEXCOORD0;
  36. };
  37.  
  38. v2f_base vert(vertexIN_base v)
  39. {
  40. v2f_base o;
  41. o.pos = UnityObjectToClipPos(v.vertex);
  42. o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
  43.  
  44. return o;
  45. }
  46.  
  47. fixed4 frag(v2f_base i) : COLOR
  48. {
  49. return tex2D(_MainTex, i.uv);
  50. }
  51. ENDCG
  52. }
  53. }
  54. FallBack Off
  55. }

我们来看一下这些变体都有谁:

  1. // Total snippets: 1
  2. // -----------------------------------------
  3. // Snippet #0 platforms ffffffff:
  4. Builtin keywords used: DIRECTIONAL DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON LIGHTMAP_ON LIGHTMAP_SHADOW_MIXING LIGHTPROBE_SH SHADOWS_SCREEN SHADOWS_SHADOWMASK VERTEXLIGHT_ON
  5.  
  6. keyword variants used in scene:
  7.  
  8. DIRECTIONAL
  9. DIRECTIONAL LIGHTPROBE_SH
  10. DIRECTIONAL SHADOWS_SCREEN
  11. DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN
  12. DIRECTIONAL VERTEXLIGHT_ON
  13. DIRECTIONAL LIGHTPROBE_SH VERTEXLIGHT_ON
  14. DIRECTIONAL SHADOWS_SCREEN VERTEXLIGHT_ON
  15. DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN VERTEXLIGHT_ON

然后我们去掉multi_compile_fwdbase,看一下变体的情况:

  1. // Total snippets: 1
  2. // -----------------------------------------
  3. // Snippet #0 platforms ffffffff:
  4.  
  5. keyword variants used in scene:
  6.  
  7. <no keywords defined>

可以看到这个shader就只会生成一个版本。

所以我们在通过shader实现一些效果时,一定要谨慎使用这种内置的快捷方式,它会给shader带来大量的变体,造成量大又不必要的浪费。

#pragma multi_compile_fwdbase会增加很多个shader variants的更多相关文章

  1. Shader Variants 打包遇到的问题

    1. 遇到的问题 最常见的是打包到手机后效果与PC上不一致,具体情况比如: 光照贴图失效 雾失效 透明或者cutoff失效 以上首先需要检查的地方是Shader变体的编译设置 2. 超级着色器编译成N ...

  2. Unity Shaders Vertex & Fragment Shader入门

    http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...

  3. 【Unity Shader】自定义材质面板的小技巧

    写在前面 之前遇到过一些朋友问怎么在材质面板里定义类似于bool这种变量,控制一些代码的执行.我们当然可以写一个C#文件来自定义材质面板,就像Unity为Standard Shader写材质面板一样( ...

  4. 【Unity Shaders】Shader中的光照

    写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已.当然,我相信这是因为我们写得少...不过这也是由于官方文档对这方面介绍很少的缘故, ...

  5. 【Unity Shaders】Vertex & Fragment Shader入门

    写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...

  6. unity shader base pass and additional pass

      [Unity Shaders]Shader中的光照,shadersshader 写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已 ...

  7. Unity Shader 入门精要学习 (冯乐乐 著)

    第1篇 基础篇 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader 基础 第4章 学习Shader所需的数学基础 第2篇 初级篇 第5章 开始Unity Shad ...

  8. 【Unity Shaders】初探Surface Shader背后的机制

    转载请注明出处:http://blog.csdn.net/candycat1992/article/details/39994049 写在前面 一直以来,Unity Surface Shader背后的 ...

  9. 【Unity Shader实战】卡通风格的Shader(二)

    写在前面 本系列其他文章: 卡通风格的Shader(一) 好久没写博客了,一定是因为课程作业比较多,一定不是因为我懒,恩恩. 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface ...

随机推荐

  1. 英语口语练习系列-C27-艺术品-辨别物体-黄昏的歌

    艺术品 a work of art Theory talent art gallery draw the sketch motivate students' interest full of imag ...

  2. It is not safe to rely on the system's timezone settings错误

    在写php程序中有时会出现这样的警告: PHP Warning: date(): It is not safe to rely on the system's timezone settings. Y ...

  3. HTML5:在移动端禁用长按选中文本功能

    很多时候,我们在写的手机页面需要用户进行长按然后响应一个事件.但是在微信中用户的长按操作被默认为谈出来一个复制的选项.那么这个时候如何去禁止这个东西呢? 其实很简单,方法看下面: 只需要在你需要禁止的 ...

  4. Hibernate(2)映射文件Xxx-hbm.xml

    1.Hibernate映射文件Xxx-hbm.xml ①POJO 类和关系数据库之间的映射可以用一个XML文档来定义.通过 POJO 类的数据库映射文件,Hibernate可以理解持久化类和数据表之间 ...

  5. bootstrap学习总结

    bootstrap网站下载: 谷歌浏览器访问:http://github.com/twbs/bootstrap/    右上角(clone or download) 编译版bootstrap:http ...

  6. CentOS下双网卡双IP不同IP段配置

    环境: eth0:10.0.7.2  gw :10.0.7.254 netmask:255.255.255.0 eth1:168.6.101.2    gw :168.6.101.254    net ...

  7. APP中的图片如何长按可以下载并保存图片到相册出错处理

    https://www.cnblogs.com/interdrp/p/9302164.html 接上文. 如果用户在保存图片过程中,不小心拒绝了相册的访问权限

  8. 微信小程序 --- Cannot read property 'setData' of null 解决

    在外部定义一个为 this 的 that

  9. SpringCloud无废话入门05:Spring Cloud Gateway路由、filter、熔断

    1.什么是路由网关 截至目前为止的例子中,我们创建了一个service,叫做:HelloService,然后我们把它部署到了两台服务器(即提供了两个provider),然后我们又使用ribbon将其做 ...

  10. docker pureftpd

    pureftpd: image: vimagick/pure-ftpd ports: - "21:21" volumes: - ./data/ftpuser:/home/ftpus ...