【问题标题】:Nvidia Optix eye space intersection pointsNvidia Optix 眼空间交点
【发布时间】:2017-05-24 21:08:03
【问题描述】:

如何在 OptiX 程序中计算眼空间交点坐标?

我的研究表明只提供了物体和世界坐标,但我不敢相信没有办法获得眼睛空间坐标。

【问题讨论】:

    标签: nvidia raytracing optix


    【解决方案1】:

    可以像这样通过相机方向旋转交点:

    __device__ void worldToEye(float3& pointInOut)
    {
        const float3 Un = normalize(U);
        const float3 Vn = normalize(V);
        const float3 Wn = normalize(W);
    
        const float viewMat[3][3] = {{Un.x, Un.y, Un.z},
                                    {Vn.x, Vn.y, Vn.z},
                                    {Wn.x, Wn.y, Wn.z}};
    
        float point[3]  = {pointInOut.x, pointInOut.y, pointInOut.z};
        float result[3] = {0.0f, 0.0f, 0.0f};
    
        for (int i=0; i<3; ++i)
        {
            for (int j=0; j<3; ++j)
            {
                result[i] += viewMat[i][j] * point[j];
            }
        }
    
        pointInOut.x = result[0];
        pointInOut.z = result[1];
        pointInOut.y = result[2];
    }
    

    计算输入点:

    float3 hit_point = t_hit * ray.direction;
    worldToEye(hit_point);
    prd.result = hit_point;
    

    【讨论】:

      【解决方案2】:

      Optix 没有眼坐标。因为它基于光线追踪而不是光栅。首先你应该问自己什么是眼坐标。用于基于光栅的着色器。基本上用于深度测试、裁剪等。但所有这些都不是光线追踪着色器中的事情。当光线从世界坐标中的某个点向某个方向投射时,接下来的执行都是世界坐标。没有剪裁,因为所有光线基本上都代表特定像素。并且没有深度测试,因为在相交程序中检测到所有光线,只有最近的命中点将被传递到封闭的命中程序。所以总而言之,你应该放弃一些用于基于光栅着色的机制或管道,并获得一些用于基于光线追踪的着色的新技能。

      英语不好,我很抱歉:)

      【讨论】:

      • RayTracing 中的眼睛空间 = (0.0, 0.0, 0.0) 中心在相机/眼睛/传感器位置。我用更高级的功能更新了我的答案
      • 对于我今天意识到的与问题无关的答案,我向您道歉。我认为将世界空间中的交叉点转换为“眼睛空间”很容易,顺便说一下,我坚持认为没有必要存在。只需将该点与传递给 ray-gen-program 的相机逆矩阵相乘即可​​。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多