레이블이 OpenGL ES인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OpenGL ES인 게시물을 표시합니다. 모든 게시물 표시

2010년 5월 3일 월요일

Working with OpenGL ES Contexts and Framebuffers

원문

EAGL Context 생성
당신의 애플리케이션에서 OpenGL ES 명령을 실행하기 전에, 첫번째로 EAGL 컨텍스트를 반드시 생성 및 초기화 하고 현재 컨텍스트로 만들어야 한다.

EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
[EAGLContext setCurrentContext:myContext];

당신의 애플리케이션이 컨텍스트를 초기화 했을 때, 이것은 이 컨텍스트를 위해 어떤 버전의 OpenGL ES 를 사용할 것인지를 선택한다.  사용할 OpenGL ES 버전을 선택하는 것에 대한 더 자세한 정보는 "어떤 버전을 타겟으로 해야 하는가?" 를 보도록 하자.

당신의 애플리케이션의 각각의 스레드는 현재 렌더링 하고 있는 컨텍스트를 가리키는 포인터를 유지하고 있다.  당신의 어플리케이션이 현재 컨텍스트를 만들면, EAGL은 이전의 컨텍스트를 릴리즈 하고, 컨텍스트 오브젝트를 유지하고 앞으로 수행할 OpenGL ES 렌더링 명령을 위한 타겟으로 설정한다. 주의할 것은 많은 경우에, 다중 렌더링 컨텍스트들을 생성하는 것은 불필요할 것이라는 것이다. 당신은 종종 단일 렌더링 컨텍스트와 당신이 렌더링 할 각각의 이미지를 위한 하나의 프레임버퍼 오브젝트를 사용하는 같은 결과를 얻을 수 있다.

Framebuffer 오브젝트 생성
EAGL 컨텍스트가 명령들을 받기는 하지만, 이것이 그 명령들의 최종 타겟은 아니다.  당신의 어플리케이션은 픽셀들에 렌더링 할 목적지를 제공한다.iPhone OS 에서는, 모든 이미지들이 프레임 버퍼 오브젝트들로 렌더링 된다.  프레임 버퍼 오브젝트들은 모든 OpenGL ES 2.0 임플리먼테이션들에 의해 제공된다.  그리고, 애플은 또한 OpenGL ES 1.1 에서도 GL_OES_framebuffer_object 확장을 통해 모든 임플리먼테이션들을 제공한다.  프레임 버퍼 오브젝트들은 어플리케이션에서 색상, 깊이, 스텐실 타겟들의 생성을 정밀하게 제어할 수 있도록 한다.  게다가, 색상 타겟은 또한 텍스쳐의 포인터로도 사용될 수 있다.

프레임 버퍼를 생성하는 절차는 다음과 같다:
1. 프레임 버퍼 오브젝트 생성
2. 하나이상의 타겟 생성(렌더버퍼 또는 텍스쳐)하고, 메모리 할당, 그리고 프레임버퍼 오브젝트로 바인딩
3. 제대로 되었는지 프레임 버퍼 테스트
다음장에서는 이 개념을 더 자세히 확장하도록 한다.

오프스크린 프레임버퍼 오브젝트
오프스크린 프레임 버퍼는 렌더링된 이미지를 담아두는데 OpenGL ES 렌더버퍼를 사용한다.  다음의 코드는 OpenGL ES 1.1 에서 완전한 오프스크린 프레임 버퍼 오브젝트를 할당하는 것이다. OpenGL ES 2.2 어플리케이션은 OES 접미사를 제거하도록 한다.

1. 프레임버퍼 생성 및 바인드해서 미래의 OpenGL ES 프레임버퍼 명령들이 이것을 가리킬 수 있도록 한다.
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);  //생성
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);  //바인딩

2.색상 렌더버퍼를 생성, 메모리 할당, 그리고 프레임 버퍼에 attach

