2013-11-25 65 views
7

最新のOpenGLバージョンでOpenCSGを再実装しました。MSAAによるアンチエイリアシングの問題、深さとFBOでCSGを描画する

PixelFormatAttributes:

NSOpenGLPFAColorSize , 24 , 
NSOpenGLPFAAlphaSize , 8 , 
NSOpenGLPFADepthSize , 32 , 
NSOpenGLPFAStencilSize , 8 , 
NSOpenGLPFAAccelerated , 
NSOpenGLPFADoubleBuffer , 
NSOpenGLPFASupersample , 
NSOpenGLPFASampleBuffers, 1 , 
NSOpenGLPFASamples  , 4 , 

FBO仕様:(マルチサンプルとFBOにレンダリングしようとしたが、ラインはより強く、目に見えるなって、一番下のスクリーンショットに見て)
- 2のべき乗で作成したテクスチャ、 GL_RGBA(試みGL_RGBA8とGL_RGBA32F)
- GL_DEPTH24_STENCIL8(GL_DEPTH32_STENCIL8、無結果を試みた)


単にアルゴリズムGoldfeather:シェーダで

while (i < depth complexity) { 
    take channel for render 
     merge layers if no free channel 
    render each layer with stencil func, mask and depth params to channel (FBO) 
} 
merge layers (taking texture from FBO and render objects again with applying shader below) 


私がマージするためのコードを持っている(FBOからの結果テクスチャOpenCSG it's setupProjectiveTextureに、試験のためのレンダリングの上に重なる):

 vec2 ndcPos = gl_FragCoord.xy/sizetexture.xy; 
    vec4 maskColor = texture2D(maskTexture, ndcPos.xy); 
    if (maskColor[channel] < 0.5) { 
     discard; 
    } 

enter image description here

FBOが十分なテクスチャを得ていないか、適切なサイズになっていないように見えます。

EDIT:
これらの線はメッシュのみを減算した場所が重複して表示されます。

EDIT 2:
非MSAA FBOにレンダリングし、結果にFXAAを適用すると修正されました。

+0

32ビットカラーバッファ+ 8ビットアルファが私に特に珍しくありません。通常、ピクセルフォーマットは、32ビット(未使用の8ビット)RGB + 0 Aまたは24ビットRGB + 8ビットA、ほとんど決して32ビットRGB + 8ビットA(40ビットカラーを生成する)バッファ)。 CGLは最も近いフォーマットにマッチするので、違いはありませんが、根本的に奇妙なものを求めています。 –

+0

@ AndonM.Coleman実際にあなたは正しい、変更されます!しかし、それは私の問題を解決しませんでした。私は類似の問題を解決する方法に関するいくつかの記事を見つけました: 1. http://www.alphanew.net/index.php?section=articles&site=multisampling 2. http://mtnphil.wordpress.com/2013/06/ 26/know-your-ssao-artifacts/ 私はネイティブスピーカーではないので、完全に理解しにくいです。多分後で分かるでしょう。 – SAKrisT

+0

ちなみに、あなたのピクセルフォーマットに 'Supersample'を指定すると、MSAAではなくSSAAをGLに求めています。これはOS Xです。私は、ソフトウェアレンダラーだけがスーパーサンプリングをサポートするOS X上でハードウェアアクセラレーションされたピクセルフォーマットに遭遇したことはありません。私はあなたのピクセル形式からもそれを削除することをお勧めします。この時点でこれはかなり厄介なものになっていますが、問題の唯一の情報は現在あなたのピクセル形式に関連しているので... :) –

答えて

0

あなたの説明が正しいかどうかわかりません。シェーダでどのようなテクスチャをサンプリングしていますか?

実装しているアルゴリズムの詳細はわかりませんが、そのテクスチャにマルチサンプル収集を使用した以前の計算結果が含まれている場合は、その結果をフラグメント全体(そしてそのすべてのサンプル)。マスクはエッジで消えてしまいますが、ここでは問題があるようです。

「手で」収集する必要がありますか? sampler2DMSを使用し、シェーダ内のtexelFetchで個々のサンプルを読み込みます。

もう1つの解決方法は、境界でのフェードを防ぐために、最初のパスでgl_SampleMaskをすべて1に設定することです。

関連する問題