ほぼすべての海洋アニメーションのトピック (プログラミングと数学も) を読み、最終的に反射、屈折、およびコースティクスを使用して Gerstner 波でレンダリングすることにしました。さて、今私の反射は平面と垂直変位のみで動作していますが、Gerstner 波では x、z 座標も変位し、カメラが特定の高さを下回ったり、角度。(海面に近いほど、テクスチャが包み込みます)
だから、私のシェーダーコード: Gerstner Wave:
vec3 calcWave(vec2 X,float t,float A,vec2 K,float L)
{
vec3 wave;
float k = 2*pi/L;
float W = sqrt(g*k);
wave.xz = -((K/k)*A*sin(dot(K,X)-W*t));
wave.y = A*cos(dot(K,X)-W*t)/2-A/2;
//I do it this way so the max wave amplitude is always
//lower than the plane of the reflection, so I can't see bellow it
return wave;
};
テクスチャ座標
頂点シェーダー:
undisplaced_world_Vertex.xzw=world_Vertex.xzw;
//this is before the wave calculation, so it contains simple grid coordinates without any displacement
undisplaced_world_Vertex.y = waterLevel;
フラグメントシェーダー:
vec4 screenCoord = mvp_matrix*undisplaced_world_Vertex;
vec2 projCoord=vec2((screen_coord.x/screen_coord.w+1)/2,(screen_coord.y/screen_coord.w+1)/2);
Deep-Water Animation and Renderingの記事の反射部分を読んだところですが、実装方法がわかりません。
私の質問は、反射テクスチャのテクスチャ座標を投影する方法であるため、私の2つの期待に適合します:
- テクスチャ座標が常に範囲内にあるか、画面の端に最小限のラップがあります
- どの角度から見ても、テクスチャの「下」は見えません (またはごくわずかです:P)
また、法線とともに移動します。
編集:
理解の問題:
vec3 R = ReflectLeave(viewerDir,normal);
float4 projR = float4(Rh,0)*ReflViewProjTM;
float2 reflUV = (projR.xy / projR.z) * float2(0.5,-0.5)+float2(0.5,0.5);
half4 refl = tex2D(reflTex,reflUV);
:/