【问题标题】:Finding the length of a ray intersecting with an infinite plane找到与无限平面相交的射线的长度
【发布时间】:2021-04-10 17:28:42
【问题描述】:

我正在尝试使用后期处理着色器来创建水体。水位将处于 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;
}

类似成功的project,但在一个球体上。

【问题讨论】:

  • 您找到解决此问题的方法了吗?如果我的回答有帮助,请考虑accepting it
  • 您的回答效果很好。非常感谢!

标签: unity3d hlsl post-processing


【解决方案1】:

基于this answerTrillian

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;
}

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2012-09-26
    • 2014-07-21
    相关资源
    最近更新 更多