从捕鱼3中提取了实现ocean的相关素材、material和shader, 但是仍然重现不了捕鱼3的效果,有几个参数不太明白,望大神指点一二。
uniform vec3 u_cameraWorldPosition;//相机的世界坐标,不知道多少合适
uniform float BumpScale;
uniform vec2 textureScale;
uniform vec2 bumpSpeed;
//uniform vec4 u_time;
uniform float waveFreq;
uniform float waveAmp;
uniform mat4 u_worldMatrix;//这个矩阵是什么意思?ps:下面我用CC_PMatrix替换了这个矩阵
uniform mat4 u_viewProjectionMatrix;//这个矩阵是什么意思?ps:下面我用CC_MVPMatrix替换了这个矩阵,但是得到的效果不对劲
uniform vec4 u_waveFactor;
varying mat3 rotMatrix; // transform from tangent to obj space
varying vec4 UV0;
varying vec4 UV1;
varying vec3 eyeVector;
attribute vec3 a_position;
attribute vec2 a_texCoord;
// wave functions
struct Wave {
float freq; // 2*PI / wavelength
float amp; // amplitude
float phase; // speed * 2*PI / wavelength
vec2 dir;
};
void main(void)
{
float time = CC_Time.z*2.0;
#define NWAVES 2
Wave wave;
wave.freq = waveFreq;
wave.amp = waveAmp;
wave.phase = 0.5236;
wave.dir = vec2(-1.3, 0.0);
wave.freq = 3.0 * waveFreq;
wave.amp = 0.33 * waveAmp;
wave.phase = 1.57;
wave.dir = vec2(-0.7, 0.7);
vec4 P = CC_MVMatrix * vec4(a_position, 1.0);
// sum waves
float ddx = 0.0, ddy = 0.0;
float deriv = 0.0;
float angle = 0.0;
float ampFactor = clamp( (1.0-a_texCoord.y)+u_waveFactor.x, 0.0, 1.0 );
float freqFactor = 1.0 + clamp( (a_texCoord.y+u_waveFactor.y ), 0.0, 1.0 )*u_waveFactor.z;
// wave synthesis using two sine waves at different frequencies and phase shift
/**
for(int i = 0; i<NWAVES; ++i)
{
float freq = wave.freq * freqFactor;
vec2 vertexXZ = vec2(P.x, P.z);
angle = dot(wave.dir*(1.0+(1.0-a_texCoord.y)*4.0), vertexXZ) * freq + time * wave.phase;
P.y += wave.amp * sin( angle )*0.05;
// calculate derivate of wave function
deriv = freq * wave.amp * cos(angle);
ddx -= deriv * wave.dir.x;
ddy -= deriv * wave.dir.y;
}
//*/
float freq = wave.freq * freqFactor;
vec2 vertexXZ = vec2(P.x, P.z);
{
angle = dot(wave.dir*(1.0+(1.0-a_texCoord.y)*4.0), vertexXZ) * freq + time * wave.phase;
P.y += wave.amp * sin( angle )*0.05;
// calculate derivate of wave function
deriv = freq * wave.amp * cos(angle);
ddx -= deriv * wave.dir.x;
ddy -= deriv * wave.dir.y;
}
{
freq = wave.freq * freqFactor;
vertexXZ = vec2(P.x, P.z);
angle = dot(wave.dir*(1.0+(1.0-a_texCoord.y)*4.0), vertexXZ) * freq + time * wave.phase;
P.y += wave.amp * sin( angle )*0.05;
// calculate derivate of wave function
deriv = freq * wave.amp * cos(angle);
ddx -= deriv * wave.dir.x;
ddy -= deriv * wave.dir.y;
}
// compute the 3x3 transform from tangent space to object space
// compute tangent basis
vec3 T = normalize(vec3(1.0, ddy, 0.0)) * BumpScale; // Tangent
vec3 B = normalize(vec3(0.0, ddx, 1.0)) * BumpScale; // Binormal
vec3 N = normalize(vec3(ddx, 1.0, ddy)); // Normal
rotMatrix = mat3(T, B, N);
gl_Position = CC_PMatrix * P;
UV0.xy = a_texCoord.xy;
// calculate texture coordinates for normal map lookup
UV0.zw = a_texCoord.xy * textureScale + time * bumpSpeed;
UV1.xy = a_texCoord.xy * textureScale * 2.0 + time * bumpSpeed * 4.0;
UV1.zw = a_texCoord.xy * textureScale * 4.0 + time * bumpSpeed * 8.0;
eyeVector = P.xyz - u_cameraWorldPosition; // eye position in vertex space, 没有设置u_cameraWorldPosition的值,得到的效果只有轻微的起伏效果
}
```