在GLSL的内建函数中,经常看到参数的类型为genType之类,genType到底指的是什么类型?
- 当函数的输入参数类型(和对应的输出类型)为float, vec2, vec3, or vec4时, 使用genType作为参数的类型;
- 当函数的输入参数类型(和对应的输出类型)为int, ivec2, ivec3, or ivec4时, 使用genIType作为参数的类型;
- 当函数的输入参数类型(和对应的输出类型)为uint, uvec2, uvec3, or uvec4时, 使用genUType作为参数的类型;
- 当函数的输入参数类型(和对应的输出类型)为bool, bvec2, bvec3, or bvec4时, 使用genBType作为参数的类型;
- 当函数的输入参数类型(和对应的输出类型)为double, dvec2, dvec3, or dvec4时, 使用genDType作为参数的类型;
具体到某个GLSL函数时,会使用实际的类型替代genType, genIType, genUType, or genBType,同时输出的类型的组件数与输入类型的组件数相同,这一句有点绕,举个例子:
mod 函数定义为:
genType mod(genType x,float y);
genType mod(genType x,genType y);
genDType mod(genDType x,double y);
genDType mod(genDType x, genDType y);
返回值:x - y * floor(x/y)
具体到某个渲染器里,可以有这样的写法 mod(uv, 2.0)
uv坐标是vec2类型,vec2本身就有两个值,那么函数返回应该还是一个vec2,包含两个值,假设这个uv坐标时(3.0, 4.0),那么返回值应该是:(3.0-2.0floor(3.0/2.0), 4.0-2.0floor(4.0/2.0)), 结果为(1.0, 0.0)
在ShaderToy中,uv坐标如果做了规范化处理,uv.x, uv.y都落在[0,1]之间,那么mod(uv, 1.0), 结果 uv = mod(uv, 1.0).
在渲染器里使用最多的还是 genType, genDType, 就是以 float, double为基本元素的参数。尤其是以 float 为基本元素的 float, vec2, vec3, vec4.