私はOpenGLでSSAOに取り組んできました。このチュートリアルのSSAO をOpenGL で遅延レンダラーに実装することにしました。残念ながら、私はそれをうまく機能させることができませんでした。SSAOで暗くなる部分は、カメラの位置によって大きく変化します。カメラが動いたときに SSAO の出力に多少の変動があることは理解していますが、これは SSAO の他の実装で観察したよりもはるかに大きいです。
これがフラグメントシェーダーコードです
void main() {
vec3 origin = positionFromDepth(texture2D(gDepth, samplePosition));
vec3 normal = texture2D(gNormal, samplePosition).xyz; //multiplying this
//by 2 and subtracting 1 doesn't seem to help
vec2 random = getRandom(samplePosition);
float radius = uRadius/origin.z;
float occlusion = 0.0;
int iterations = samples/4;
for (int i = 0; i<iterations; i++) {
vec2 coord1 = reflect(kernel[i], random)*radius;
vec2 coord2 = vec2(coord1.x*0.707 - coord1.y*0.707, coord1.x*0.707 + coord1.y*0.707);
occlusion += occlude(samplePosition, coord1 * 0.25, origin, normal);
occlusion += occlude(samplePosition, coord2 * 0.50, origin, normal);
occlusion += occlude(samplePosition, coord1 * 0.75, origin, normal);
occlusion += occlude(samplePosition, coord2, origin, normal);
}
color = vec4(origin, 1);
}
positionFromDepth()
機能:
vec3 positionFromDepth(float depth) {
float near = frustrumData.x;
float far = frustrumData.y;
float right = frustrumData.z;
float top = frustrumData.w;
vec2 ndc;
vec3 eye;
eye.z = near * far / ((depth * (far - near)) - far);
ndc.x = ((gl_FragCoord.x/buffersize.x) - 0.5) * 2.0;
ndc.y = ((gl_FragCoord.y/buffersize.y) - 0.5) * 2.0;
eye.x = (-ndc.x * eye.z) * right/near;
eye.y = (-ndc.y * eye.z) * top/near;
return eye;
}
そしてocclude()
機能:
float occlude(vec2 uv, vec2 offsetUV, vec3 origin, vec3 normal) {
vec3 diff = positionFromDepth(texture2D(gDepth,(uv+offsetUV)))-origin;
vec3 vec = normalize(diff);
float dist = length(diff)/scale;
return max(0.0,dot(normal,vec)-bias)*(1.0/(1.0+dist))*intensity;
}
positionFromDepth()
完全に機能するレンダラーの照明ステージに同じコードを使用することを除いて、関数に問題がある可能性があると感じています(私は思います)。私はこのコードを何千回も調べましたが、間違っていると思われるものは何も見つかりませんでした。bias
、radius
、intenisty
、のさまざまな値を試しましたscale
が、問題はないようです。法線または位置が間違っているのではないかと心配しているので、それらのスクリーン ショットをいくつか示します。
再構築された位置:
通常のバッファ:
私はオクルージョン バッファの画像を含めますが、問題はカメラが動いている場合にのみ明らかになり、画像は表示に役立ちません。
ここで何が問題なのか誰にもわかりませんか?