Buffer Storage et fencing
Bonjour à vous tous :-).
Je suis récemment passé aux Buffer Storage, afin de réduire le goulot d'étranglement du driver à coup de glmapbuffer etc :-).
Voilà ma façon de créer le buffer
Code:
1 2
| glNamedBufferStorageEXT(mIdBuffer, size, NULL, GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT);
mPtr = glMapNamedBufferRangeEXT(mIdBuffer, 0, size, GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT); |
Seulement, maintenant j'ai un problème. En effet, lorsque j'effectue mon rendu, j'ai l'impression qu'il y a un problème quand je rempli le buffer car l'affichage de mes ombres diffère de la version en utilisant glmapBuffer.
Après renseignements, j'ai lu qu'il fallait utilisé la synchronisation,afin d'attendre que la copie soit finis avant de continuer, mais j'avoue ne pas savoir m'en servir ...
Voilà ce que j'ai fait, les 2 fonctions englobé sont celles qui modifie les buffers... A mon avis, ce n'est pas la bonne méthode ^^, pouvez vous m'aiguiller :-).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| void Renderer::render(void)
{
mat4 viewProjection = perspective(70.0f, (float) QGM_Device->getWidth() / (float) QGM_Device->getHeight(),
QGM_Device->getNear(), QGM_Device->getFar()) * QGM_Camera->getMatrix();
mPointLightRenderer.begin();
GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
QGM_NodeRoot->addLight(mat4(1.0f), viewProjection, 1.0f); // On ajoute toutes les lumières à notre rendu
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 0);
QGM_Device->setDepthTest(true);
QGM_Device->setCulling(NONE_CULLING);
bindForDepthPass();
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
mPointLightRenderer.renderDepthMap(mShadowBuffer, 0); // On crée nos DepthMaps
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 0);
mPointLightRenderer.end();
QGM_Device->setCulling(BACK_CULLING);
bindForGeometryPass();
QGM_NodeRoot->render(mat4(1.0f), viewProjection); // On rend la géométrie
QGM_Device->setCulling(FRONT_CULLING);
QGM_Device->setDepthTest(false);
QGM_Device->setBlending(true);
lightPass();
finalPass();
QGM_Device->setBlending(false);
} |
Merci de votre aide :-) .