游戏开发

Godot Shader笔记:着色器语言(二)

2019-06-13  本文已影响0人  吃烧烤的老王

原文地址:Docs » Shading » Shading reference » Shading language

类型转换(Casting)

和GLSL ES 3.0一样,无论是标量(Scalar)还是向量(Vector),即使维度(size)相同,但如果类型不同,也是无法进行隐式(implicit)类型转换。如果连维度都不同,则更加不能够隐式转换。所有的类型转换必须是显式(explicit)的且基于构造函数来实现。

例子

float a = 2; // 非法
float a = 2.0; // 合法
float a = float(2); // 合法

默认的整型是有符号的,因此要赋值给无符号整型也需要进行类型转换

int a = 2; // 合法
uint a = 2; // 非法
uint a = uint(2); // 合法
成员变量(Members)

向量中的分量值可以使用“x”, “y”, “z” 或者“w”来访问,同时也可已使用“r”, “g”, “b” 和“a”来访问,二者是等效的。哪一个更加直观方便就可以使用哪一个。

对于矩阵(matrices),可以使用m[row][colum]的形式访问其每一个元素,或者以m[idx]的形式使用行索引(row index)访问一个行向量。例如访问一个mat4(4x4的矩阵)中的位置y,我们可以这样做m[3][1]

构造(Constructing)

构造向量类型可以按照如下例子传参数:

// 传递所需数量的分量参数
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
// 传递互补的 向量 及/或 标量
vec4 a = vec4(vec2(0.0, 1.0), vec2(2.0, 3.0));
vec4 a = vec4(vec3(0.0, 1.0, 2.0), 3.0);
// 也可以为整个向量传一个值
vec4 a = vec4(0.0);

构造矩阵要求向量的维度和矩阵维精度(Precision)度相同,当然你也可以使用matx(float)的形式构造一个对角矩阵(diagonal matrix),例如mat4(1.0)代表一个4维单位矩阵(identity matrix)

mat2 m2 = mat2(vec2(1.0, 0.0), vec2(0.0, 1.0));
mat3 m3 = mat3(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0));
mat4 identity = mat4(1.0);

矩阵可以由不同维度的矩阵创建,但是要注意两个原则:

  1. 如果用一个小维度矩阵创建一个大维度矩阵,那么剩余的部分,将由大维度矩阵的单位矩阵相对应值填充

  2. 如果用一个大维度矩阵创建一个小维度矩阵,那么将截取大维度矩阵左上角的子矩阵

mat3 basis = mat3(WORLD_MATRIX);
mat4 m4 = mat4(basis);
mat2 m2 = mat2(m4);
混写(Swizzling)

(注:Swizzling直译是旋转,在此处的意译取网上的一种翻译"混写")

混写是指可以获取向量分量任意顺序组合,只要(组合的)结果依然是向量或者标量,举个例子更好理解:

vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
vec3 b = a.rgb; // 用vec4的分量“混写”构造一个vec3
vec3 b = a.ggg; // 依然合法; 用vec4的单一分量“混写”构造一个vec3
vec3 b = a.bgr; // 分量的顺序是无关紧要的
vec3 b = a.xyz; // 用xyzw依然等效
float c = b.w; // 非法, 因为作为vec3的b中不包含"w"分量.
上一篇下一篇

猜你喜欢

热点阅读