Godot Shader笔记:你的第一个3D Shader 第二部分(三)

原文地址: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)));

我们需要手动计算法线,因为在下个部分我们要使用数学去创造看起来更复杂的波浪。

现在,我们要使用TIMEcosine来偏移position,因此height()函数可能会变得更复杂一些。

float height(vec2 position, float time) {
 vec2 offset = 0.01 * cos(position + time);
 return texture(noise, (position / 10.0) - offset).x;
}

这样,海浪会缓慢地动起来,但是好象不太自然。下个部分将进一步使用shader创造更复杂的效果,在这里我们会添加些更复杂的数学函数来让海浪更真实。

你可能感兴趣的:(Godot Shader笔记:你的第一个3D Shader 第二部分(三))