Nvidia Optix eye space 交点
Nvidia Optix eye space intersection points
如何在 OptiX 程序中计算眼睛 space 交点坐标?
我的研究表明只提供了对象和世界坐标,但我无法相信没有办法获得眼睛 space 坐标。
可以像这样通过相机方向旋转交点:
__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;
Optix 没有眼睛坐标。因为它基于光线追踪而不是光栅。首先你应该问问自己眼坐标是什么。用于基于光栅的着色器。基本上用于深度测试、裁剪等。但所有这些在光线追踪着色器中都不是问题。当一条射线从世界坐标中的一个点向某个方向投射时,后面的执行都是在世界坐标中。没有剪裁,因为所有光线基本上都代表特定像素。并且没有深度测试,因为所有的光线都是在相交程序中检测到的,只有最近的命中点才会被传递给封闭的命中程序。所以总而言之,你应该放弃一些基于光栅着色的机制或管道,并获得一些用于基于光线跟踪的着色的新技能。
糟糕的英语,我的道歉:)
如何在 OptiX 程序中计算眼睛 space 交点坐标?
我的研究表明只提供了对象和世界坐标,但我无法相信没有办法获得眼睛 space 坐标。
可以像这样通过相机方向旋转交点:
__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;
Optix 没有眼睛坐标。因为它基于光线追踪而不是光栅。首先你应该问问自己眼坐标是什么。用于基于光栅的着色器。基本上用于深度测试、裁剪等。但所有这些在光线追踪着色器中都不是问题。当一条射线从世界坐标中的一个点向某个方向投射时,后面的执行都是在世界坐标中。没有剪裁,因为所有光线基本上都代表特定像素。并且没有深度测试,因为所有的光线都是在相交程序中检测到的,只有最近的命中点才会被传递给封闭的命中程序。所以总而言之,你应该放弃一些基于光栅着色的机制或管道,并获得一些用于基于光线跟踪的着色的新技能。
糟糕的英语,我的道歉:)