1
A
回答
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
Optix公司不具有眼坐标。因为它基于光线追踪而不是光栅。首先,你应该问自己什么是眼睛的协调。用于基于光栅渲染的着色器。 Basiclly用于深度测试,裁剪等。但所有这些都不是光线跟踪着色器中的事情。当一个光线从某个方向的世界坐标点中投射出来时,下面的处理都在世界坐标中。没有剪裁,因为所有的光线基本上代表特定的像素。并且没有深度测试,因为在相交节目中检测到所有光线,只有最近的击中点将被传送到关闭的击中程序。所以最后你应该放弃一些基于光栅渲染的机制或管线,并获得一些用于基于光线追踪的阴影的新技能。
差英语,我的道歉:)在光线追踪
眼空间=(0.0,0.0,0.0)在相机/眼/传感器的位置中心。我用更高级的功能更新了我的答案 –
对于我今天意识到的非相对问题答案,我向你道歉。我认为,通过我坚持不需要存在的方式,将世界空间中的交叉点转化为“视线空间”是容易的。只需将该点与您传递给ray-gen-program的相机逆矩阵相乘即可。 –