Camera 从屏幕坐标计算光线方向矢量

Camera 从屏幕坐标计算光线方向矢量,camera,rendering,hlsl,Camera,Rendering,Hlsl,我正在寻找一种更好的方法(或者注意,这是最好的方法)将像素坐标从任意相机位置/方向转移到相应的光线方向 我目前的方法如下。我将“摄影机”定义为位置向量、注视向量和上方向向量,并以此命名。(请注意,注视向量是相机所面对方向上的单位向量,而不是(位置-注视)方向,这是XNA矩阵中的标准。CreateLookAt)这三个向量可以唯一定义相机位置。这是实际的代码(不是实际的,是一个简化的抽象版本)(语言是HLSL) (返回值是光线的方向) 因此,我要问的是-有什么更好的方法可以做到这一点,可能是使用矩阵

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

我目前的方法如下。我将“摄影机”定义为位置向量、注视向量和上方向向量,并以此命名。(请注意,注视向量是相机所面对方向上的单位向量,而不是(位置-注视)方向,这是XNA矩阵中的标准。CreateLookAt)这三个向量可以唯一定义相机位置。这是实际的代码(不是实际的,是一个简化的抽象版本)(语言是HLSL)

(返回值是光线的方向)

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

你可以在像素着色器中计算(
光线),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);
}
有关相机位置和方向的信息位于
视图
矩阵(matrix.CreateLookAt)中

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);
}