《捕鱼3》 主菜单海洋的实现

从捕鱼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的值,得到的效果只有轻微的起伏效果
}

```