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