/*
* @function getWave : 绘制水面纹理
* @param positionInWorldCoord : 世界坐标(绝对坐标)
* @return : 纹理亮暗系数
*/
float getWave(vec4 positionInWorldCoord) {
// 小波浪
float speed1 = float(worldTime) / (noiseTextureResolution * 15);
vec3 coord1 = positionInWorldCoord.xyz / noiseTextureResolution;
coord1.x *= 3;
coord1.x += speed1;
coord1.z += speed1 * 0.2;
float noise1 = texture2D(noisetex, coord1.xz).x;
// 混合波浪
float speed2 = float(worldTime) / (noiseTextureResolution * 7);
vec3 coord2 = positionInWorldCoord.xyz / noiseTextureResolution;
coord2.x *= 0.5;
coord2.x -= speed2 * 0.15 + noise1 * 0.05; // 加入第一个波浪的噪声
coord2.z -= speed2 * 0.7 - noise1 * 0.05;
float noise2 = texture2D(noisetex, coord2.xz).x;
return noise2 * 0.6 + 0.4;
}
/*
* @function drawWater : 基础水面绘制
* @param color : 原颜色
* @param positionInWorldCoord : 我的世界坐标
* @param positionInViewCoord : 眼坐标
* @param normal : 眼坐标系下的法线
* @return : 绘制水面后的颜色
* @explain : 因为我太猪B了才会想到在gbuffers_water着色器中绘制水面
导致后续很难继续编程 我爬
*/
vec3 drawWater(vec3 color, vec4 positionInWorldCoord, vec4 positionInViewCoord,
vec3 normal) {
positionInWorldCoord.xyz += cameraPosition; // 转为世界坐标(绝对坐标)
// 波浪系数
float wave = getWave(positionInWorldCoord);
vec3 finalColor = mySkyColor;
finalColor *= wave; // 波浪纹理
// 透射
float cosine = dot(normalize(positionInViewCoord.xyz), normalize(normal));
// 计算视线和法线夹角余弦值
cosine = clamp(abs(cosine), 0, 1);