Lorsque je règle glStencilFunc(GL_NEVER, . . .)
en désactivant effectivement tous les dessins, puis que j'exécute mon programme [lié aux shaders], je n'obtiens aucune augmentation des performances par rapport à l'exécution du fragment shader. Je pensais que le test de pochoir est arrivé avant le programme de fragmentation. N'est-ce pas le cas, ou du moins pas garanti? Remplacer le fragment shader par un autre qui écrit simplement une constante dans gl_FragColor entraîne un FPS plus élevé.Le test au stencil OpenGL a-t-il lieu avant ou après l'exécution du programme fragment?
Répondre
Jetez un oeil à l'aperçu ci-dessous pour le pipeline DX10, il dit que le test de pochoir fonctionne avant que le pixel shader:
et la même chose est vraie dans DX11:
http://4.bp.blogspot.com/_2YU3pmPHKN4/S1KhDSPmotI/AAAAAAAAAcw/d38b4oA_DxM/s1600-h/DX11.JPG Je ne sais pas si cela est obligatoire dans la spécification OpenGL, mais il serait préjudiciable à une implémentation de ne pas faire le test du stencil avant d'exécuter le programme fragment.
C'est en fait un peu des deux. Les opérations par fragment devraient se produire après le programme de fragment comme vous pouvez le voir dans ce OpenGL ES 2.0 pipeline diagram. Cependant, de nombreuses cartes graphiques modernes ont un test z précoce qui élimine les fragments plus tôt tant que vous n'écrivez pas en profondeur dans le fragment shader. Il s'agit d'un paper from AMD/ATI that talks about such tests. Je me souviens avoir lu que la spécification permettait des tests précoces aussi longtemps que le shader produisait le même résultat que la suivante, ce qui explique pourquoi vous ne voudriez pas modifier la profondeur ou jeter un fragment dans le shader. Ce thread on OpenGL forums a une discussion intéressante à ce sujet.
En plus de la modification de la profondeur du fragment, il existe quelques autres éléments qui peuvent empêcher le test de profondeur/pochoir avant le fragmentage. Si les z-écritures sont activées, alors toute méthode d'abandon du fragment dans le shader le fera, comme par exemple alpha-test ou l'instruction shader discard
. Si le GPU veut effectuer le test stencil/z dans la même opération que l'écriture z/stencil, il doit attendre que le fragment shader s'exécute pour qu'il sache que le fragment est autorisé à écrire dans z-/stencil. tampon. Cela peut varier selon les différentes cartes. Au moins, il devrait être facile de dire si c'est votre problème actuel.
Comme vous pouvez le voir ici: http://www.opengl.org/wiki/Stencil_Test Le test du stencil est exécuté après fragmentShader. Je comprends que ce n'est pas bon pour la performance.
Est-ce une réponse ou un commentaire? –
Selon cette page: http://www.opengl.org/wiki/Rendering_Pipeline_Overview#Pipeline les tests de gabarit et de profondeur peuvent être exécutés avant le shader de fragment si la profondeur n'est pas modifiée dans le fragment shader. Cependant, cela ne semble pas se produire dans mon cas (je n'écris pas dans gl_FragDepth dans le fragment shader). – david