简介
SandMod 在编译 着色器(Shader)程序时会先读取内置的预处理宏,这些内置宏有些是为了更符合主流的游戏着色器编辑习惯而适配的宏,有些是为了方便您编辑着色器程序的宏。
类型转换
为了更符合主流的游戏着色器编辑习惯而以宏的形式新增了以下类型:
| 转换后类型 | 等价类型 | 描述 |
| float2 / float3 / float4 | vec2 / vec3 / vec4 | 定义了更符合主流的游戏 着色器(Shader)编辑习惯的向量类型。 值得注意的是,替代性变量,不能在定义的时候使用,如 SandMod 只能编辑为 float2 a = vec2(1.0, 1.0) 。 |
| color | vec4 | 有利于区分颜色值和向量的颜色值类型。每个分量分别采用 0 至 1 之间的浮点数表示颜色值。 |
| half | mediump float | 以更符合主流的游戏 着色器(Shader)编辑习惯的方式定义中精度浮点数类型。 |
| half2 / half3 / half4 | mediump vec2 / mediump vec3 / mediump vec4 | 以更符合主流的游戏 着色器(Shader)编辑习惯的方式定义中精度浮点数向量类型。 值得注意的是,替代性变量,不能在定义的时候使用,如 SandMod 只能编辑为 half2 a = vec2(1.0, 1.0) 。 |
| fixed | lowp float | 以更符合主流的游戏 着色器(Shader)编辑习惯的方式定义低精度浮点数类型。 |
| fixed2 / fixed3 / fixed4 | lowp vec2 / lowp vec3 / lowp vec4 | 以更符合主流的游戏 着色器(Shader)编辑习惯的方式定义低精度浮点数向量类型。 值得注意的是,替代性变量,不能在定义的时候使用,如 SandMod 只能编辑为 fixed2 a = vec2(1.0, 1.0) 。 |
| float3x3 / float4x4 | mat3 / mat4 | 以更符合主流的游戏 着色器(Shader)编辑习惯的方式定义矩阵类型。 |
| half3x3 / half4x4 | mediump mat3 / mediump mat4 | 以更符合主流的游戏 着色器(Shader)编辑习惯的方式定义中精度矩阵类型。 |
您可以直接使用转换后的类型宏来定义参数,这样会让您的 着色器(Shader)程序更简洁。
基础公式
| 宏 | 等价公式 | 描述 |
ObjectToClipPos(v) | MatrixMVP * vec4(v.xyz, 1.0) | 该宏将导入此宏的模型顶点坐标等信息返回该顶点在屏幕上显示的坐标等信息。值得注意的是,使用此宏一定需要使用 using 命令引用 MatrixMVP Uniform,否则会导致 着色器(Shader)编译失败。 |
TRANSFORM_TEX(tex,name) | tex.xy * name.xy + name.zw | 该宏将模型、物体顶点的 UV 和平铺率、偏移率进行运算,计算出实际显示用的定点 UV,其中传入参数: · tex 是导入的图片纹理。 · name 是一个 vec4 类型的传入参数,前两个维度的参数(X,Y)分别控制 X(U 方向) 和 Y(V 方向)的平铺率;后两个维度的参数(Z,W)分别控制 X(U 方向) 和 Y(V 方向)的偏移率。 |
tex2D(tex,uv) | texture(tex, uv) | 为了更符合主流的游戏 着色器(Shader)编辑习惯,您可以使用此宏根据传入的 纹理(Texture)信息和 UV 坐标返回对应的 vec4 类型颜色值(RGBA 值)。 |
lerp | mix | 为了更符合主流的游戏 着色器(Shader)编辑习惯,您可以使用 lerp 代替 GLSL 中的 mix 来判断最小值。 |
mul(lhs, rhs) | lhs * rhs | 为了更符合主流的游戏 着色器(Shader)编辑习惯,您可以使用此宏获得两个数的乘积。 |
frac(v) | fract(v) | 为了更符合主流的游戏 着色器(Shader)编辑习惯,您可以使用此宏获得传入参数的小数部分。 |
saturate(v) | clamp(v, 0.0, 1.0) | 为了更符合主流的游戏 着色器(Shader)编辑习惯,您可以使用此宏将输入参数限制在 0 至 1 之间。即传入参数 v: · 小于 0,则返回值为 0。 · 大于 1,则返回值为 1。 · 在 0 至 1 之间,则直接返回 v 的值。 |
clip(x) | if(x < 0.0) discard | 表示当传入参数的值小于 0 时,将在 片元着色器(Fragment Shader)中放弃对当前片元的操作。 |
rsqrt(x) | 1.0 / sqrt(x) | 表示返回传入参数 2 次根的倒数。 |
rcp(x) | 1.0 / x | 表示返回传入参数的倒数。 |
无理数近似值
| 宏 | 等价值 | 描述 |
DEG_2_RAD | 0.01745329251 | 角度转弧度的转换比,即 π/180 的值。 |
PI | 3.1415926535 | 圆周率 π 。 |
INV_PI | 0.3183098861929 | 圆周率的倒数,即 1/π 。 |
LOG2_E | 1.44269504088896340736 | 表示以 2 为底 e 的对数值,通常也可以表达为 1/ln2 。 |
FLT_INF | asfloat(0x7F800000) | 浮点数最大值,表示正无穷大。 |
FLT_EPS | 5.960464478*10^(-8) | 单精度浮点数可表示的最小值,即 2^(-24) 。计算上 1 + FLT_EPS == 1 。 |
FLT_MIN | 1.175494351*10^(-38) | 最小规范化的 32 位正浮点数。 |
FLT_MAX | 3.402823466*10^38 | 32 位浮点数可表示的最大值。 |
HALF_EPS | 4.8828125*10^(-4) | 16 位浮点数可表示的最小值,即 2^(-11) 。 |
HALF_MIN | 6.103515625*10^(-5) | 最小规范化的 16 位正浮点数,即 2^(-14) 。 |
HALF_MAX | 65504.0 | 16 位浮点数可表示的最大值。 |
UINT_MAX | 0xFFFFFFFFu | 整型的最大值,表示正无穷大。 |
FLT_EPSILON | 1.192092896*10^(-7) | 表示单精度中 1 与大于 1 的第一个(或最小)浮点数之差,即 2^(-23) 。 计算上 1 + FLT_EPSILON > 1 。 |
阴影宏
| 宏 | 值 | 描述 |
SHADOW_ATTENUATION | 0 至 1 之间的浮点数。 | 通过此宏的返回值获取阴影的衰减因子,从而获取当前阴影的实时强度。 · 值为 0 表示阴影没有衰减,强度最强。 · 值为 1 表示阴影完全衰减,强度最弱,其中不符合以下条件的任意一条都视为此宏的值为 1: - 着色器(Shader)绑定的网格相关组件 接收阴影(Receive Shadows)属性值 未被勾选(False)。 - 着色器(Shader) 未执行 shader_feature_shadow 命令。 - 当前非 片元着色器(Fragment Shader)阶段。 |
雾效宏
| 宏 | 值 | 描述 |
CALC_FOG_FACTOR(z) | 0 至 1 之间的浮点数。 | 通过此宏的返回值获取当前雾效模式下距离摄像机为 z 位置的雾化因子值。关于雾化因子的详细介绍,请参阅 雾化因子 小节。 |
雾化因子
雾化因子在不同雾效模式下计算方式如下:
线性(Linear)模式:
f = (End−z)/(End−Start),雾化因子随距离线性变化。其中,z是当前顶点到摄像机的距离,Start和End分别表示雾开始和结束的距离。指数(Exponential)模式:
f = e^(−d*z),雾化因子呈指数变化。其中,z是当前顶点到摄像机的距离,d为 雾效密度(Fog Density)。指数平方(Exponential Squared)模式:
f = e^(−d*z)2,是指数雾的一种变体。
上述中的 f 就是雾化因子,它决定了最终像素颜色的计算方式。
通过 顶点着色器(Vertex Shader)控制雾化因子,您可以精确地调整雾效应的表现,从而达到理想的视觉效果。
着色器类型
| 宏 | 值 | 描述 |
COMPLIE_SHADER_TYPE | 0 | 当前 着色器(Shader)处于 顶点着色器(Vertex Shader)阶段。该阶段下,SandMod 会进行以下处理: · 将 discard 定义为空,使用 discard 时,它会被替换为空字符串,相当于无效。 · 将 dFdx 、 dFdy 、 fwidth 这些常见的 GLSL 函数或操作符定义为空操作,使得它们在代码中不产生任何效果,因为它们不能在顶点着色器阶段出现。 |
| 1 | 当前 着色器(Shader)处于 片元着色器(Fragment Shader)阶段。 |
其中 COMPLIE_SHADER_TYPE 宏为只读宏,不能赋值。
设备类型
| 宏 | 值 | 描述 |
IS_MOBLIE_PLATFORM | 0 | 当前运行项目的设备为 PC 平台(SandMod)。 |
| 1 | 当前运行项目的设备为移动平台(Blockman Go)。 |
其中 IS_MOBLIE_PLATFORM 宏为只读宏,不能赋值。
