2013-11-25 12 views
7

최신 OpenGL 버전에 OpenCSG을 다시 구현했습니다.깊이 및 FBO로 CSA 그리기 MSAA의 앤티 앨리어싱 문제

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 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

그건 그렇고, 픽셀 형식에서 '슈퍼 샘플'을 지정하면 GL에 MSAA 대신 SSAA를 묻습니다. 이것은 OS X입니다. 필자는 수퍼 샘플링을 지원하는 OS X에서 하드웨어 가속화 픽셀 포맷을 만난 적이 없으며 소프트웨어 렌더러 만 지원합니다. 나는 당신도 당신의 픽셀 형식에서 그것을 제거하는 것이 좋습니다 것입니다. 이 시점에서 이것은 꽤 까다로워지고 있습니다 만, 문제의 유일한 정보가 픽셀 형식과 관련되어 있기 때문에 ... :) –

답변

0

귀하의 설명이 맞는지 확실하지 않습니다. 셰이더에서 어떤 샘플링 텍스처를 샘플링합니까?

구현하고있는 알고리즘의 세부 사항을 모르지만 그 텍스처에 이미 멀티 샘플링을 사용한 일부 계산 결과가 포함되어 있다면 전체 조각에 대해 그 결과를 사용할 수 있는지 잘 모르겠습니다. (그리고 모든 샘플). 마스크가 가장자리에서 희미해질 것입니다. 여기에서 문제가되는 것 같습니다.

예를 들어 "손으로"샘플을 수집해야 할 수 있습니다. sampler2DMS를 사용하고 셰이더에서 개별 샘플을 texelFetch와 함께 읽습니다.

또 다른 해결책은 경계에서의 페이딩을 방지하기 위해 첫 번째 패스에서 gl_SampleMask를 모두 1로 설정하는 것입니다.