2012-01-30 12 views
13

はこちらをご覧ください:実際にはhttp://blog.nextrevision.com/?p=76のOpenGL GLSL SSAO実装

を、私は彼らのSSAO適応しよう - 私自身の小さなエンジンに収まるようにリニアシェーダを。

1)View Spaceサーフェスの法線と線の深さの値を計算します。

頂点: は、私は、次のシェーダを使ってRGBAテクスチャに保存

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

フラグメント:http://www.gamerendering.com/2008/09/28/linear-depth-texture/

:私は言及私の線形深さ計算のために

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

それが正しいか? テクスチャは正しいようですが、そうでないかもしれませんか?

enter image description here

2)実際のSSAO実装:オリジナル上述したように がここで見つけることができる:http://blog.nextrevision.com/?p=76

又は速い:ペーストビンにhttp://pastebin.com/KaGEYexK

とは対照的に私は2つの入力テクスチャを使用しています。私のテクスチャの1つは、RGBとLinear Depht als Alphaの両方の法線を格納するからです。

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

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

1)SSAOシェーダはprojectionMatrixを使用し、それが逆行列です:

詳細に入る前に、私が最初にいくつかの質問をクリアしたいです。

これは、正立法投影法による画面整列クワッドにレンダリングされた後処理効果であるため、projectionMatrixは正字行列です。正解か間違っている?

2)2つの別々のものの代わりに、通常と深さの組み合わせのテクスチャがあります。

私の意見では、これはR5実装と実装の最大の違いです。しかし、これは大きな問題ではないはずですが、異なる深さのテクスチャのために、これは問題を引き起こす可能性が最も高くなります。私は、コードスニペットを理解していない認めざるを得ない

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; 
} 

R5_clipRangeこの

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

オリジナルのように見えることに注意してください。私の深さは、彼の私のテクスチャのアルファに保存されていると私はちょうどこの

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

正誤を行うためにenoughtされなければならないと思いましたか?

答えて

11

通常のテクスチャは間違っているようです。私の推測では、vmtInvTranspMatrixはモデルビューの行列です。しかし、それはモデルビュー投影行列でなければなりません(画面の法線を表示するのではなく、画面の法線を表示する必要があります)。深さの計算は正しいです。

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

screen space normal

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別々 を合わせ、正常および奥行き組織を有しますもの。

ナー、それは問題を引き起こさないでしょう。これは一般的な習慣です。

+0

ありがとうございました:) – mp87

+0

私は自分の記事にまだ回答できません: ここに結果があります:http://i42.tinypic.com/35ceko5.jpg – mp87

関連する問題