0

任意のカメラ位置/方向から対応する光線方向にピクセル座標を転送するためのより良い方法(またはこれ最良の方法であることに注意してください)を探しています。

私の現在の方法は次のとおりです。私は「カメラ」を位置ベクトル、ルックアットベクトル、アップベクトルとして定義します。(lookatベクトルは、カメラが向いている方向の単位ベクトルであり、XNAのMatrix.CreateLookAtの標準のように、(position --lookat)が方向ではないことに注意してください)これらの3つのベクトルは、カメラの位置を一意に定義できます。これが実際のコードです(実際には、実際の単純化された抽象化バージョンではありません)(言語は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 に答える