0

遅延レンダリングを実装し、マルチサンプル テクスチャをアンチ エイリアシングに使用しようとしています。

マルチサンプル テクスチャを使用してシーンを FBO にレンダリングし、glBlit を使用して 2 番目の FBO で通常のテクスチャを作成し、最終的にテクスチャを照明シェーダーにバインドして、最終的な画像を生成します。

// 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();

これにより、地平線 (ジオメトリとスカイボックスの間) に目に見える線が生成されます。カラーはクリアカラーです。深さをクリアするだけで、移動時の問題が軽減されます。ジオメトリをレンダリングする前に SkyBox を FBO にレンダリングすると、目に見えるアーティファクトは少なくなりますが、線はまだ残っています。

追記:写真忘れました ここに画像の説明を入力

4

1 に答える 1

1

ライティング パスの前にマルチサンプル ターゲットを解決することは、概念的に意味がありません。得られるのは、gbuffers の値がオブジェクトの端で平均化されることです。これは、通常の方向では特に悪いことです。考えてみてください: 地面の 50% と空の 50% を含むピクセルがある場合、法線方向は (normal_ground + normal_sky)/2 になります。これは、この各パーツの最終的な色を元の法線で計算し、結果の色を混合することとはまったく異なります。

遅延レンダリングでマルチサンプリングを行う場合は、ライティングにマルチサンプリング ターゲットを使用する必要があり、サンプルごとのシェーディングを有効にし、実際に各サンプルに個別にアクセスしてライティングし、最終結果のみを非マルチサンプリング ターゲットにブリットする必要があります。 . ただし、それは法外な費用がかかります。特に、マルチサンプリングとスーパーサンプリングの利点が失われます。

マルチサンプリングをより効率的な方法で使用するための巧妙なトリックがあるかどうかはわかりませんが、通常のアプローチは、マルチサンプリングをまったく使用せず、画像ベースの後処理パスを介してアンチエイリアシングを行うことです。

于 2015-08-03T19:47:13.260 に答える