2013-05-06 4 views
2

이해 : 프레임 버퍼라고하는 것이 있습니다. 버퍼 객체에 대한 포인터의 배열입니다. 버퍼 오브젝트는 예를 들어 렌더 버퍼, 텍스처 버퍼 또는 기타 일 수있다. 무언가를 그려야한다면 프레임 버퍼에 렌더링 버퍼를 첨부하고 드로잉 버퍼를 사용하여 마지막으로 메서드를 호출하여 화면으로 보냅니다.OpenGLES iOS의 버퍼 이해

1) 지금까지 정확합니까?

이해가 안 무엇 :

2) 내가 컨텍스트가 생성 될 때 프레임 버퍼가 생성되는 곳 읽을 생각합니다. 아아, 내가 본 것을 더 이상 찾을 수 없다. 프레임 버퍼가 실제로 생성되면 왜 glGenFramebuffersOES(1, &framebuffer)glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer)을 호출해야합니까? 이해할 수있는대로 첫 번째는 첨부 파일을위한 공간이 하나있는 새로운 프레임 버퍼를 만들고 두 번째 줄은 컨텍스트의 프레임 버퍼 포인터를 framebuffer으로 설정합니다. 그러나 컨텍스트에서 이미 프레임 버퍼가 있다고 가정하면 왜 그 프레임 버퍼를 검색하고 대신 렌더링 버퍼를 첨부 할 수 있습니까?

3) "기본 프레임 버퍼"란 무엇입니까? 이름이 0 인 프레임 버퍼입니다. 이미 기본 프레임 버퍼가있는 경우 그릴 필요가있는 경우 왜 새 프레임 버퍼를 만들어야합니까?

답변

6

1) 지금까지 정확합니까?

글쎄, 다소 차이가 있습니다. 개념적으로 프레임 버퍼은 특정 의미론, 하나 (또는 ​​심지어 0) 이상의 색상 버퍼, 가능한 한 깊이 버퍼 및 가능하면 하나의 스텐실 버퍼가있는 버퍼 집합입니다. 그것들은 조각의 해당 값이 쓰여지는 대상입니다. 2 대답) 3), 당신은 기본 프레임 버퍼프레임 버퍼 개체 (FBO)의 차이를 이해해야하는 그러나

. 각 OpenGL 컨텍스트에는 기본 프레임 버퍼 (일부 플랫폼 별 방법을 통해 컨텍스트 생성시 해당 속성이 지정됨)가 있습니다.이 프레임 버퍼는 실제로 표시되는 항목과 가능한 경우 포함되는 한 개의 색상 버퍼 (현재는 이중 및 스테레오 버퍼링을 무시합시다)를 포함합니다. 해당 깊이와 스텐실 버퍼. 따라서 디스플레이에서보고 싶은 것이 든간에 조만간 기본 프레임 버퍼로 전환해야합니다. 그러나이 기본 프레임 버퍼의 개별 버퍼는 고정되어 있습니다. 즉, 텍스처 또는 렌더 버퍼를 바인딩하거나 다른 버퍼에 대한 버퍼를 전환 할 수 없습니다 (예 : 사물을 복사하거나 복사 할 수는 있지만 일부 다른 메모리 영역).

FBO (FBOs) (모든 gl...Framebuffer... 함수와 함께 생성되고 사용되는)를 직접 만들 수 있습니다. 그것들은 결국 실제 데이터 컨테이너를 연결할 수있는 개별 버퍼 채널 (다중 색상 첨부, 깊이 및 스텐실 첨부)에 대한 연결 지점 세트를 제공하는 경량 OpenGL 객체 (무거운 데이터 컨테이너가 없음) 텍스처 또는 렌더 버퍼와 유사합니다. 그리고 모든 첨부 파일들은 함께 기본 프레임 버퍼와 비슷한 실제 프레임 버퍼를 정의합니다. 그러나 FBO의 장점은 임의의 컨테이너를 첨부 할 수 있으므로 텍스처에 직접 렌더링하는 것과 같은 것을 허용한다는 것입니다. 마찬가지로 일부 OS 리소스 또는 디스플레이에 바인딩되지 않으므로 일반적으로 오프 스크린 렌더링이 가능합니다.