GLuint colorRenderbuffer;
glGenRenderbuffersOES(1, &colorRenderbuffer); //생성
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);  //바인딩
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, width, height);  //메모리 할당
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);  //프레임 버퍼에 attach

3. 깊이 렌더 버퍼 생성및 어테치하기 위해 비슷한 과정을 수행
GLuint depthRenderbuffer;
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

4. 제대로 됐는지 프레임 버퍼 확인.
GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if(status != GL_FRAMEBUFFER_COMPLETE_OES){
    NSLog(@"failed to make complete framebuffer object %x", status);
}


텍스쳐 렌더링에 프레임버퍼 오브젝트 사용 
당신의 어플리케이션은 텍스쳐에 바로 렌더링 하고 다음에 드로잉하기 위한 소스로 사용하기를 원할것이다. 예를 들어, 당신은 이것을 당신의 씬에 합성하여 거울에 반사되는 것을 렌더링 하는데 사용할 수 있다.  이 프레임버퍼를 생성하는 코드는 color attachment point에 어테치 되는 현재의 텍스쳐를 제외하고, 오프스크린의 예와 거의 동일하다.

1. 프레임 버퍼 오브젝트 생성
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

2. 색상 데이터를 담을 텍스쳐 생성
//Create the texture
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

3. 프레임버퍼에 텍스쳐 Attach
glFramebufferTextrue2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);

4. 깊이 버퍼 할당및 Attach(부착?)
GLuint depthRenderbuffer;
glGenRenderbufferOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

5. 프레임버퍼 테스트
GLenum status  = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if(status != GL_FRAMEBUFFER_COMPLETE_OES){
    NSLog(@"failed to make complete framebuffer object %x", status);
}


스크린에 드로잉하기
오프스크린 타겟들과 텍스쳐들 모두 흥미롭긴 하지만, 둘다 그들의 픽셀들을 스크린에 디스플레이 할 수는 없다. 그것을 하기 위해서 당신의 애플리케이션은 코어 애니메이션과 상호작용을 할 필요가 있다.
iPhone OS 에서는 모든 UIView 오브젝트들이 CoreAnimation 레이어들을 깔고 있다.  당신의애플리케이션이 OpenGL ES 컨텐츠를 스크린에 나타내기 위해서는,UIView 오브젝트를 타겟으로 할 필요가 있다.  나아가, 그 뷰는 반드시 특별한 CoreAnimation 레이어인 CAEAGLLayer오브젝트를 깔고(?)있어야 한다.(역주 : 즉, OpenGL ES 컨텐츠를 나타낼 타겟으로 하는 UIView의 레이어는 CAEAGLLayer이어야 한다는 뜻.)  그림 3-1에서 보여지는 바와 같이 CAEAGLLayer 오브젝트는 OpenGL ES를 잘 알고 있고, 렌더버퍼를 참조한다.
당신의 어플리케이션에서 이러한 결과들을 나타내려고 할 때, 렌더버퍼의 컨텐츠들은 다른 코어 애니메이션 레이어들과 애니메이션되고 합성되어 스크린으로 보내진다.

[그림 3-1] CoreAnimation은 OpenGL ES 와 렌더버퍼를 공유한다.


Xcode 에서는 당신이 이런 작업을 할 수 있도록 OpenGL ES 템플릿을 제공하지만, 이것은
이 OpenGL ES 템플릿은 Xcode 에서 당신이 이 작업을 할 수 있게 제공되지만, 이것은 스크린에 나타낼 수 있는 프레임 버퍼 오브젝트를 생성하는데 사용되는 과정들을 보여주는 예일 뿐이다.

1. UIView를 서브클래싱 하고 당신의 iPhone 어플리케이션을 위한 뷰를 설정한다.

2. 당신의 뷰 클래스의 오브젝트를 생성한 후, CALayer 오브젝트 대신에 CAEAGLLayer 오브젝트로 초기화 하기 위하여 UIView 클래스의 layerClass 메서드를 오버라이드 한다.
+(Class)layerClass
{
    return [CAEAGLLayer class];
}

