Unity3d 求与无限平面相交的光线的长度

Unity3d 求与无限平面相交的光线的长度,unity3d,hlsl,post-processing,Unity3d,Hlsl,Post Processing,我尝试使用后期处理着色器来创建水体。水位将处于y=0,该边界下的任何内容都将受到着色器的影响。我将从着色器中的摄影机位置投射光线,并检索每条光线到地面的距离。然后,我将使用这些信息来计算你看到多少水,以便计算表面的颜色。问题是我不知道如何检测和计算光线在与y=0相交之前经过的距离。我有没有办法达到这个效果 失败代码 float rayGroundIntersect(float3 rayOrigin, float3 rayDir) { if (rayDir.y <= 0) {

我尝试使用后期处理着色器来创建水体。水位将处于y=0,该边界下的任何内容都将受到着色器的影响。我将从着色器中的摄影机位置投射光线,并检索每条光线到地面的距离。然后,我将使用这些信息来计算你看到多少水,以便计算表面的颜色。问题是我不知道如何检测和计算光线在与y=0相交之前经过的距离。我有没有办法达到这个效果

失败代码

float rayGroundIntersect(float3 rayOrigin, float3 rayDir) {
    if (rayDir.y <= 0) {
        return maxFloat;
    }
    float a = rayOrigin.y / rayDir.y;
    float l = length(rayDir.xz * a);
    return l;
}
float-rayGroundIntersect(float3-rayOrigin,float3-rayDir){
如果(rayDir.y基于


你找到了解决这个问题的方法吗?如果我的答案有帮助,请考虑。你的答案很好。非常感谢!
float rayGroundIntersect(float3 rayOrigin, float3 rayDir) {
    float denom = dot(float3(0,1,0), rayDir);
    if (abs(denom) > 0.0001f)
    {
        // negate normal instead of rayOrigin
        float t = dot(rayOrigin, float3(0,-1,0)) / denom; 
        return t >= 0 ? t : maxFloat;
    }
    return maxFloat;
}