OpenGLES 및 IOS 프로그래밍
하나.OpenGL ES 객체 및 인터페이스 함수
OpenGL ES의 객체는 플랫폼 관련 문제와 OpenGL 렌더링 관련 두 가지 문제에 사용됩니다.
EGLDIsplay와 EGLSurface는 플랫폼과 관련된 문제를 처리하는 데 사용됩니다.
EGLcontext는 OpenGL 렌더링과 관련된 문제를 처리합니다.
1. EGLDIsplay는 렌더링 결과를 표시하는 렌더링 창으로 간단하게 이해할 수 있습니다.EGLSurface는 이 창의 표시 표면을 이해할 수 있습니다.이surface에 그려진 내용만 렌더링 창에서 마지막으로 보이는 화면입니다.1) 일반 애플리케이션 플랫폼은 OpenGLES 객체를 사용할 때 다음 API를 사용하면 됩니다.
eglGetDisplay, eglInitialize, eglChooseConfig, eglCreate Window Surface 등.
2) 그러나 애플 플랫폼에서 OpenGLES에 대한 사용은 약간 다르다.IOS 프로그래밍에는 반드시 UIWindow 클래스의 실례 대상이 있어야 한다. UIWindow는 위의 EGLdisplay와 맞먹는다.
또한 UIView 클래스에서 파생된 클래스(CustomView라고 할 수 있음)가 있어야 합니다. UIView는 위의 EGLSurface에 해당합니다.또한 CustomView의 멤버 변수 layer를 CALayer 유형에서 CAEAGLlayer 유형으로 변경해야 합니다.CAEAGLLAyer 구성원의 역할은 eglChooseConfig 함수와 유사합니다.대상surface의 넓이, 높이, 픽셀 형식, 투명성 등 속성을 설정합니다.CAEAGLLAyer를 설정한 후 이 대상의 설정을 매개 변수로 하고renderbuffer Storage를 호출하여 해당하는 메모리 공간을 분배합니다. (그 역할은 eglCreate Window Surface와 유사합니까?)
명확한 것은 UIView의 최종 디스플레이 결과는 그것에 포함된 모든 레이어의 화면이 중첩되어 이루어진 것이다.
2. EGLcontext와 OpenGL 렌더링과 관련된 내용은 EGLcontext 대상에서 관리합니다.먼저 eglCreateContext 함수를 호출하여 EGLcontext 대상을 만들고 EGLcontext 내부에서 더블 버퍼 메커니즘을 사용하여 렌더링 결과의 표시를 실현합니다.EGLcontext에는 두 개의 Framebuffer 객체가 있습니다.하나는 백이고 하나는 front입니다.한 프레임을 렌더링한 후에eglSwapBuffers 함수를 호출하면 EGLcontext는 두 개의 Framebuffer의 위치를 자동으로 교환하고 Front Framebuffer의 내용을 해당하는 EGLSurface에 제출합니다.
한 프로세스에서 여러 개의 EGLcontext 대상 (eglCreate Context) 을 동시에 만들 수 있지만, 현재 context는 하나밖에 없습니다. eglMakeCurrent를 통해 설정해야 합니다.
Apple 플랫폼에서는 사용량이 약간 다릅니다.
Apple 플랫폼에서는 직접 Surface를 사용할 수 없습니다.이것은 애플에서 eglSwapBuffers 함수를 호출해서 렌더링 결과가 목표surface에서 업데이트되는 것을 직접 실현할 수 없다는 것을 의미한다.
애플 플랫폼에서 먼저 EAGLcontext 대상을 만들어서 EGLcontext(eglCreate Context를 통해 생성할 수 없음)를 대체해야 한다. EAGLcontext의 역할은 EGLcontext와 유사하다.
그런 다음 해당 Framebuffer와 Renderbuffer를 생성합니다.
Framebuffer는 Renderbuffer 집합과 같습니다. (여러 개의 Renderbuffer 대상을 포함할 수 있습니다.)
Renderbuffer는 세 가지가 있는데 그것이 바로 color Renderbuffer,depth Renderbuffer,stencil Renderbuffer이다.렌더링 결과는 Framebuffer에 출력한 다음 context의presentRenderbuffer를 호출하여 Framebuffer의 내용을 이전의CustumView에 제출합니다.
둘.IOS에서 3D 장면을 렌더링하는 방법은 다음과 같습니다.
1. OffScreen Framebuffer 객체를 생성합니다.3D 장면의 렌더링 결과는 Framebuffer에서 최종적으로 나타납니다.
renderbuffer (또는 color buffer) 를 생성하고 Framebuffer와 연결합니다.
glGenFramebuffers를 사용하여 프레임 버퍼를 만듭니다.
glGenRenderbuffers를 사용하여 렌더링 버퍼를 만듭니다.
그리고glFramebuffer Renderbuffer로 Renderbuffer를 해당하는 Framebuffer에 연결합니다.
2. CAEAGLLAyer 객체를 생성합니다.
그림의 최종 출력 창인 UIView에는 표시할 그림이 이 쌍에 그려진 구성원 변수 CALayer가 있습니다.또한 하나의 UIView에는 여러 개의 CALaye가 있을 수 있고 이런 CALayer 사이에는 하나의 트리 데이터 구조를 형성할 수 있으며 모든 layer의 결과 데이터가 중첩되어 최종 화면을 형성할 수 있다.Core Animation Layer가 OpenGL ES,Quartz, 또는 다른 어떤 도형 라이브러리로 묘사되었든 상관없다.
출력 화면을 OpenGLES에만 의존하여 출력된 이미지를 렌더링하려면 CAEAGLLAyer 객체를 만듭니다.불투명성을 YES로 설정합니다.
3. EAGLcontext 객체 생성
EAGLcontext 객체는 렌더링 상태 정보, 명령 및 렌더링될 리소스(An
EAGLContext
object manages the state information,commands, and resources needed to draw using OpenGL ES.)를 관리합니다.또한 화면을 context 객체에 표시하기 전에 이 Context 위에 프레임 buffer를 연결해야 합니다(To draw to an EAGL context, a complete framebuffer object must first be bound to the context. ) . 그러나 많은 자료를 찾았지만 프레임 버퍼와 context를 어떻게 연결하는지 보지 못했고,render 버퍼와 context를 연결하는 인터페이스만 보았다.4. Framebuffer와 CAEAGLlayer의 연결
상기 세 개의 대상을 창설한 후,
a. EAGLcontext의 클래스 방법을 먼저 호출하기 전에 생성된 EAGLcontext 대상을 현재context로 설정합니다.
b. 그리고 EAGLcontext 대상의renderbuffer Storage 인터페이스 함수를 호출하여 이전에 생성된CAEAGLLAyer 대상에게 공간을 분배합니다.
(IOS 문서에 따르면: Allocate its storage by calling the context's
renderbufferStorage:fromDrawable:
method,passing the layer object as the parameter. The width, height and pixel format are taken from the layer and used to allocate storage for the renderbuffer. )
c. 렌더링하기 전에glBindFramebuffer를 사용하고 이전에glGenFramebuffers로 만든 프레임 버퍼를 현재Framebuffer(context에 귀속?)로 귀속합니다.
이렇게 되면 이후의 모든 렌더링 명령은 현재 귀속된 Framebuffer (즉 새로 만든 Framebuffer) 에 대한 것입니다.
다음을 참조하십시오.http://miaoshuanghe.blog.163.com/blog/static/140130476201052453756439/Framebuffer에 대한 설명입니다.
d. 렌더링이 완료되면 먼저 호출합니다.
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
Renderbuffer context .(IOS :binds the renderbuffer to the context)
이 때 현재 Framebuffer는 renderbuffer에 의해 완전히 제어됩니다(The color renderbuffer holds the completed frame, so all you need to do is present it to the user).
이른바 홀드의 의미는 이렇게 이해할 수 있다.
Framebuffer는renderbuffer(또는colorbuffer),depthbuffer,stencilbuffer를 포함할 수 있기 때문이다.
Framebuffer와renderbuffer/depthbuffer/stencilbuffer 간의 관계는 다음과 같습니다.http://xiaozu.renren.com/xiaozu/100134/335830019
최종 출력 결과(final output)는 전체 Framebuffer가 제공합니다.
따라서renderbuffer "hold"Framebuffer일 때Framebuffer의 내용은renderbuffer의 내용이다.
e. 마지막으로 EAGLcontext의presentRenderbuffer를 호출합니다.
context presentRenderbuffer:GL_RENDERBUFFER
최종 렌더링 결과를 제출합니다.5. 설명이 필요한 것은 OpenGLES의
glGenBuffers
glBindBuffer
glBufferData
자원 데이터 버퍼링을 대상으로 합니다.이런 버퍼에 저장된 것은 렌더링 내용으로 하는 외부 자원 데이터, 예를 들어 정점, 법선 등이다.
참고 자료:
http://db-in.com/blog/2011/01/all-about-opengl-es-2-x-part-13/#Buffers
http://db-in.com/blog/2011/02/all-about-opengl-es-2-x-part-23/
http://db-in.com/blog/2011/05/all-about-opengl-es-2-x-part-33/
http://db-in.com/blog/2011/02/khronos-egl-and-apple-eagl/
https://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW1
http://developer.apple.com/library/ios/#documentation/OpenGLES/Reference/EAGLContext_ClassRef/Reference/EAGLContext.html
http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW5
http://xiaozu.renren.com/xiaozu/100134/335830019
http://www.helmsmansoft.com/index.php/archives/1436
http://miaoshuanghe.blog.163.com/blog/static/140130476201052453756439/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.