13

ここにある R5 デモに基づいて、スクリーン スペース アンビエント オクルージョン (SSAO) を実装しようとしています: http://blog.nextrevision.com/?p=76

実際、私は彼らの SSAO - リニア シェーダーを自分の小さなエンジンに適合させようとしています。

1) ビュー スペース サーフェス法線とリニア深度値を計算します。 次のシェーダーを使用して RGBA テクスチャに保存します。

バーテックス:

varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal));
depth = (modelViewMatrix * vertexPosition).z;
depth = (-depth-nearPlane)/(farPlane-nearPlane);
gl_Position = pvmtMatrix * vertexPosition;

断片:

gl_FragColor = vec4(varNormalVS.x,varNormalVS.y,varNormalVS.z,depth)

線形深度の計算については、http: //www.gamerendering.com/2008/09/28/linear-depth-texture/を参照しました。

それが正しいか?テクスチャは正しいように見えますが、間違っているのでしょうか?

ここに画像の説明を入力

2) 実際の SSAO 実装: 前述のように、オリジナルはここにあります: http://blog.nextrevision.com/?p=76

またはそれ以上: pastebin http://pastebin.com/KaGEYexK

元のテクスチャとは対照的に、テクスチャの 1 つが RGB としての法線とアルファとしての Linear Depht の両方を格納するため、2 つの入力テクスチャのみを使用します。

私の 2 番目のテクスチャ、ランダムな通常のテクスチャは次のようになります: http://www.gamerendering.com/wp-content/uploads/noise.png

私はほぼ同じ実装を使用していますが、私の結果は間違っています。

詳細に入る前に、まずいくつかの質問をクリアしたいと思います。

1) ssao シェーダは、projectionMatrix とその逆行列を使用します。

これは、正射投影を介して画面に位置合わせされたクワッドにレンダリングされる後処理効果であるため、projectionMatrix は正射行列です。正しいか間違っていますか?

2) 2 つの別々のテクスチャではなく、結合された法線テクスチャと深度テクスチャを持つ。

私の意見では、これが R5 の実装と私の実装の試みの最大の違いです。これは大きな問題ではないと思いますが、深度テクスチャが異なるため、問題が発生する可能性が最も高くなります。

R5_clipRange は次のようになっていることに注意してください

vec4 R5_clipRange = vec4(nearPlane, farPlane, nearPlane * farPlane, farPlane - nearPlane);

オリジナル:

float GetDistance (in vec2 texCoord)
{
//return texture2D(R5_texture0, texCoord).r * R5_clipRange.w;
const vec4 bitSh = vec4(1.0 / 16777216.0, 1.0 / 65535.0, 1.0 / 256.0, 1.0);
return dot(texture2D(R5_texture0, texCoord), bitSh) * R5_clipRange.w;
}

コードスニペットを理解していないことを認めざるを得ません。私の深さは私のテクスチャのアルファに保存されており、これを行うだけで十分だと思いました

return texture2D(texSampler0, texCoord).a  * R5_clipRange.w;

正しいか間違っていますか?

4

1 に答える 1

11

あなたの通常のテクスチャは間違っているようです。私の推測では、あなたvmtInvTranspMatrixはモデルビューマトリックスです。ただし、モデル ビュー プロジェクション マトリックスである必要があります (ビュー空間の法線ではなく、スクリーン空間の法線が必要であることに注意してください)。深さの計算は正しいです。

私は SSAO を一度実装しましたが、通常のテクスチャは次のようになります (ここには青がないことに注意してください)。

画面スペース通常

1) ssao シェーダは、projectionMatrix とその逆行列を使用します。これは、正射投影を介して画面に位置合わせされたクワッドにレンダリングされる後処理効果であるため、projectionMatrix は正射行列です。正しいか間違っていますか?

実際の SSAO を計算するためにクワッドをレンダリングする 2 番目のパスを意味する場合は、そうです。正射影行列による乗算を完全に回避できます。-1 から 1 の範囲の [x,y] 次元で画面クワッドをレンダリングする場合、非常に単純な頂点シェーダーを使用できます。

const vec2 madd=vec2(0.5,0.5);

void main(void)
{
    gl_Position = vec4(in_Position, -1.0, 1.0);
    texcoord = in_Position.xy * madd + madd;
}

2) 2 つの別々のテクスチャではなく、結合された法線テクスチャと深度テクスチャを持つ。

いや、それは問題を引き起こさないでしょう。そうするのが一般的なやり方です。

于 2012-01-30T12:57:21.530 に答える