Godot Shader笔记:你的第一个3D Shader 第二
2019-06-30 本文已影响0人
吃烧烤的老王
原文地址:Docs » Shading » Your first shader » Your first Spatial shader: part 2
用TIME
让它动起来
回到顶点函数中,我们可以使用内置属性TIME
让海浪动起来。
TIME
是一个可以在顶点函数和片元函数中访问的内置属性。
在上个教程中,我们通过一个高度图读取高度。在这个教程中,我们依然那样做,只不过把读取高度图放到height()
中。
float height(vec2 position) {
//scaling factor is based on mesh size (This PlanMesh is 10x10)
return texture(noise, position / 10.0).x;
}
为了使用TIME
,我们需要增加一个参数。
float height(vec2 position, float time) {
}
并且确保在顶点函数中正确地传递进去。
void vertex() {
vec2 pos = VERTEX.xz;
float k = height(pos, TIME);
VERTEX.y = k;
}
这次我们并不使用normalmap
去计算法线,而是在顶点函数中手动计算它们。代码如下:
NORMAL = normalize(vec3(k - height(pos + vec2(0.1, 0.0), TIME), 0.1, k - height(pos + vec2(0.0, 0.1), TIME)));
我们需要手动计算法线,因为在下个部分我们要使用数学去创造看起来更复杂的波浪。
现在,我们要使用TIME
的cosine
来偏移position
,因此height()
函数可能会变得更复杂一些。
float height(vec2 position, float time) {
vec2 offset = 0.01 * cos(position + time);
return texture(noise, (position / 10.0) - offset).x;
}
这样,海浪会缓慢地动起来,但是好象不太自然。下个部分将进一步使用shader创造更复杂的效果,在这里我们会添加些更复杂的数学函数来让海浪更真实。