2016-11-16 102 views

回答

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.0)在相机/眼/传感器的位置中心。我用更高级的功能更新了我的答案 –

+0

对于我今天意识到的非相对问题答案,我向你道歉。我认为,通过我坚持不需要存在的方式,将世界空间中的交叉点转化为“视线空间”是容易的。只需将该点与您传递给ray-gen-program的相机逆矩阵相乘即可​​。 –