2015-08-03 2 views
0

J'ai implémenté un rendu différé et j'essaie d'utiliser des textures multi-échantillons pour l'anti-aliasing.Multisample Texture produit des artefacts à l'horizon

Je rends la scène dans un FBO avec des textures multi-échantillons, utilisez glBlit pour créer des textures régulières dans un second FBO et enfin lier la texture au shader d'éclairage qui produit l'image finale.

// draw to textures 
mMultiGeometryFBO->bind(); 
glViewport(0,0,mWidth,mHeight); 
glEnable(GL_DEPTH_TEST); 
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 

// calling all modules to draw to FBO 
for(auto r : mRenderer) 
    r->renderMaterial(camera); 

glBindFramebuffer(GL_READ_FRAMEBUFFER, mMultiGeometryFBO->fbo()); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mGeometryFBO->fbo()); 

glReadBuffer(GL_COLOR_ATTACHMENT0); 
glDrawBuffer(GL_COLOR_ATTACHMENT0); 
glBlitFramebuffer(0, 0, mWidth, mHeight, 
        0, 0, mWidth, mHeight, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_LINEAR); 

glReadBuffer(GL_COLOR_ATTACHMENT1); 
glDrawBuffer(GL_COLOR_ATTACHMENT1); 
glBlitFramebuffer(0, 0, mWidth, mHeight, 
        0, 0, mWidth, mHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); 

glReadBuffer(GL_COLOR_ATTACHMENT2); 
glDrawBuffer(GL_COLOR_ATTACHMENT2); 
glBlitFramebuffer(0, 0, mWidth, mHeight, 
        0, 0, mWidth, mHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); 

// draw to screen 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glClear(GL_DEPTH_BUFFER_BIT); 

mSkybox->renderMaterial(camera); 

mShader->use(); 
mShader->setTexture("tDiffuse", mDiffuseColor, 0); 
mShader->setTexture("tNormal", mNormals, 1); 
mShader->setTexture("tMaterial", mMaterialParams, 2); 
mShader->setTexture("tDepth", mDepthBuffer, 3); 
mShader->setTexture("tLights", mLightColor, 4); 
mQuad->draw(); 

Cela produit une ligne visible à l'horizon (entre la géométrie et skybox). La couleur est la couleur claire. Seul le dégagement de la profondeur réduit le problème lors du déplacement. Rendu de la SkyBox à la FBO avant de rendre la géométrie produit des artefacts moins visibles, mais la ligne est toujours là.

Edit: a oublié l'image enter image description here

Répondre

1

la cible Résoudre multisample avant le passage de l'éclairage n'a pas de sens, sur le plan conceptuel. Ce que vous obtiendrez, c'est que les valeurs de vos gbuffers seront moyennées sur les bords des objets. Ceci est particulièrement mauvais pour les directions normales. Pensez-y: si vous avez un pixel qui contient 50% de votre plan de masse et 50% de votre ciel, vous obtiendrez une direction normale qui est (normal_ground + normal_sky)/2. Ceci est totalement différent de calculer la couleur finale de chacune de ces parties avec leur normale d'origine et de mélanger les couleurs résultantes.

Si vous voulez faire multiéchantillonnage avec un rendu différé, vous devez utiliser la cible multiéchantillonnage pour l'éclairage, et devra permettre par l'ombrage de l'échantillon et accéder réellement et lumière chaque échantillon individuellement, et seulement blit le résultat final à une cible non multisamplée. Cependant, ce sera exorbitant cher. Vous perdez particulièrement les avantages du multi-échantillonnage par rapport au super-échantillonnage. Je ne sais pas s'il y a quelques astuces pour continuer à travailler avec le multi-échantillonnage d'une manière plus efficace, mais l'approche habituelle est de ne pas utiliser le multi-échantillonnage et de faire l'anti-aliasing via un post-traitement basé sur l'image passer.