2017-09-21 4 views
0

J'utilise actuellement des objets de pipeline shader dans OpenGL (étapes de shader séparables) avec les anciens programmes simples de style avec glUseProgram(). Je me demande, dans la documentation, il dit:Étapes et programmes de shaders de liaison OpenGL

If there is a current program object established by `glUseProgram`, 
the bound program pipeline object has no effect on rendering or uniform updates. 

Ceci est source de confusion pour moi parce que je semble être en mesure de le faire:

glUseProgram(6); // Render using the single program 
glBindProgramPipeline(pipeline_ID); 
glUseProgramStages(pipeline_ID, GL_VERTEX_SHADER_BIT, shaderID); 
glUseProgramStages(pipeline_ID, GL_FRAGMENT_SHADER_BIT, shaderID); 

sans avoir d'abord la mise en glUseProgram(0) avant d'appeler glUseProgramPipeline. La documentation que je pensais impliquait que ça ne marcherait pas, mais je peux rendre ça comme ça. Est-il nécessaire de définir glUseProgram(0) avant d'appeler glBindProgramPipeline?

+0

@BDL Oh je vois, je ne l'ai pas compris comme ça. J'espère que quelqu'un peut clarifier. – Zebrafish

Répondre

2

n'a pas d'effet sur le rendu ou les mises à jour uniformes

Rien dans le code que vous avez montré traite de « rendu » ou « mises à jour uniformes ». Si vous appelez glUniform, il ira à l'objet programme 6, pas à quoi que ce soit dans le pipeline (à moins que 6 ne soit dans le pipeline). Si vous rendez, vous utiliserez les shaders dans l'objet programme 6, pas ceux dans le pipeline (à nouveau, à moins que 6 ne soit dans le pipeline).

Tant qu'il y a un programme en cours d'utilisation, le pipeline n'affecte pas le rendu. Il convient également de noter que glUseProgramStages n'affecte pas pipeline_ID car il est lié au contexte. Il affecte ce pipeline parce que vous le passez en paramètre. Vous n'aviez pas à le lier en premier. En effet, la seule raison de lier un pipeline est de rendre avec lui; toutes ses fonctions de définition d'état utilisent le style DSA.

+0

Merci, de sorte que la liaison pipeline avant d'attacher les étages de shader est inutile. Si je comprends bien, si le programme shader 6 est lié, et que j'attache le fragment et le vertex shader au pipeline, l'appel suivant utilisera le programme shader 6. Je dois d'abord lier le pipeline. Mais, comme ma question initiale l'a demandé, est-ce que glUseProgram doit d'abord être mis à (0) avant de lier mon pipeline? Je ne devine pas. – Zebrafish

+0

@Zebrafish: Votre question est comme demander "dois-je définir la variable de pointeur' A' à NULL avant de définir la variable de pointeur 'B'?" –

+0

Je viens de tester quelques trucs, j'ai trouvé que la liaison du shader est vraiment très lente, alors que attacher les shaders est presque négligeable. Liaison du pipeline semble ralentir mon système beaucoup plus que pour les commutateurs de texture par exemple, ou de liaison VBO même. Bizarre. – Zebrafish