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 的存在来确定。
  • SHADER_API_FLASH - Flash Stage3D
  • SHADER_API_D3D11_9X - 用于 Windows RT 的 Direct3D 11 目标

此外,当目标着色语言为 GLSL 时定义 SHADER_TARGET_GLSL(当定义了 SHADER_API_GLES 时总是为真;在使用了 #pragma glsl后,SHADER_API_OPENGL 可以为真)。

为“移动”平台 (iOS/Android) 进行编译时,为 SHADER_API_GLES 定义 SHADER_API_MOBILE;在为“桌面”(本地客户端)进行编译时不定义。

平台差异帮助

由于不是特别有前瞻性,因此不建议直接使用这些平台的宏。例如,如果您正在编写检查 D3D 的着色器,那么也许将来该检查应扩展到包括 D3D11。相反,Unity 定义了一些帮助宏(在 HLSLSupport.cginc 中)来对此提供 帮助。

  • UNITY_ATTEN_CHANNEL - 光衰减纹理的哪个通道含有数据;用于逐像素光照代码。定义为‘r’或‘a’。
  • UNITY_HALF_TEXEL_OFFSET - 在将纹理元件映射到像素时需要半纹理元件偏移调整的平台上定义(如 Direct3D 9)。
  • UNITY_UV_STARTS_AT_TOP - 总是使用值 1 或 0 定义;值 1 在纹理 V 坐标在“纹理顶部”为零的平台上。类似 Direct3D 的平台使用值 1;类似 OpenGL 的平台使用值 0。
  • UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE - 在某个平台可通过将深度手动渲染到纹理中来模仿阴影贴图或深度纹理时定义。
  • UNITY_PROJ_COORD(a) - 给定一个 4 分量向量,返回一个适合投影纹理读取的纹理坐标。在大多数平台上,其直接返回给定的值。
  • UNITY_NEAR_CLIP_VALUE - 定义为近裁剪平面的值;类似 Direct3D 的平台使用 0.0,而类似 OpenGL 的平台使用 -1.0。
  • UNITY_COMPILER_CG、UNITY_COMPILER_HLSL 或 UNITY_COMPILER_HLSL2GLSL 确定使用哪个底层着色器编译器;在细微语法差异迫使您编写不同着色器代码的情况下使用。
  • UNITY_CAN_COMPILE_TESSELLATION - 在着色器编译器“理解”密铺着色器 HLSL 语法(目前仅 D3D11)时定义。
  • UNITY_INITIALIZE_OUTPUT(类型,名称)- 将给定类型的名称变量初始化为零。
  • UNITY_COMPILER_HLSL、UNITY_COMPILER_HLSL2GLSL、UNITY_COMPILER_CG - 指明正在使用哪个着色器编译器编译着色器。分别有 Microsoft 的 HLSL(用于 DX11、Xbox360、WinRT)、HLSL 到 GLSL 转换器(#pragma glsl 时用于 iOS/Android 和桌面 OpenGL),以及 NVIDIA 的 Cg(用于 D3D9 和非 GLSL 桌面 OpenGL 目标)。当您遇到非常特殊的情况如编译器之间着色器语法处理差异,以及想要为每个编译器编写不同代码时使用。

阴影贴图宏

在不同的平台上,阴影贴图的声明和采样可能非常不同。因此 Unity 有几个宏可为此提供 帮助:

  • UNITY_DECLARE_SHADOWMAP(tex) - 用名称“tex”声明阴影贴图纹理变量。
  • UNITY_SAMPLE_SHADOW(tex,uv) - 在给定的“uv”坐标处对阴影贴图纹理“tex”进行采样(XY 组件为纹理位置,Z 组件为要比较的深度)。返回单个浮点值,其中阴影术语在 0..1 范围内。
  • UNITY_SAMPLE_SHADOW_PROJ(tex,uv) - 与以上类似,但会进行投影的阴影贴图读取。“uv”是 float4,所有其他组件除以 .w 以进行查找。

常量缓冲区宏

Direct3D 11 将所有着色器变量集合到“常量缓冲区”中。大多数 Unity 内置变量都已经集合了,但对于您自己的着色器变量而言,更理想的方法是根据期望的更新频率将其放入不同的常量缓冲区中。

为此,使用 CBUFFER_START(name) 和 CBUFFER_END 宏:

    CBUFFER_START(MyRarelyUpdatedVariables)    float4 _SomeGlobalValue;    CBUFFER_END

表面着色器通道标志

编译表面着色器时,着色器以产生用于不同通道照明的大量代码结束。编译每个通道时,定义下列宏之一:

  • UNITY_PASS_FORWARDBASE - 正向渲染基础通道(主方向灯、光照贴图、SH)。
  • UNITY_PASS_FORWARDADD - 正向渲染附加通道(每个通道一个灯)。
  • UNITY_PASS_PREPASSBASE - 延时光照基础通道(渲染法线和高光指数)。
  • UNITY_PASS_PREPASSFINAL - 延时光照最终通道(使用光照和纹理)。
  • UNITY_PASS_SHADOWCASTER - 阴影投射渲染通道。
  • UNITY_PASS_SHADOWCOLLECTOR - 方向灯阴影的阴影“收集”通道。
时间: 2024-12-09 17:21:22

unity3d shader 预定义着色器预处理宏的相关文章

Unity3D ShaderLab 透明裁剪着色器

Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪透明. 这种透明使用一个值来简单的控制某些特定的像素无需渲染到屏幕上,所以我们也可以通过他实现一个要么完全透明或完全不透的着色器. 我们即将利用灰度的值来控制材质的透明度. 准备工作还是新建Shader Material,一张灰度变化图.同样是分分钟完成的代码,请看完成: Shader "91YGa

【struts2】预定义拦截器

1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个Struts-default.xml里面,因此我们需要到这个文件的struts-default包里去看一下.定义如下: 1 <interceptors> 2 <interceptor name="alias" class="com.opensymphony.xwor

Unity3d shader之卡通着色Toon Shading

卡通着色的目的是为了让被着色物体显得过渡的不那么好,明暗交界线很明显,等等卡通风格的一系列特征, 也叫Non-photorealisticrendering非真实渲染 重点要做到两点: 1.    描边 2.    着色 另:本片中cg函数均用绿色标明,想了解函数作用和函数内部构成请看这篇文章NVIDIA CG语言 函数之所有数学类函数(Mathematical Functions) 就从最初的描边开始 首先声明变量_Outline挤出描边的粗细_Factor挤出多远 Properties {

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译)

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译) (2012-12-24 13:22:17) 转载▼ 标签: it cocos2d opengl 着色器 渲染 翻译:弹涂鱼 PS:欢迎加入开发群:285275050 本文翻译自:http://www.raywenderlich.com/10862/how-to-create-cool-effects-with-custom-shaders-in-opengl-es-2-0-and-cocos2d-2-x#

unity3d shader 学习

[浅墨Unity3D Shader编程] 着色器参考 [Unity Shaders]

(译)Minimal Shader(最小的着色器)

(原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basic steps to create a minimal Cg shader in Unity. 本节课包含了在Unity中创建一个最小的Cg着色器的基本步骤. Starting Unity and Creating a New Project(打开Unity创建一个新工程) After downlo

gcc中预定义的宏__GNUC__

今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以此记录.GNU C预定义了一系列的宏,这些宏都是以双下划线开始的,这里只讲一下__GNUC__  __GNUC_MINOR__ __GNUC_PATCHLEVEL__,其他GNU C的预定义宏可以到这里查看: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/cpp/Common-Predefined-Macros.html#Common-Predefined-Ma

【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=165 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的具体写法,以及几个常用的CG函数的用法. 在这里先说明一下,表面着色器将分为

Unity3D - 图形性能优化:优化着色器加载时间

Unity官方文档之"图形性能优化-优化着色器加载时间"的翻译,E文链接. Optimizing Shader Load Time 优化着色器加载时间 Shaders are small programs that execute on the GPU, and loading them can take some time. Each individual GPU program typically does not take much time to load, but shade