2011-08-26 4 views
22

이 주제에 관해 많은 자료를 보았지만 발견 한 예와 약간의 차이점이 있으며 올바른 프로세스를 확실하게 이해하는 데 어려움을 겪고 있습니다. 바라기를 누군가는 나가 맞은 궤도에다는 것을 저에게 말할 수있다. Xcode 3의 최신 버전 인 OS X Snow Leopard에서이 작업을 수행하고 있음을 언급해야합니다.OpenGL 다중 렌더 타겟 설정

예를 들어 정상적인 것과 목표 한 두 가지 대상에 쓰기를 원한다고 가정 해 봅시다. . 내가 다시 프레임 버퍼를 바인딩하고 것, 할 렌더링하기 전에

glGenFramebuffersEXT(1, &mFBO); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); 

glGenTextures(1, &mTexColor); 
glBindTexture(GL_TEXTURE_2D, mTexColor); 
//<texture params> 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0); 

glGenTextures(1, &mTexNormal); 
glBindTexture(GL_TEXTURE_2D, mTexNormal); 
//<Texture params> 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0); 

glGenTextures(1, &mTexDepth); 
glBindTexture(GL_TEXTURE_2D, mTexDepth); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0); 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) 

: 이렇게하려면 나는 하나의 프레임 버퍼를 생성하고이 개 그것에 텍스처뿐만 아니라 깊이 텍스처를 결합

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; 
glDrawBuffers(2, buffers); 

이는 것 추가 드로 콜이 내 프레임 버퍼에 그려지는 것을 의미합니다. (제 생각에는?)

그러면 셰이더를 설정하고 장면을 그립니다. 내 버텍스 쉐이더에서는 평소처럼 법선/위치/색상을 처리하고 데이터를 프래그먼트 쉐이더로 전달합니다. 그런 다음 조각은 다음과 같이 처리합니다.

gl_FragData[0] = OutputColor; 
gl_FragData[1] = OutputNormal; 

이 시점에서 두 개의 질감이 있어야합니다. 하나는 렌더링 된 모든 객체의 색상이고 하나는 법선이있는 색상입니다. 이 모든 것이 맞습니까? 이제는 다른 텍스처처럼 텍스처를 사용할 수 있어야합니다. 전체 화면 쿼드로 렌더링하는 것이 좋을까요?

답변

10

소리가 적당하고 보입니다. 이것은 실제로 그렇게하는 일반적인 방법입니다. 추가 처리를 위해 깊이 데이터가 텍스처로 필요하지 않은 경우 첨부 파일에 렌더 버퍼를 사용할 수도 있지만 텍스처도 잘 작동해야합니다.

모든 설정을 완료 한 후에 glCheckFramebufferStatusEXT을 사용하여 프레임 버퍼가 현재 구성에서 유효하지만 코드가 정상적으로 표시되는지 확인할 수 있습니다. 문제가 없으며 이것이 보증을위한 것이라면, 올바른 길을 가고 있는지 확인하십시오. 그렇지 않으면 무엇이 잘못되었는지 알려주십시오.

+0

답변 해 주셔서 감사합니다. 내가 확신하지 못했던 물건을 할당하지 않았 음을 보증하는 보증 유형의 질문 이상의 것이 었습니다. 그리고 그 명령은 괜찮아 보였습니다. 텍스처 대신 렌더 버퍼를 사용하면 성능상의 이점이 있습니까? – TaylorP

+0

@TaylorP 잘 모르겠습니다. –

+2

오래된 질문입니다. 그러나 예, 렌더링 버퍼를 사용하면 텍스처를 사용하는 것과 비교하여 성능이 향상됩니다. renderbuffer는 드로잉 작업을 처리하기위한 데이터와 프로세스를 저장하는보다 최적화 된 방법을 이용할 수 있습니다. – Vallentin