0

我正在寻找一种更好的方法(或注意这最好的方法)将像素坐标从任意相机位置/方向传输到其相应的光线方向。

我目前的方法如下。我将“相机”定义为位置向量、观察向量和向上向量,命名为这样。(注意,lookat 向量是相机所面对方向上的单位向量,而不是(位置-lookat)是方向,就像 XNA 的 Matrix.CreateLookAt 中的标准一样)这三个向量可以唯一地定义一个相机位置。这是实际代码(嗯,不是真正的实际代码,是简化的抽象版本)(语言是 HLSL)

float xPixelCoordShifted = (xPixelCoord / screenWidth * 2 - 1) * aspectRatio;
float yPixelCoordShifted = yPixelCoord / screenHeight * 2 - 1;
float3 right = cross(lookat, up);
float3 actualUp = cross(right, lookat);
float3 rightShift = mul(right, xPixelCoordShifted);
float3 upShift = mul(actualUp, yPixelCoordShifted);
return normalize(lookat + rightShift + upShift);

(返回值是射线的方向)

所以我要问的是——有什么更好的方法来做到这一点,也许使用矩阵等。这种方法的问题是,如果你的视角太宽,屏幕的边缘会有点“径向拉伸” ”。

4

1 回答 1

-2

ray您可以在像素着色器、HLSL 代码中计算它( ):

float4x4 WorldViewProjMatrix; // World*View*Proj
float4x4 WorldViewProjMatrixInv; // (World*View*Proj)^(-1)

void VS( float4 vPos : POSITION,
     out float4 oPos : POSITION,
     out float4 pos  : TEXCOORD0 )
{
    oPos = mul(vPos, WorldViewProjMatrix);
    pos = oPos;
}

float4 PS( float4 pos : TEXCOORD0 )
{
    float4 posWS = mul(pos, WorldViewProjMatrixInv);
    float3 ray = posWS.xyz / posWS.w;

    return float4(0, 0, 0, 1);
}

有关相机位置和方向的信息在View矩阵 (Matrix.CreateLookAt) 中。

于 2012-05-15T17:31:54.770 回答