2016-04-17 7 views
1

レイトレースグラフィックスエンジンにラスタライズサポートを追加しようとしています。しかし、私はアプローチにかかわらず同じ画像を得ることを期待していました(もちろん、陰影は数えません)。キャスティングレイと頂点を投影するか?

代わりに、私は2つの異なるサイズでレンダリングされたテストモデルを取得しているので、レイトレーシング用の光線を投射する方法とは何か、またはラスタライズ用の投影マトリックスを作成する方法が必要であると推測しています。ここ

は(射影行列を構築担当)私の「カメラ」コンストラクタである:

Camera::Camera(float fLength, float fov, float targetRatio, float zNear, float zFar) 
{ 
    focalLength = fLength; 
    fieldOfView = fov; 
    aspectRatio = targetRatio; 
    scale = tan(fieldOfView * 0.5 * DEG_TO_RAD); 

    viewMatrix = Matrix4<float>(); 

    projectionMatrix = Matrix4<float>(); 

    float distance = zFar - zNear; 

    projectionMatrix.xx = scale/aspectRatio; 
    projectionMatrix.yy = scale; 
    projectionMatrix.zz = -(zFar + zNear)/distance; 
    projectionMatrix.zw = -1.0f; 
    projectionMatrix.wz = -2.0f * zNear * zFar/distance; 
    projectionMatrix.ww = 0.0; 

    //aperture = tan(fieldOfView/2 * DEG_TO_RAD) * focalLength * 2; 
    //fieldOfView = atan((aperture/2)/focalLength) * 2 * RAD_TO_DEG; 
} 

これは私が(私は方向を計算し得るフレームバッファの大きさと現在のピクセル座標に基づいて光線をキャストする方法でありますその最後のマトリクス行からカメラ位置):一方

Ray Camera::castRay(unsigned int width, unsigned int height, unsigned int x, unsigned int y) 
{ 
    float dirX = (2 * (x + 0.5)/(float)width - 1) * aspectRatio * scale; 
    float dirY = (1 - 2 * (y + 0.5)/(float)height) * scale; 

    Vector3<float> dir = (Vector3<float>(dirX, dirY, -1.0) * viewMatrix).normalize(); 

    return Ray(Vector3<float>(viewMatrix.wx, viewMatrix.wy, viewMatrix.wz), dir); 
} 

が、これは私がラスタライズ手法を使用して頂点をラスタ方法である:

Vector4<float> vertexInRasterSpace; 
    Vector4<float> vertexInCameraSpace; 

    vertexInCameraSpace = currentVertex * camera.viewMatrix; 
    vertexInRasterSpace = vertexInCameraSpace * camera.projectionMatrix; 

    vertexInRasterSpace.x = std::min(width - 1, (int)((vertexInRasterSpace.x + 1) * 0.5 * width)); 
    vertexInRasterSpace.y = std::min(height - 1, (int)((1 - (vertexInRasterSpace.y + 1) * 0.5) * height)); 
    vertexInRasterSpace.z = -vertexInCameraSpace.z; 

最後に、結果が得られた:

-Rayトレース - >Ray tracing picture

-Rasterization - >Rasterization picture

針言うことは、両方の画像が同じモデルビュー行列を使用します。同じ(サイズ)イメージを取得するという私の最初の仮定で私はすべて間違っていましたか? (?あなたは、3DグラフィックスAPIに頂点を供給したり、独自のラスタライズを行っている)

〜スカイ

答えて

1

は、ラスタ化アルゴリズムが何をしているかに依存しますが、私の最初の容疑者は、次のとおりです。

を乗じた後、パースペクティブマトリクスですが、ラスタライズする前にパースペクティブデビジョンを実行する必要があります。つまり、ベクターのX、Y、Z成分をWコンポーネントで割ってください。それは見当たりません。

3DグラフィックスAPIに出力頂点を供給する場合、ウィンドウの幅と高さを考慮する必要がありません(ハードウェアレンダリングパイプラインののビューポート変換の一部です)。

+0

ありがとうございます。私はソフトウェアのラスタライズをしています。私は頂点に投影行列を掛け合わせると、視点の分割が暗黙的であるという印象を受けましたが、答えを読んだ後、私はZで翻訳しようとしましたが効果はありませんでした。それが問題かもしれないので、私はもっと掘り下げるつもりです。 – SkyBladeCloud

+0

@SkyBladeCloudうん。行列の乗算演算は実際に除算を行うことはできません(1 /定数で乗算するのが最善です)。したがって、透視投影を行列に入れることは、巧妙なトリックとして見ることができます。分割の分母に入れたい値がWコンポーネントになるようにすべてを配置し、最後に手作業で分割します。 (現実には、4Dの均質な空間ですべてをやっているのですが、最後の視点の分割は3Dユークリッド空間に投影されています)。 –

+0

まあ、あなたに手渡さなければいけません。私は最終的に、レイトレーシングとラスタライズの両方で同じ変換を得ることができました。欠落している視点の分割は実際に問題でした。 RayTracing - > http://i.imgur.com/tHLMbvg.png。ラスタライズ - > http://i.imgur.com/dMmPvzz.png。再度ありがとう:〜スカイ – SkyBladeCloud

関連する問題