2016-04-19 1 views
0

J'ai vu que vous pouvez rendre des choses à une texture en utilisant les FBO d'OpenGL - c'est-à-dire en définissant un nouveau Texture2D à GL_COLORATTACHMENT0. Cependant, cela ne signifie-t-il pas que je devrais rendre explicitement à cette pièce jointe couleur avec out (location=0) dans le shader - donc tout ce que j'ai rendu d'une autre manière ne finirait pas dans cette texture, non? Parce que je l'ai vu comme ça sur des tutoriels opengl-tutorial # 14:Rendu n'importe quoi à la texture

layout(location = 0) out vec3 color; 

Si cela est vrai, comment par exemple render mode immédiat à la texture, si cela est même possible?

Répondre

2

Vous parlez de quatre choses différentes ici: rendre à la texture (RTT), multiples cibles de rendu (TRM), le pipeline de fonction fixe (rendu sans shaders) et les spécifications de la géométrie de mode immédiat (glBegin/glEnd) .

Ces fonctionnalités sont toutes indépendantes les unes des autres dans OpenGL. Un framebuffer dans OpenGL peut généralement se composer de zéro, un ou plusieurs tampons de couleur . Et ce n'est pas seulement vrai pour les FBO, mais aussi pour le framebuffer fourni par le système de fenêtrage (FBO 0): Dans le cas typique, celui-ci a 2 tampons couleur GL_BACK et GL_FRONT. Il n'y a probablement aucun cas d'utilisation réel pour configurer MRT pour le rendu dans les buffers avant et arrière simultanément, mais il est néanmoins possible. Cependant, lorsque vous avez une implémentation qui prend en charge formats de pixels streiskic, vous aurez les 4 tampons de couleur GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT et GL_BACK_RIGHT (d'où le nom "quad buffering"), et le rendu à gauche et à droite via MRT peut effectivement être utile dans certaines situations.

Les qualificatifs de sortie layout (location=x) du fragment shader ne correspondent pas à et au GL_COLOR_ATTACHMENTx. Au lieu de cela, il existe un autre niveau d'indirection qui est explicitement établi par la commande glDrawBuffers(), qui définit la mémoire tampon/attatchment de couleur cible réelle pour chacun des indices de couleur. Et votre shader peut écrire dans n'importe quel (sous-) ensemble des indices disponibles. Si vous n'utilisez pas de shader, la couleur sera inscrite dans l'index de couleur zéro et vous pouvez la mapper à n'importe quelle pièce jointe en utilisant glDrawBuffer(). Sans un shader, vous ne pouvez pas utiliser MRT, il n'y aura donc qu'une seule valeur de couleur, qui n'est écrite que pour une seule couleur d'une FBO. Dans un contexte stéréoscopique, vous pouvez parfois écrire dans plusieurs tampons de couleur sans MRT, mais cela signifie que vous pouvez écrire dans plusieurs tampons de couleur sans MRT, mais vous pouvez également utiliser le . qui reproduit la même valeur pour différents tampons). Enfin, le mode immédiat n'a rien à voir avec l'un de ceux-ci. Si vous spécifiez vos primitives avec glBegin()/glEnd() ou en utilisant Vertex Arrays (côté client ou VAO), ou utilisez un rendu sans attribut et que vous les générez directement dans les shaders, cela n'a aucune importance. Tout ce qui compte est ce que DrawBuffer (s) vous avez mis en place au moment de l'appel de tirage.

J'espère que vous êtes conscient que le mode immédiat, ainsi que le pipeline de fonction fixe, sont complètement désapprouvé depuis près d'une décennie. Les profils de base modernes d'OpenGL ne supportent plus cette fonctionnalité.

+1

Semble coupé à la fin là. – genpfault

+1

@genpfault: thnx pour repérer ceci, c'était quelques restes d'une phrase que j'ai reformulée et ai oublié de supprimer. – derhass