2016-05-18 14 views
0

lesen Ich arbeite jetzt an der verzögerten Schattierung mit WebGL2.0. Ein Hauptproblem, mit dem ich jetzt konfrontiert bin, ist, dass ich den Tiefenwert von DEPTH_ATTACHMENT nicht lesen kann. Eigentlich Creat ich meine eigene GBuffer mit einer DEPTH24_STENCIL8 Textur als DEPTH_ATTACHMENT, dann binde ich diese Textur auf den Sampler und versuche, den Wert in meinen Fragment-Shader in Deferred Shading Teil wie folgt zu lesen:Wie Tiefe Textur zu FBO in WebGL2

uniform sampler2D u_depthSampler; 
vec4 depthValue = texture(u_depthSampler, v_uv); 

Dann stellte ich die depthValue als Ausgabe in meinen Shading Fragment-Shader.

layout(location = 0) out vec4 o_fragOut; 
o_fragColor.xyz = depthValue.xyz; 
o_fragColor.w = 1.0; 

Wenn dies auf Firefox zu tun, es hat keinen Fehler berichten, aber die Ausgangsfarbe ist nur reines rot (die vec3 bedeutet (1,0, 0,0, 0,0) I denken). Das verwirrt mich sehr. Kann mir jemand Anweisungen geben? Gibt es ein Problem mit meinem GLSL-Code? THX ~

Antwort

0

Entschuldigung, dass ich einen großen Fehler gemacht habe, dass die Tiefe Textur ist tatsächlich fast rein rot, aber nicht wirklich rot. Ich habe das versucht:

float depthPow = pow(depthValue.x, 10.0); 
o_fragOut.xyz = vec3(depthPow); 

Und ich bekomme das richtige Ergebnis, denke ich.

1

Der Tiefenpuffer ist nicht linear. Linearisieren es diese Formel:

float f = 1000.0; //far plane 
float n = 1.0; //near plane 
float z = (2.0 * n)/(f + n - texture2D(diffuse, texCoord).x * (f - n)); 

gl_FragColor = vec4(z,z,z, 255) 
+0

Genau, dachte ich zunächst, dass ich den falschen Puffer bekam, dann merke ich, dass der Grund, warum vor allem die Tendenz Pixel ** Pure Red zu sein ** ist, dass der Tiefenpuffer ist nicht -linear, THX :) – Skyfeiyun