3. UIView의 layer 메서드를 호출하여 뷰와 연관된 레이어를 얻는다.
myEAGLLayer = (CAEAGLLayer *)self.layer;

4. 레이어 속성들을 설정한다.
선택 작업을 위해서, CALayer 클래스에서 제공되는 opaque 속성을 설정함으로써 불투명한 레이어를 나타내는 것이 권장된다. "당신의 결과를 나타내기"를 보자.

5. CAEAGLLayer 오브젝트의 drawableProperties 속성값에 새 딕셔너리를 할당하는 것에 의해서 렌더링 서페이스의 서페이스 속성들을 선택적으로 구성한다.
EAGL은 당신이 렌더링된 픽셀들의 포멧을 렌더버퍼가 그의 컨텐츠들을 스크린에 표시한 후에도 유지하든 말든 간에 명세할 수 있게 한다.  당신은 이 속성들을 kEAGLDrawablePropertyColorFormat 과 kEAGLDrawablePropertyRetainedBacking 키들을 사용하는 딕셔너리에서 식별할 수 있다.  당신이 설정할 수 있는 키들의 리스트들은  EAGLDrawable Protocol Reference 를 보도록 하자.

6. 앞서, 프레임 버퍼를 생성한다.
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

7. 색상 렌더버퍼를 생성하고 렌더링 컨텍스트를 호출하여 우리의 CoreAnimation 레이어의 저장소에 할당하도록 하자. 렌더버퍼 저장소의 가로, 세로, 그리고 포멧은 renderbufferStorage:fromDrawable: 메소드가 호출된 순간에 CAEAGLLayer 오브젝트의 속성들과 바운드들로 부터 얻어진다.
GLuint colorRenderbuffer;
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[myContext renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:myEAGLLayer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
만약에 코어 애니메이션 레이어의 속성들이 변하면, 당신의 애플리케이션은 반드시  renderbufferStorage:fromDrawable: 을 다시 호출하여 렌더버퍼를 다시 할당해 줘야 한다.
디스플레이를 위해 스케일 또는 이동시킨 이미지는 상당한 퍼포먼스 비용이 발생할 수 있으므로, 성공적으로 렌더링할수 없을 수도 있다.  예를 들어, 템플릿에서, 프레임버퍼와 렌더버퍼 오브젝트들은 CAEAGLLayer 오브젝트가 변하는 범위에서는 언제든지 파괴되고 재생성된다.

8. 색상 렌더버퍼의 가로와 세로를 얻는다.
GLint width;
GLint height;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height);

9. 깊이 버퍼 할당및 어태치(Attach)
GLint depthRenderbuffer;
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

10. 프레임 버퍼 오브젝트 테스트
GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if(status != GL_FRAMEBUFFER_COMPLETE_OES)
{
    NSLog(@"failed to make complete framebuffer object %x", status);
}

프레임버퍼 오브젝트를 생성하는 과정을 반복하는 것은 세가지 경우가 모두 비슷하며, 프레이버퍼 오브젝트의 color attachment point 로 어태치 된 오브젝트의 할당을 어떻게 할 것인지에 대한 것만 다르다.

[표 3-1] 프레임버퍼의 Color Attachment 할당을 위한 매커니즘
오프스크린 렌더버퍼 glRenderbufferStorageOES
그릴 수 있는 렌더버퍼 renderbufferStorage:fromDrawable:
텍스쳐 glFramebufferTexture2DOES

프레임 버퍼 오브젝트 그리기
프레임 버퍼 오브젝트를 할당했을 때, 당신은 그곳에 렌더링 할 수 있었다. 모든 렌더링은 현재 프레임 버퍼 영역의 타겟이 된다.
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);


당신의 결과들을 나타내기
당신이 색상 렌더버퍼를 CoreAnimation 레이어에서 포인트로 할당했다고 가정하면, 당신은 현재 렌더버퍼를 만들고 렌더링 컨텍스트에서 presentRenderbuffer:메서드를 호출 하는 것으로 그 컨텐츠들을 나타낼 수 있다.
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

