Opengl Gerstner波与反射纹理

Opengl Gerstner波与反射纹理,opengl,reflection,textures,shader,ocean,Opengl,Reflection,Textures,Shader,Ocean,我读过几乎所有的海洋动画主题(编程和数学),最后我决定用带有反射、折射和焦散的Gerstner波进行渲染。 好的,现在我的反射在平面上工作,只有垂直位移,但在Gerstner波中,我也移动了x,z坐标,当我的相机在特定高度下或改变角度时,我的反射纹理坐标超出范围。 (海洋表面越近,纹理包裹越多) 因此,我的着色器代码: Gerstner波浪: vec3 calcWave(vec2 X,float t,float A,vec2 K,float L) { vec3 wave; float k = 2

我读过几乎所有的海洋动画主题(编程和数学),最后我决定用带有反射、折射和焦散的Gerstner波进行渲染。 好的,现在我的反射在平面上工作,只有垂直位移,但在Gerstner波中,我也移动了x,z坐标,当我的相机在特定高度下或改变角度时,我的反射纹理坐标超出范围。 (海洋表面越近,纹理包裹越多)

因此,我的着色器代码: Gerstner波浪:

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;
};
纹理坐标

顶点着色器:

片段着色器:

我刚刚阅读了深水动画和渲染文章中的反射部分,但我不知道如何实现它

我的问题是如何投影反射纹理的纹理坐标,使其符合我的两个期望:

  • 纹理坐标始终在范围内,或者在屏幕边缘有一个最小的包裹
  • 从每个角度看,我都看不到纹理的“下方”(或者只有一点点:P)
此外,它将被法线置换

编辑:

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;
};
理解方面的问题:

vec3 R = ReflectLeave(viewerDir,norma­l);
float4 projR = float4(Rh,0)*ReflViewProjT­M;
float2 reflUV = (projR.xy / projR.z) * float2(0.5,-0.5)+float2(0.5,0.5);
half4 refl = tex2D(reflTex,reflUV);

:/

您可以尝试的一种非常便宜的方法是使用镜像重复纹理包裹模式。这对于许多遇到类似问题的后处理效果来说很方便,比如SSAO。事实上,这并不能解决问题,但在人眼看来,镜像的包装行为往往令人信服地自然;人类是愚蠢的。谢谢,这是有效的,昨天我得到了这个代码:/*vec3r=ReflectLeave(viewerDir,norma-l);浮动4项目=浮动4(右侧,0)*反射视图项目;float2 reflUV=(projR.xy/projR.z)*float2(0.5,-0.5)+float2(0.5,0.5);half4 refl=tex2D(reflTex,reflUV);*/但是还不清楚,reflectleave,Rh,ReflectViewProjTM它们是否反映了(…)、第一行中的R和飞机上反映的mvp矩阵?对不起,我很难阅读评论表单中的信息-你可以用这个新的更新编辑你的问题吗?当然,这是一个youtuber,他有非常漂亮的水,就像在海洋的水晶1。他/她说这是Sobo/2K捷克语。你知道,我真的不知道这是什么<代码>反射(…)是HLSL中着色器模型1.0的一部分,因此无需重新发明轮子
ReflectLeave(…)
必须做些别的事情,但是没有评论我说不出是什么。由于
R
在任何地方都没有被引用,并且将OpenGL风格的向量表示法与HLSL代码的其余部分混合在一起,这就更令人费解了:)
vec3 R = ReflectLeave(viewerDir,norma­l);
float4 projR = float4(Rh,0)*ReflViewProjT­M;
float2 reflUV = (projR.xy / projR.z) * float2(0.5,-0.5)+float2(0.5,0.5);
half4 refl = tex2D(reflTex,reflUV);