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();
Führen Sie in diesem Rendering-Durchgang nur Schablonentests durch, oder verwenden Sie eine Schablonenoperation, die auch die Schablonenwerte ändert? –
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