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