2016-04-22 12 views
0

Ich weiß, dass es eine sehr schlechte Idee ist, von/zu derselben Textur/Position zu lesen/schreiben, weil dies zu undefiniertem Verhalten führen würde. Aber in meinem Fall, wenn der Tiefentest deaktiviert ist und ich die Tiefenwerte in einem Shader lese, ist es in Ordnung, den Schablonentest gleichzeitig mit dem Lesen der Tiefenwerte innerhalb derselben Textur durchzuführen?Tiefenwerte während des Schablonentests lesen (gleiche Textur)

Meiner Meinung nach sollte es keine Probleme geben, weil ich die Stencil Buffer Werte im Shader nicht lese. Oder könnte es durch Hardware-Probleme, wenn die Textur für das Lesen in einem Shader gebunden ist und OpenGL verwendet, um die Schablonentests durchzuführen?

Diese Textur ist mit Tiefen-/Schablonenwerten gefüllt. Ich möchte einige schwere BRDF Beleuchtung (Directional Light) Berechnungen auf bestimmte Pixel (der Himmel) vermeiden.

Beispielcode:

//Contains the depth/stencil texture(deferredDepthStencilTextureID). 
//Two FBO's are sharing the same depth/stencil texture. 
lightAccumulationFBO->bind(); 

glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_EQUAL, 1, 0xFF); 
//Disable writing to the stencil buffer, i.e. all the bits is write-protected. 
glStencilMask(0x00); 

glDisable(GL_DEPTH_TEST); 
glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE); //Additive blending. Light accumulation. 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, deferredDepthStencilTextureID); //GL_DEPTH24_STENCIL8 
//Bind other textures here... 

shader.bind(); 
//Uniforms here... 
postProcessQuad->renderQuad(); 
shader.unbind(); 

//Unbind all the textures here. 
... 

glDisable(GL_BLEND); 
glEnable(GL_DEPTH_TEST); 
glDisable(GL_STENCIL_TEST); 

lightAccumulationFBO->unbind(); 
+0

Führen Sie in diesem Rendering-Durchgang nur Schablonentests durch, oder verwenden Sie eine Schablonenoperation, die auch die Schablonenwerte ändert? –

+0

Ich habe meinen Beitrag mit Beispielcode aktualisiert. Ich habe die Schablonenoperation in diesem Rendering-Durchlauf nicht berücksichtigt. Ich habe die Schablone auch so eingestellt: glStencilMask (0x00); – karl88

Antwort

0

Aber in meinem Fall, wenn ein gründlichere Prüfung deaktiviert ist und ich die Tiefenwerte in einem Shader lesen, ist es in Ordnung, die Schablone Test zur gleichen Zeit wie das Lesen zu tun die Tiefenwerte innerhalb derselben Textur?

Nein. Ob eine Operation definiert ist oder nicht, basiert auf den Bildern, die an den FBO angehängt sind und von denen gelesen wird. Nicht die Komponenten der genannten Bilder. Und nein, Schreibmaskierung wird Sie nicht vor undefiniertem Verhalten bewahren.

Wenn Ihre Stencil-Textur nicht von Ihrer Tiefenstruktur getrennt ist, wird das nicht funktionieren. Und viel Glück bei der Suche nach Hardware, mit der Sie Tiefen-/Schablonenbilder trennen können.

Auch mit GL 4.5/NV/ARB_texture_barrier, ist die Antwort immer noch nein. Diese Funktionalität macht bestimmte Ausnahmen von der obigen Regel, aber nur für Operationen, die auf Fragment-Shader-Ausgaben zurückzuführen sind. Schablonentestoperationen sind keine Fragment-Shader-Ausgaben und gelten daher nicht.

+0

ok, danke für die Info. Also, was sind meine Möglichkeiten? Rendern Sie ein Quad und kopieren Sie die Tiefeninformationen. zu einer anderen fbo/texture? Blödelnde Fbos? Welche Methode ist am besten, wenn es um Leistung geht? – karl88