M2-Images - Rendu Temps Réel - OpenGL 3 et transform feedback
Transcription
M2-Images - Rendu Temps Réel - OpenGL 3 et transform feedback
Résumé Transform feedback Requètes GL4: transform feedback object Discard M2-Images Rendu Temps Réel - OpenGL 3 et transform feedback J.C. Iehl November 7, 2012 J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard Résumé des épisodes précédents résumé : I création de buffers, I création de maillages indexés ou non, I affichage de maillages, I affichage de plusieurs maillages, I vertex, géométrie et fragment shaders, I textures, framebuffer, I notions de traitement en plusieurs passes ... J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard Résumé de l’api opengl 3 Attributs de sommets Shaders buffer Attributs d'instances buffer Framebuffer Fragment Vertex Control Tesselation Evaluation Geometry renderbuffer texture Depth Unités de textures Color attachments Depth attachment texture sampler Uniforms buffer Feedback buffer J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard shader application Transform Feedback même idée que pour les framebuffer objects : I permet de stocker les résultats du geometry shader dans un/des buffers, I et de faire plusieurs passes de transformations... I ou autre chose... J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard shader application Transform feedback utilisation : I déclarer dans le shader les varyings à enregistrer (comme d’habitude...), I sélectionner le mode de remplissage des buffers, I compiler / re-linker le shader, I créer et activer les buffers pour stocker les varyings, I dessiner des primitives... J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard shader application Transform feedback et shader uniquement les varyings out déclarés dans le vertex/geometry shader peuvent être enregistrés. # version 330 // vertex shader core profile uniform mat4 mvpMatrix ; in vec4 position ; out vec4 vertex_position ; void main ( void ) { gl_Position = mvpMatrix * position ; vertex_position = position + vec4 (10. f , 10. f , -100. f , 0. f ) ; // deplace le sommet et e n r e g i s t r e sa position ... } J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard shader application Préparer le transform feedback pour l’application : I glTransformFeedbackVaryings(), I permet de déclarer quels varyings enregistrer, I et de quelle manière : I GL SEPARATE ATTRIBS : dans des buffers séparés, I GL INTERLEAVED ATTRIBS : dans un seul buffer. I activer le/les buffers : I glBindBufferBase(GL TRANSFORM FEEDBACK BUFFER, index, buffer) créer et dimensionner le bon nombre de buffers. J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard shader application Utiliser le transform feedback utiliser : I glBeginTransformFeedback( feedback primitives ), I glDrawXXX( draw primitives ), I glEndTransformFeedback( ). feedback primitives doit correspondre aux primitives émises par le geometry shader, ou GL POINTS, s’il n’y a pas de geometry shader (vertex shader). J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard shader application et alors ? I combien de données sont effectivement écrites dans le/les buffers ? I et si le stockage est trop petit ? I et si dessiner le résultat n’a pas de sens ? récupérer la quantité de données correctement écrites par le feedback. J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard Requètes I mécanisme générique d’openGL pour obtenir des informations sur l’exécution d’une opération, I primitives produites, primitives écrites par le feedback, temps d’exécution, visibilité, etc. J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard Requêtes I création : glGenQuery( ), I utilisation : glBeginQuery( ), + glEndQuery( ), I résultat : glGetQueryObject( ). GLuint feedback ; glGenQuery (1 , & feedback ) ; glBeginQuery ( G L _ T R A N S F O R M _ F E E D B A C K _ P R I M I T I V E S _ W R I T T E N , feedback ) ; g l B e g i n T r a n s f o r m F e e d b a c k ( ... ) ; glDrawXXX ( ... ) ; g l E n d T r a n s f o r m F e e d b a c k () ; glEndQuery ( G L _ T R A N S F O R M _ F E E D B A C K _ P R I M I T I V E S _ W R I T T E N ) ; GLint n ; g lG et Q ue r yO bj e ct i v ( feedback , GL_QUERY_RESULT , & n ) ; J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard et la même chose en plus simple ? OpenGL 4 : I transform feedback object : I garde automatiquement tout l’état nécessaire, y compris le nombre d’éléments écrits, I + I glDrawTransformFeedback( primitives, transform freedback object ), I équivalent à : I glDrawArrays( primitives, 0, n ) avec n le résultat de la requète... J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard et la même chose en plus simple ? I glGenTransformFeedbacks( ) I glBindTransformFeedback( ) I glBeginTransformFeedback( ) I glDrawXXX( ) I glEndTransformFeedback( ) I glDrawTransformFeedback( ) et c’est mieux ? J.C. Iehl M2-Images Résumé Transform feedback Requètes GL4: transform feedback object Discard et si dessiner le résultat n’a pas de sens ? I désactiver la fragmentation... I glEnable(GL RASTERIZER DISCARD); J.C. Iehl M2-Images