기본적으로, 이 렌더버퍼의 컨텐츠들은 스크린에 표시된 후에는 유효하지 않다.  당신의 어플리케이션은 반드시 프레임을 그릴때마다 렌더버퍼의 컨텐츠들을 완전히 재생성해 주어야 한다.  만약에 당신의 어플리케이션이 프레임들 사이에 컨텐츠들을 보존해야 한다면, kEAGLDrawablePropertyRetainedBacking 키를 CAEAGLLayer오브젝트의 drawableProperties 속성에 저장된 딕셔너리에 추가해야 한다.  레이어의 컨텐츠를 유지하는 것은 할당에 필요한 부가적인 메모리가 요구될 것이다. 이것은, 당신의 어플리케이션의 퍼포먼스를 경감시킬 수 있다.

렌더버퍼가 스크린에 표시되었을 때, 이것은 스크린 상에 보이는 다른 코어 애니메이션 레이어들과 OpenGL ES, Quartz 또는 그밖의 다른 그래픽스 라이브러리로 그려진 레이어들이든 말든간에 애니메이션 되고, 합성된다.  다른 컨텐츠와 섞인 OpenGL ES 컨텐츠는 성능에 불리한 점을 가져온다. 가장 좋은 연습을 위해서는, 당신의 애플리케이션에서 OpenGL ES로만 컨텐츠를 렌더링해 보는 것이다.  이것을 하기 위해서는, 스크린 크기의 CAEAGLLayer 오브젝트를 생성하고, opaque 속성을 YES, 그리고 다른 눈에 보이는 Core Animation 레이어들이나 뷰들은 없도록 하는 것이다.
만약 다른 레이어들과 OpenGL ES 를 합성해야 한다면, 당신의 CAEAGLLayer 오브젝트의 불투명도를 줄이도록 한다. 이것은 퍼포먼스 감소를 없애지는 않는다.

만약 당신의 CAEAGLLayer 오브젝트가 다른 레이어들과 블렌드되었다면, 코어 애니메이션은 상당한 퍼포먼스 패널티를 얻게 된다.  당신은 이런 패널티를  다른 UIKit 레이어들의 뒤에 당신의 레이어를 동작시키는 것으로 감소시킬 수 있다.
주의 : 만약에 반드시 투명한 OpenGL ES 컨텐츠를 블랜드 해야 한다면, 당신의 렌더버퍼는 코어 애니메이션에 의해서 알맞게 합성되기 위해서 알파값이 먼저 곱해진 버퍼를 반드시 제공해야 한다.

결론적으로 CAEAGLLayer 오브젝트에 코어 애니메이션 변형을 사용할 필요는 거의 없으며, 코어 애니메이션 처리는 당신의 컨텐츠를 디스플레이 하기 전에 반드시 해야 한다.  당신의 애플리케이션은 모델 뷰와 투영 행렬들(또는 당신의 버텍스 쉐이더와 같은 것들), 그리고 glViewport와 glScissor 함수들로 가로와 세로 속성들을 변경하는 것에 의해서 종종 같은 동작을 수행할 수 있다.

공유그룹
EAGLSharegroup 오브젝트는 하나이상의 EAGLContext와 관련된 OpenGL ES 리소스들을 관리한다.  공유그룹은 보통 EAGLContext 오브젝트가 릴리즈 된 것이 참조하는 것이 마지막 EAGLContext 오브젝트일 때 초기화되고, 배치되었을 때 생성된다.  불투명 오브젝트로서, 개발자가 접근가능한 API 는 없다.
단일 공유그룹을 사용하여 다중 컨텍스트들을 생성하려면, 앞에서와 같이 당신의 어플리케이션은 첫번째로 하나의 컨텍스트를 생성한 후, initWithAPI:sharegroupe: 를 사용해서 하나이상의 부가적인 컨텍스트들을 생성한다.
EAGLContext * firstContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
EAGLContext * secondContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[firstContext sharegroup]];

