2014-03-06 6 views
5

사무실에서 우리는 OpenGL의 AccumulationBuffer를 사용하여 이미지 저장을위한 앤티 앨리어싱을 구현하는 오래된 GLX/Motif 소프트웨어를 사용하고 있습니다. 우리의 문제는 애플이 자사의 모든 드라이버 (OS X 10.7.5부터)에서 AccumulationBuffer를 삭제했고, Intel HDxxxx와 같은 일부 리눅스 드라이버는 그것을 지원하지 않는다는 것입니다.OpenGL SuperSampling 앤티 앨리어싱?

그런 다음 소프트웨어의 앤티 앨리어스 코드를 업데이트하여 대부분의 실제 OS 및 GPU와 호환되도록 만들었지 만 생성 된 이미지를 이전처럼 아름답게 유지합니다 (과학 출판물에 필요하기 때문에).

SuperSampling은 가장 오래된 앤티 앨리어싱 방법 중 가장 오래된 것으로 보이지만 AccumulationBuffer를 사용하지 않는 SSAA의 예는 찾을 수 없습니다. OpenGL/GLX로 수퍼 샘플링을 구현하는 다른 방법이 있나요 ???

+0

어떤 GL 버전을 타겟팅합니까? 누적 버퍼는 GL 3.0에서는 더 이상 사용되지 않지만 3.1에서는 (GL_ARB_compatibility가없는)/3.2+ * Core *에서는 제거되었습니다. 이것이 OS X 또는 Intel의 드라이버에서 찾을 수없는 이유입니다. 누적 버퍼 대신에 기본 프레임 버퍼의 크기의 정수 배수를 사용하여 FBO로 드로잉 한 다음 나중에 간단한'GL_LINEAR' 필터를 사용하여 다운 샘플링을 수행 하시겠습니까? –

+0

안녕하세요, 안동, 답장을 보내 주셔서 감사합니다. – Fravadona

+0

고대의 현대식 OpenGL 구현과 호환되는 양질의 장면 앤티 앨리어싱 (이미지 저장 용)을 수행하는 모든 방법을 고려하고 있습니다. 이제 인터넷에서 "GLX FBO GL_LINEAR 다운 샘플링"예제를 살펴 보겠습니다. – Fravadona

답변

3

FBO를 사용하여 누적 버퍼와 함께 사용할 수있는 것과 동일한 종류의 앤티 앨리어싱을 구현할 수 있습니다. 프로세스는 거의 동일하지만, 누적 버퍼로 텍스처/렌더 버퍼를 사용한다는 점만 다릅니다. 프로세스에 두 개의 FBO를 사용하거나 단일 렌더 FBO의 연결된 렌더 대상을 변경할 수 있습니다. 두 식 코멘트를 사용

의사 코드에서

는, 플로우는 다음과 같이 대략 같다 :

create renderbuffer rbA 
create fboA (will be used for accumulation) 
bind fboA 
attach rbA to fboA 
clear 

create texture texB 
create fboB (will be used for rendering) 
attach texB to fboB 
(create and attach a renderbuffer for the depth buffer) 

loop over jitter offsets 
    bind fboB 
    clear 
    render scene, with jitter offset applied 

    bind fboA 
    bind texB for texturing 
    set blend function GL_CONSTANT_ALPHA, GL_ONE 
    set blend color 0.0, 0.0, 0.0, 1.0/#passes 
    enable blending 
    render screen size quad with simple texture sampling shader 
    disable blending 
end loop 

bind fboA as read_framebuffer 
bind default framebuffer as draw framebuffer 
blit framebuffer 

전체 슈퍼 샘플링이 가능하다. 위의 설명에서 Andon이 제안한 것처럼, 각 차원에서 윈도우 크기의 배수 인 렌더 타겟을 사용하여 FBO를 만들고, 결국에는 윈도우에 다운 스케일링 블리트를 수행합니다. 모든 것은 느린 경향이 있고 심지어 2의 계수만으로도 많은 메모리를 사용합니다.