Shader预处理宏、内置状态变量、多版本编译等

预定义shader预处理宏:
  Target platform:

  SHADER_API_OPENGL - desktop OpenGL
  SHADER_API_D3D9 - Direct3D 9
  SHADER_API_XBOX360 - Xbox 360
  SHADER_API_PS3 - PlayStation 3
  SHADER_API_D3D11 - desktop Direct3D 11
  SHADER_API_GLES - OpenGL ES 2.0 (desktop or mobile), use presence of SHADER_API_MOBILE to determine.
  SHADER_API_FLASH - Flash Stage3D
  SHADER_API_D3D11_9X - Direct3D 11 target for Windows RT

  Surface shader pass indicators:

  UNITY_PASS_FORWARDBASE - 前向渲染的base pass(主方向光、lightmaps、SH)
  UNITY_PASS_FORWARDADD - 前向渲染的add pass(没盏灯一个pass)
  UNITY_PASS_PREPASSBASE - 延迟渲染base pass(renders normals & specular exponent).
  UNITY_PASS_PREPASSFINAL - 延迟渲染final pass (applies lighting & textures).
  UNITY_PASS_SHADOWCASTER - 阴影投射渲染pass.
  UNITY_PASS_SHADOWCOLLECTOR - 阴影手机pass for directional light shadows.

内置全局状态变量:

  内置的矩阵:

    UNITY_MATRIX_MVP: Current model*view*projection matrix
    UNITY_MATRIX_MV: Current model*view matrix
    UNITY_MATRIX_V: Current view matrix.
    UNITY_MATRIX_P: Current projection matrix
    UNITY_MATRIX_VP: Current view*projection matrix
    UNITY_MATRIX_T_MV: Transpose of model*view matrix
    UNITY_MATRIX_IT_MV: Inverse transpose of model*view matrix
    UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3: Texture transformation matrices

  内置的向量:

  UNITY_LIGHTMODEL_AMBIENT: Current ambient color.

使用multi_compile编译Shader的多个版本:
  有时候我们希望保留一个shader的大多数实现,而只是做一些细节的修改,此时我们就可以通过该方式来生成shader的多个版本,然后在代码中控制使用哪个版本。
  命令:
  #pragma multi_compile FANCY_STUFF_OFF FANCY_STUFF_ON
  控制:
  Material.EnableKeyword/DisableKeyword
  Shader.EnableKeyword/DisableKeyword
  在shader中根据定义好的关键字处理具体显示方案:

  float4 frag(vertOut i):COLOR
  {
    float4 c = float4(0, 0, 0, 0);
    #ifdef MY_multi_1
      c = float4(0, 1, 0, 0);
    #endif
    #ifdef MY_multi_2
      c = float4(0, 0, 1, 0);
    #endif
    return c;
}

  注意不要在shader中大量使用此命令,因为关键字的个数是有上限的,而多条multi_complie会交叉匹配产生很多种结果。

GLSL shader编程
  在Shader中,除了Cg/HLSL以外,GLSL(OpenGL Shading Languate)也可以直接使用。
  一般不建议使用GLSL,除非你确定你的目标平台只有Max OS X或兼容OpenGL ES 2.0的移动设备。
  Unity默认都会将Cg/HLSL交叉编译出优化过得GLSL,以此来支持多平台。在desktop平台下可以通过打开#pragma glsl选项来支持。

CSDN博客:http://blog.csdn.net/candycat1992/article/details/47284289

时间: 2024-10-26 22:39:56

Shader预处理宏、内置状态变量、多版本编译等的相关文章

【Unity Shaders】使用CgInclude让你的Shader模块化——Unity内置的CgInclude文件

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 啦啦啦,又开了新的一章...为什么会讲CgInclude呢?什么又是Cg呢?呜,按我的理解

新浪云(SAE)使用没有内置的django版本

SAE自带的django目前到1.5版本,如果要使用更高的版本,则需要把django包同代码一起上传. 以1.7.3为例 先从SAE svn签出代码,默认1是根目录 1.  1目录下创建文件夹 site-packages ,把django包copy到此文件夹   django包在python安装目录中 如 C:\Python27\Lib\site-packages\django 2.  代码copy到1目录下 最后的目录结构是这样的 D:\github\djangodemo\1>lsconfig

Unity内置的shader include files

Unity内置的shader include files:这些文件都以.cninc结尾, HLSLSupport.cginc:自动包含,一些跨平台编译相关的宏和定义. UnityCG.cginc:常用的全局变量和函数. AutoLight.cginc:光影相关帮助函数,surface shader内部使用此文件. Lighting.cginc:surface shader自动包含,定义了标准的光照模式. TerrainEngin.cginc:地形和植被shader相关的帮助函数.UnityGC.

一起talk C栗子吧(第一百六十九回:C语言实例--再谈内置宏)

各位看官们,大家好,上一回中咱们说的是C语言中的布尔–bool类型的例子,这一回咱们说的例子是:再谈内置宏 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在第一百二十四回中介绍了C语言中的内置宏,当时介绍了常用的内置宏_LINE_和_FILE_.并且介绍了如何使用它们来输出它们所在位置的行号和所在的文件名.大家都知道,这两个内置宏经常被用来在文件中添加调试信息.因为我们写的程序难免会有错误,所以需要对程序进行调试.在文件中加入内置宏后,我们通过调试可以快速地找到错误发生在哪个

unity3d shader 预定义着色器预处理宏

编译着色器程序时,Unity 会定义几个预处理宏. 目标平台 SHADER_API_OPENGL - 桌面 OpenGL SHADER_API_D3D9 - Direct3D 9 SHADER_API_XBOX360 - Xbox 360 SHADER_API_PS3 - PlayStation 3 SHADER_API_D3D11 - 桌面 Direct3D 11 SHADER_API_GLES - OpenGL ES 2.0(桌面或移动),使用 SHADER_API_MOBILE 的存在来确

Unity 内置Shader变量、辅助函数等

一:标准库里的常用.cginc文件 HLSLSupport.cginc - (automatically included) Helper macros and definitions for cross-platform shader compilation. HLSLSupport.cginc :(自动包含)跨平台着色器编译帮助宏和定义 UnityCG.cginc - commonly used global variables and helper functions. UnityCG.c

一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就会提示,在某个文件的某一行有错误,这是怎么做到的呢?事实上是使用了C语言的内置宏. 说到宏,我想大家都知道,而所谓的内置宏相似于C语言的关键字,它是C语言自定义的,因此我们不须要定义宏,就能够直接使用.经常使用的内置宏有"_LINE_"和"_FILE_".假设把它们放到

C++ 内置宏定义 与 预编译指令

内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE____TIME__ __FUNCTION__ 2.预编译指令 可以防止头文件被多次引用 可以方便解决代码跨平台编译问题 可以根据自定义变量灵活执行程序 等等,许多好处 效果可以看代码实例: test.h 1 #ifndef __TEST_H 2 #define __TEST_H 3 4 #incl

Qt给应用程序添加版本信息(对rc文件的设置,可利用QT内置变量)

作者:daodaoliang 时间:2016年7月11日16:12:09 版本:V 0.0.4 邮箱:[email protected] 0. 环境说明 系统环境: win10 64位 Qt环境: Qt-lib 5.6.0 QCreat0r 3.6.1 1. 使用.rc文件 1.1 在工程项目下创建 .rc 文件 例如 version.rc: # if defined(UNDER_CE) # include <winbase.h> # else # include <windows.h&