Opengl glsl折射导致无法解释的错误

Opengl glsl折射导致无法解释的错误,opengl,glsl,Opengl,Glsl,我正在尝试渲染一个部分位于水下的风景(由定向日光灯照亮),阳光应该通过撞击水来折射,我尝试使用glsl折射(vec3入射、vec3法线、浮动相对)来模拟,但产生的折射方向会导致着色器崩溃,产生完全黑色的地形颜色 我已经意识到问题是,在我的着色器中,我取这个折射光方向和曲面法线的点积,这个点积返回小于或等于零的值,即使将相对折射率设置为1,情况也是如此,如下所示: in vec3 surface_normal_worldspace; in vec3 surface_location_worldsp

我正在尝试渲染一个部分位于水下的风景(由定向日光灯照亮),阳光应该通过撞击水来折射,我尝试使用glsl
折射(vec3入射、vec3法线、浮动相对)来模拟,但产生的折射方向会导致着色器崩溃,产生完全黑色的地形颜色

我已经意识到问题是,在我的着色器中,我取这个折射光方向和曲面法线的点积,这个点积返回小于或等于零的值,即使将相对折射率设置为1,情况也是如此,如下所示:

in vec3 surface_normal_worldspace;
in vec3 surface_location_worldspace;
uniform vec3 sunDirection_worldspace;
out vec3 color;

void main()
{
    vec3 water_normal=vec3(0,1,0);
    if (surface_location_worldspace.y<0)//if below water, use refraction
    {
         vec3 refracted_sunDirection_worldspace=refract(sunDirection_worldspace,water_normal,1.f);//logically this should result in no refraction at all, in other words refracted sun direction should be equal to sun direction, and the dot product should be equal, and not cause error
        color = vec3(clamp(dot(refracted_sunDirection_worldspace,surface_normal_worldspace),0,1));
    }
    else
    {
        color = vec3(clamp(dot(sunDirection_worldspace,surface_normal_worldspace),0,1));//in reality my shader is way more complex than this, but this is only to demonstrate the error
    }
}
在vec3曲面中_法线_世界空间;
在vec3中,表面位置世界空间;
均匀vec3太阳方向_世界空间;
输出vec3颜色;
void main()
{
vec3-water_-normal=vec3(0,1,0);

如果(surface_location_worldspace.y因为“海平面以上”的地形是白色的,它看起来像太阳方向_worldspace和水方向_normal都指向同一个方向。这就是折射的问题。根据定义,eta=1只会导致输出与点(I,N)时的输入相等<0.

我似乎混淆了太阳方向(我使用的阴影是从碎片到太阳的方向,这是我需要的)和太阳光传播的方向。解决方案是用
折射(太阳方向世界空间,水正常,1.f);
替换
-折射(-sunddirection\u worldspace,water\u normal,1.f);