본문 바로가기
C++ 200제/코딩 IT 정보

[OpenGL ES] 3. 렌더 버퍼(Render Buffers) 이해하기

by vicddory 2017. 10. 21.

[OpenGL ES] 3. 렌더 버퍼(Render Buffers) 이해하기


Render Buffer는 OpenGL ES의 Render로부터 넘어오는 이미지의 임시 저장소다.

아래는 frame buffer와 관련된 두 가지 기능이다.


1. GLvoid glGenRenderbuffers (GLsizei n, GLuint* renderbuffers)

n : 한 번에 몇 개의 render buffer를 만들 것인가.

renderbuffers : 생성된 frame buffer의 번호를 저장할 변수. 하나 이상을 만들 때는 배열의 시작점을 넣음.


2. GLvoid glBindRenderbuffer (GLenum target, GLuint renderbuffer)

target : 항상 GL_RENDERBUFFER.

framebuffer : 연결할 frame buffer의 번호.


OpenGL ES Render Buffer는 임시 저장소이며 3가지 타입으로 설정될 수 있다.


그래서 어떤 종류의 render buffer인지, 임시 이미지의 속성을 몇 가지 설정해야 한다. 아래의 함수로 render buffer의 속성을 설정한다.


RenderBuffer Properties

GLvoid glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)

-target : OpenGL ES에선 항상 GL_RENDERBUFFER


-internalformat : render buffer의 종류, 임시 이미지의 색상 포맷

  : GL_RGBA4, GL_RGB5_A1, GL_RGB56은 화면에 뿌려질 색상

  : GL_DEPTH_COMPONENT16은 깊이(z) 색상

  : GL_STENCIL_INDEX, GL_STENCIL_INDEX8은 스텐실 색상


-width : render buffer의 넓이


-height : render buffer의 높이


소스만 보면 어떤 render buffer를 위한 설정인가? 라는 의문이 들 수 있다.


이 속성들은 최종적으로 render buffer에 연결된다.


간단하게 3개의 OpenGL ES render buffer 설정 방법을 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GLuint colorRenderbuffer, depthRenderbuffer, stencilRenderbuffer;  
GLint sw = 320, sh = 480// Screen width and height, respectively.
 
// Generates the name/id, creates and configures the Color Render Buffer.
glGenRenderbuffers(1&colorRenderbuffer);  
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);  
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, sw, sh);
 
// Generates the name/id, creates and configures the Depth Render Buffer.
glGenRenderbuffers(1&depthRenderbuffer);  
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);  
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, sw, sh);
 
// Generates the name/id, creates and configures the Stencil Render Buffer.
glGenRenderbuffers(1&stencilRenderbuffer);  
glBindRenderbuffer(GL_RENDERBUFFER, stencilRenderbuffer);  
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, sw, sh);
cs


간단하지 않은가?


OpenGL ES Render Buffers[[OpenGL ES] 3. 렌더 버퍼(Render Buffers) 이해하기]


이 문서에서 다룰 큐브cube 어플리케이션엔 stencil buffer가 필요 없으니 아래처럼 최적화해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
GLuint *renderbuffers;  
GLint sw = 320, sh = 480// Screen width and height, respectively.
 
// Let's create multiple names/ids at once.
// To do this we declared our variable as a pointer *renderbuffers.
glGenRenderbuffers(2, renderbuffers);
 
// The index 0 will be our color render buffer.
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);  
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, sw, sh);
 
// The index 1 will be our depth render buffer.
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]);  
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, sw, sh);
cs


사족을 붙이자면, 이 단계는 cocoa framework에 있는 것과는 약간 다르다.


Apple(애플, 아이폰 제조사)은 개발자가 기기(iPhone)의 스크린에 직접 OpenGL ES render를 올리도록 허용하지 않고 있다. 개발자는 출력할 것을 color render buffer에 넣고 EAGL(애플용 EGL)에 출력할 것을 보여달라고 요청해야 한다.


이럴 경우 color render buffer는 반드시 호출/사용/구현해야 한다.


OpenGL ES 버퍼링[[OpenGL ES] 3. 렌더 버퍼(Render Buffers) 이해하기]


EAGLContext의 renderbufferStorage:fromDrawable 함수의 CAEAGLLayer은 개발자가 그리기 위한 정보를 담고 있다.


조금 헷갈리나? 다른 곳에서 Apple’s EAGL을 사용할 일이 생긴다면 해당 사이트를 참고하라. 어쨌든, glRenderbufferStorage 대신에 다음과 같은 코드로 color render buffer의 속성을 설정해보자.


번역자분 추가 내용

원래 opengl에서는 glRenderbufferStorage 함수를 쓰는 게 정석인데, 애플에서는 이걸 약간 바꿔서 EAGL 의 renderbufferStorage 메소드를 사용해야 함.


OpenGL ES color render buffer만 이래야 하고, depth render buffer, stencil render buffer는 원래대로 해야 함.


RenderBuffer Properties in case of Cocoa Framework

-target : 항상 GL_RENDERBUFFER.

-fromDrawable : 개발자가 생성한 CAEAGLLayer의 객체.


1
2
3
4
5
6
7
8
// Suppose you previously set EAGLContext *_context
// as I showed in my EAGL article.
 
GLuint colorBuffer;
 
glGenRenderbuffers(1& colorBuffer);  
glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);  
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:myCAEAGLLayer];
cs


renderbufferStorage:fromDrawable:을 호출할 때, EAGLCONtext는 레이어 관련 속성들을 가져온다.


그리고 color render buffer에 적절한 속성을 할당한다. 전에 만들었던 frame buffer에 render buffer를 놓는다. 하나의 frame buffer는 타입마다 한 개 render buffer만 가질 수 있다.


번역자분 추가 내용

frame buffer는 color render buffer 1개, depth render buffer 1개, stencil render buffer 1개만 가질 수 있다. 그래서 frame buffer는 2개의 color render buffer를 가질 수 없다.


frame buffer에 OpenGL ES render buffer를 붙이려면 아래의 함수를 사용한다.


OpenGL ES 렌더 버퍼[[OpenGL ES] 3. 렌더 버퍼(Render Buffers) 이해하기]


Attach RenderBuffers to a FrameBuffer 

GLvoid glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum

renderbuffertarget, GLuint renderbuffer)


-target : 항상 GL_RENDERBUFFER.


-attachment : frame buffer에 붙일 render buffer의 종류를 기술.


-renderbuffertarget : 항상 GL_RENDERBUFFER.


-renderbuffer : OpenGL ES render buffer의 번호.


같은 질문이 또 나올 수 있다.


“어떤 frame buffer에 어떤 render buffer들을 붙일지 OpenGL은 어떻게 알지?”


역시, 상태 머신을 이용한다.


Bind 된 마지막 frame buffer에 render buffer들을 붙이는 것이다.


출처 : All About OpenGL ES 2.X 번역

[OpenGL ES] 3. 렌더 버퍼(Render Buffers) 이해하기

댓글