공유그룹들은 텍스쳐, 버퍼, 프레임버퍼, 그리고 렌더 버퍼들을 관리한다.  공유그룹의 다중 컨텍스트들이 이 오브젝트에 접근했을 때, 공유된 오브젝트들의 상태 변화를 관리하는 것은 당신의 어플리케이션 책임이다.  다른 컨텍스트에서 렌더링 되기 위해 사용되는 동안 공유 오브젝트의 상태변화의 결과는 정의되지 않는다.  확실한 결과들을 얻으려면, 당신의 어플리케이션은 당신의 어플리케이션이 그것을 수정할 때 렌더링을 위해 사용되는 현재 공유되고 있지 않은 오브젝트를 확실히 할 과정을 명확히 해야 한다.
나아가, 상태 변화들은 공유그룹에서 그 컨텍스트가 공유된 오브젝트를 다시 바인드 할때까지 다른 컨텍스트에 의해서 발견될 상태 변화들은 보장받지 못한다.


공유그룹에서 컨텍스트 전반에 걸쳐 공유된 오브젝트들로 상태변화의 결과를 정의하기 위해, 당신의 어플리케이션은 반드시 다음의 작업들을 순서대로 수행해야 한다:

  1. 오브젝트의 상태 변경
  2. 상태수정 루틴을 수행하는 렌더링 컨텍스트에서 glFlush를 호출한다.
  3. 각 컨텍스트는 반드시 변화를 보기 위해서 오브젝트를 다시 바인드 해야 한다.
원래의 오브젝트는 공유 그룹의 모든 컨텍스트들이 새로운 오브젝트의 영역을 가지게 된 후에는 삭제된다.




========================================
가독성도 떨어지고, 해석도 이상해서 못봐주겠다 싶으면 원문 참고 하세요.
오타, 오역은 댓글로 알려주시면 "Thank you very 감사" 하겠습니다 ^^

2010년 4월 13일 화요일

OpenGL ES 에서 축소된 기능들

OpenGL ES의 다른 많은 특성들이 범위와 기능 면에서 상당히 축소 되었다.
OpenGL ES는 여전히 부동소수점이나 부동소수점 형식의 glColor4, glNormal3 그리고 MultiTexCoord4 명령을 사용해 색상과 법선, 텍스처 좌표 등을 지정하는 제한된 지원을 제공하고 있다.
이들 함수들은 예를 들어, 이들 상태 중 하나가 전체 버텍스 배열에서 상수로 유지될 때만 사용이 가능하다.
 전체 변환 파이프라인은 여전히 제자리를 유지하고 있지만 새로 지정된 데이터 타입(더블 등이 제거된)만 받을 수 있다. OpenGL ES 는 이외에도 전치 행렬을 지원하지 않으며, 모델 뷰 행렬 스택의 최소 깊이가 32에서 16으로 축소 되었다.

[텍스처 맵핑]
  • 2D 텍스처만 지원
  • 다중 텍스처는 선택사항
  • GL_COMBINE 텍스처 환경 제거됨
  • 텍스처 좌표 생성/큐브맵 지원 제거
  • 텍스처 테두리/wrap 모드 GL_CLAMP/GL_CLAMP_TO_BORDER 지원 하지 않음
  • 텍스처 프록시/LOD 고정/편의 인자 등 제거
  • 텍스처 압축 지원하나 압축되니 텍스처 다시 읽기는 불가능
  • 압축되지 않은 이미지를 압축하는데 glTexImage2D 사용 불가

[래스터 작업]
  • 대부분의 래스터 작업 제거됨
  • glPixelStore : 텍스처 데이터의 포장과 해제만 지원
  • glReadPixels : 픽셀 읽기 가능, 깊이/스텐실 버퍼의 값을 읽는데는 사용불가
  • glDrawPixels, glPixelTransfer, glPixelZoom 함수 지원 X
  • glReadBuffer, glDrawBuffer, glCopyPixels 함수 지원 X
  • 폴리곤 오프셋은 채움 모드에서만 지원됨.
  • glPloygonMode는 더이상 지원되지 않음.
