前言
不知不觉已经学习了挺久了,今天也要努力,继续做大做强哦
写基础代码
无脑写基础代码,虽然我也挺厌倦了,不过每次写就当回顾吧
1 | import * as THREE from "three"; |
替换shader
使用webgl的shader替换我们生成的材质
在main.js中引入shader
1 | import vertexShader from "../shaders/water/vertex.glsl"; |
在vertex.glsl中写入顶点着色器
1 | void main(){ |
在fragment.glsl中写入片元着色器
1 | void main(){ |
这样就可以生成一个红色的正方形
添加双面可视
1 | const shaderMaterial = new THREE.ShaderMaterial({ |
使用sin函数生成波纹
使用sin函数让顶点着色器高低有变化
1 | void main(){ |
使用nocice噪声生成波纹
将bookshader中的noise函数拷贝到fragment.glsl中
1 | // 开启低精度,减少计算量 |
顶点着色器main函数中添加根据噪声生成的高度
1 | elevation += cnoise(vec2(modelPosition.xz)); |
根据高低生成高低的不同颜色
在顶点着色器中把高低的参数传出去
- 在顶点着色器中定义一个varying变量
1
2// 计算出的高度传递给片元着色器
varying float vElevation; - main函数中赋值
1
vElevation = elevation;
在片元着色器中接受这个高度变量
1 | varying float vElevation; |
通过gui调整
这时候我们已经生成了一个基本的水面,但是我们想要调整一些参数,这时候我们可以使用dat.gui来调整参数
调整高低处的颜色
在main.js中
1 | const params = { |
在片元着色器中
1 | precision lowp float; |
调整波纹的频率
在main.js中
1 | const params = { |
在顶点着色器中
1 | uniform float uWaresFrequency; |
让我们调整下频率
添加波纹比例
在main.js中,步骤和上面都一样,我就简写了
1 | //param中 |
在顶点着色器中
1 | uniform float uScale; |
让我们调整下比例
添加噪声频率和比例
在main.js中
1 | //param中 |
在顶点着色器中
1 | uniform float uNoiseFrequency; |
让我们调整下比例
波形尖锐
目前我们可以看出来,波纹是圆滑的,我们可以通过下面的方式让波纹变得尖锐
因为我们的波浪是一个sin函数,而sin函数的曲线大家脑子里面肯定有概念,是一个波浪形的,因此就会每个点都很圆润,如果我们使用绝对值,那么sin函数曲线在y等于0的点,就会有一个很尖锐的点。
在顶点着色器中
1 | elevation += -abs((cnoise(vec2(modelPosition.xz*uNoiseFrequency)))) *uNoiseScale; |
添加其他参数
1 | const params = { |
1 | precision lowp float; |
添加时间函数流动起来
main.js
1 | const clock = new THREE.Clock(); |
顶点着色器
1 | void main(){ |