2011-08-24 3 views
3

iPhone 4의 OpenGL ES에서 간단한 선 그리기를 실험하고 있습니다. GLfloats 배열에서 스틱 맨을 만들고 일반 UIView에서 스틱 맨 그리기를 테스트했습니다 (그리기 방법). 다음과 같이 출력은iPhone에서 OpenGL ES의 라인 다듬기

Example of drawing into UIView

문제는 내가 (다른 이유의 사이에) 최대 속도는 OpenGL에서이 도면을 할 필요가있다 ... 꽤 좋은입니다 그래서 객체의 수백이있는 경우 그리기는 여전히 빠릅니다. 내가 OpenGL을 ES 1.1에서 버전 간단한 선 드로잉을 시험 할 때, 나는 내가 그림을 그리고있는 하나 개의 배열 GL_LINES을 사용하고

enter image description here

(누락 된 머리를 무시!) 다음 있어요 GL_LINE_SMOOTH가 (GL_NICEST와 함께) 활성화되었지만 그 수치는 전혀 부드럽게 보이지 않습니다. 원시 라인이있는 OpenGL에서 더 부드러운 안티 앨리어싱 된 라인을 얻을 수있는 방법이 있습니까?

답변

4

Quartz를 사용하여 그린 선은 일반적으로 앤티 앨리어스 처리되지만, 기본적으로 OpenGL ES에서는 사실이 아닙니다. iOS 4.0부터, Apple은 OpenGL ES 구현에 멀티 샘플 앤티 엘리 어싱 (MSAA)을 추가 했으므로 라인을 부드럽게하고 장면의 다른 가장자리를 활성화 할 수 있어야합니다.

Apple은 iOS 용 OpenGL ES 프로그래밍 가이드 "Using Multisampling to Improve Image Quality"섹션에서이를 설정하는 방법을 설명합니다. 당신은 변경해야 할 수 있도록이 코드가,는 OpenGL ES 2.0 응용 프로그램에서 그려지는 것을

glGenFramebuffers(1, &msaaFramebuffer); 
glGenRenderbuffers(1, &msaaRenderbuffer); 

glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer); 

glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, backingWidth, backingHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderbuffer); 

glGenRenderbuffers(1, &msaaDepthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, msaaDepthbuffer); 
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, msaaDepthbuffer); 

참고 : 다음과 같은 코드를 사용하여 멀티 샘플링 프레임 버퍼, 버퍼 렌더링, 및 깊이 버퍼를 (필요한 경우)을 설정 1.1에 대한 적절한 OES 접미사를 추가하십시오. 당신이 당신의 프레임을 제시 이동하면

, 당신은 뭔가를 할 것이다 다음

glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, viewFramebuffer); 

glResolveMultisampleFramebufferAPPLE(); 

glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 

success = [context presentRenderbuffer:GL_RENDERBUFFER]; 

glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); 

당신은 색상과 깊이 버퍼를 폐기 할 수 있습니다 직전 또는 오른쪽으로 화면에 콘텐츠를 제시 한 후 최적화가있는 다음과 같은 코드를 사용할 수 있습니다

const GLenum discards[] = {GL_COLOR_ATTACHMENT0,GL_DEPTH_ATTACHMENT}; 
glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE,2,discards); 

나는이 MSAA는 OpenGL을 ES 2.0 응용 프로그램 here에서 작업 표시하는 클래스의 예를 만들었습니다. ES2Renderer 클래스를 살펴보고 MSAA 정의를 활성화하여이 동작을 확인하십시오. 다시 말하지만 OpenGL ES 1.1 응용 프로그램 내에서이 코드를 배치하는 것이 매우 간단합니다. 몇 가지 함수 및 상수 접미어를 변경해야하기 때문입니다. 섹션

+0

감사 – Simon

+0

멀티 샘플 앤티 앨리어싱을 사용하면 더 두꺼운 선을 그리면 조금 더 좋아 보이게됩니다. 브래드에게 진로를 줘서 고마워. – Simon

관련 문제