[조명]
  • 최소 8개의 광원 지원해야 함.
  • 2면 조명 지원.(전면과 후면 재질 속성이 같아야 함)
  • 색상 재질 모드로 GL_AMBIENT_AND_DIFFUSE만 지원
  • 보조 색상 / 지역 관찰자 조명 모델 제거 됨  

[-- 내용 출처 : OpenGL SuperBible 3판 --]

OpenGL ES 에서 제거된 기능들

다음은 OpenGL -> OpenGL ES 로 가면서 제거된 기능들에 대한 목록이다.

  • 지오메트리 열거를 위한 Begin/End(OpenGL ES는 버텍스 배열만을 사용한다.)
  • 인터리브(interleaved) 배열 혹은 glArrayElement 지원
  • 출력 목록 
  • 평가자 
  • 색상 인덱스 모드
  • 사용자 정의 클리핑 평면
  • 선이나 폴리곤 점각법
  • glRect
  • 이미징 서브셋
  • 피드백
  • 선택
  • 누적 버퍼
  • 경계 플래그
  • glPolygonMode
  • GL_QUADS, GL_QUAD_STRIP, GL_POLYGON 기본 모델 들
  • 속성 저장 :  glPushAttrib, glPopAttrib, glPushClientAttrib 혹은 glPopClientAttrib

2010년 3월 24일 수요일

iPhone UI using OpenGL ES



게임인것 같네요.

2010년 3월 11일 목요일

Framebuffers

원문참조

Framebuffer 오브젝트들은 모든 명령들의 타겟이다.
원래 OpenGL ES 에서 framebuffer는 플렛폼에 한정된 인터페이스를 사용하도록 만들어졌다.
각 플렛폼은 그들 나름대로의 스크린에 그려질 수 있는 프레임 버퍼를 생성하는 함수를 제공한다.
OES_framebuffer_object는 오프스크린 렌더버퍼나 텍스쳐들로 렌더링되는 프레임버퍼들을 생성하고 구성하는 일반적인 메커니즘을 제공하도록 OpenGL ES 를 확장한다.
Apple은 프레임버퍼 오브젝트를 생성하기 위한 플렛폼 인터페이스를 제공하지 않는다.
OpenGL ES 2.0에서는 이 함수들이 코어 명세서의 일부이다.

프레임버퍼 오브젝트는 그림 1-1과 같이 프레임 버퍼에 들어가는 이미지에 대한 color, depth, 또는/그리고 stencil 데이터를 위한 저장을 제공한다.
가장 일반적인 이미지 부가장치는 renderbuffer 이다.
texture 역시 프레임버퍼의 색상 부가장치로 부가될 수 있지만, 이미지를 그리고 나면, 텍스쳐는 다른 도형에 맵핑 된다.

그림 1. 프레임 버퍼의 color, depth & stencil buffer들

프레임 버퍼를 생성하는 일반적인 절차 :
1. 프레임버퍼를 생성하고 연결(bind)
2. 이미지 생성, 연결, 구성
3. 프레임버퍼에 이미지 부착(Attach)
4. 다른 이미지들을 위해 2,3단계 반복
5.완전성을 위하여 프레임 버퍼 테스트. 완전성에 대한 규칙은 명세서에 나와 있음.
이 규칙들이 프레임 버퍼와attachment들이 제대로 정의되도록 보장한다.

2010년 1월 29일 금요일

OpenGL ES 관련 사이트 링크



OpenGL ES Implementations, Tutorials and Sample Code

http://www.khronos.org/developers/resources/opengles/






ZEUS CMD OpenGL ES Tutorials
http://www.zeuscmd.com/tutorials/opengles/index.php


 

내 블로그 목록

팔로어