ここにある 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;
正しいか間違っていますか?