我已经阅读了几乎所有的海洋动画主题(编程和数学),最后我决定用带有反射、折射和焦散的 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文章中的反射部分,但我不知道如何实现它。
我的问题是如何投影反射纹理的纹理坐标,所以它符合我的两个期望:
- 纹理坐标总是在范围内,或者屏幕边缘有一个最小的环绕
- 从每个角度看,我都看不到纹理的“下方”(或者只是一点点: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);
:/