(깊이 및 스텐실 테스트를 거친) 프리미티브를 화면에 표시하는 일상적인 작업의 경우 기본 프레임 버퍼가 완벽하게 충분하므로 FBO를 전혀 사용하지 않아도됩니다. 예를 들어 FBO가 사용 된 경우화면 상에 표시되지 않는 무언가를 그려야하며, 일반적으로 추가 처리에 사용될 텍스쳐에 직접 입력하거나, CPU에서 읽어서 거기서 처리해야합니다. 좋은 예는 쉐도우 맵 생성 (장면을 쉐이딩 된 객체를 화면에 렌더링 할 때 사용되는 뎁스 텍스처로 렌더링하는 경우) 또는 포스트 프로세싱 효과 (씬을 렌더링 할 때 사용할 색상 텍스쳐로 렌더링하는 경우)입니다. 마지막으로 화면에 표시되기 전에 몇 가지 추가 사후 처리 쉐이더). 그러나 유스 케이스는 무수히 많습니다.

그럼 (하지만, 반복 조심) 다시 질문을 살펴 보자) :

2) 나는 내가 컨텍스트가 생성 될 때 프레임 버퍼가 생성되는 곳 읽을 생각합니다.

예,하지만 그 프레임 버퍼는 프레임 버퍼 개체와 같지 않습니다.

그러나 만약

내가 glGenFramebuffersOES(1, &framebuffer)glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer) 전화를해야 할 이유는 정말로 작성되는 프레임 버퍼?

차례로 기본 프레임 버퍼와 다른 자체 프레임 버퍼 객체를 생성합니다.

하지만 프레임 버퍼가 이미 있다고 가정 할 때 왜 을 검색하고 그 대신 렌더링 버퍼를 첨부 할 수 있습니까?

기본 프레임 버퍼는 완전한 프레임 버퍼 개체의 기능을 가지지 않으므로 해당 데이터를 렌더 버퍼와 같은 다른 데이터 컨테이너로 다시 가져올 수 없습니다. 실제 디스플레이 OS 리소스에 연결된 사전 정의 된 스토리지 만 있습니다.

3) "기본 프레임 버퍼"란 무엇입니까? 이미 이름이 인 프레임 버퍼입니다. 이미 기본 프레임 버퍼가있는 경우 그릴 경우 왜 새 프레임 버퍼를 만들어야합니까?

위와 동일합니다. FBO ID 0은 기본 프레임 버퍼의 자리 표시 자이므로 "전혀 FBO가 없음"을 의미합니다. 이것은 glBindFramebuffer(GL_FRAMEBUFFER, 0) (ID 0으로 호출 할 수있는 유일한 함수 임)을 할 때 GL에서 이제부터 기본 FB 버퍼가 아닌 기본 프레임 버퍼를 읽고 쓰고 싶다고 말합니다.

결론적으로 컨텍스트 생성시 생성되는 기본 프레임 버퍼는 프레임 버퍼 객체의 모든 기능을 갖지 않습니다. 즉, 임의의 메모리 영역을 개별 버퍼로 연결하는 것으로, 일부 (전부는 아님) 렌더링 시나리오에서 필요합니다. . 이 기능이 필요한 경우 질문에 나열한 기능을 사용하여 프레임 버퍼 객체 (FBO)를 만들고 관리해야합니다.

+0

와우, 멋진. 당신의 대답을주의 깊게 읽으려면 잠깐 시간을 내 보자. –

+1

@MattN. - Christian이 위에서 말한 것에 더하여, [framebuffer 객체는 iOS의 유일한 렌더링 대상입니다.] (http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html# // apple_ref/doc/uid/TP40008793-CH101-SW8),이 플랫폼에서 기본 프레임 버퍼로 작업하지 않을 것입니다. –

+1

@BradLarson 그래서 iOS에는 실제로 이미 존재하는 기본 FBO가 있습니까?이 파일에 액세스 할 수있는 방법이 있고 첨부 파일을 다시 첨부하는 경우 iOS의 복잡함에 대해 더 많은 정보를 제공하는 추가 답변을 제공 할 수 있습니다. –