Nvidia Optix眼睛空间交叉点

时间:2016-11-16 15:53:07

标签: nvidia raytracing optix

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-1)

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

英语不好,我道歉:)