iOS 개발 - OpenGL ES 시작 자습서 4
OpenGL ES 입문 강좌 1-Tutorial01-GLKit OpenGL ES 입문 강좌 2-Tutorial02-shader 입문 OpenGL ES 입문 강좌 3-Tutorial03-3차원 변환 이번에는 GLKit로 도형 변환, 무늬 스티커, 착색, 깊이 테스트(코드가 여기 있다)를 더욱 간단하게 실현하겠습니다.
OpenGL ES 시리즈 자습서는 여기에 있습니다.OpenGL ES 시리즈 강좌의 코드 주소 - 당신의 스타와 포크는 나의 원동력입니다. 당신의 의견은 나를 더욱 멀리 가게 합니다.
효과 전시
핵심 사고방식
GLKit를 사용하여 도형 변환, 무늬 스티커 불러오기, 깊이 테스트를 하고 GLKBaseEffect로 무늬 스티커를 관리하고 착색을 한다.
세부 사항
1. 교점 속성
typedef NS_ENUM(GLint, GLKVertexAttrib)
{
GLKVertexAttribPosition,
GLKVertexAttribNormal,
GLKVertexAttribColor,
GLKVertexAttribTexCoord0,
GLKVertexAttribTexCoord1
} NS_ENUM_AVAILABLE(10_8, 5_0);
GLKEffects에서 사용하는 정점 속성은 이미 정의되어 있으며, 사용할 때 직접 매거량으로 값을 부여합니다.다음 그림은 정점의 위치, 색깔, 무늬 좌표에 직접 값을 부여한다.
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8, (GLfloat *)NULL);
//
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, 4 * 8, (GLfloat *)NULL + 3);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4 * 8, (GLfloat *)NULL + 6);
2. 텍스처
사용자 정의 shader에서 무늬를 사용하려면 CoreGraphics로 그림을 비트맵 데이터로 변환하고 무늬 메모리를 신청하여 이미지 데이터를 전송하고 마지막에 비트맵 데이터를 방출해야 한다.GLKit에서 다음 세 줄 코드만 있으면 무늬의 불러오기를 완성할 수 있습니다.
//
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"for_test" ofType:@"png"];
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:@(1), GLKTextureLoaderOriginBottomLeft, nil];
GLKTextureInfo* textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];
GLKTextureLoaderOriginBottomLeft
파라미터는 무늬의 상하가 뒤바뀌는 것을 피하는데 무늬 좌표계와 세계 좌표계의 원점이 다르기 때문이다.마지막으로 착색기를 만들고, 무늬를 사용하며, 방금 만든textureInfo의name을 착색기에 부여합니다.
//
self.mEffect = [[GLKBaseEffect alloc] init];
self.mEffect.texture2d0.enabled = GL_TRUE;
self.mEffect.texture2d0.name = textureInfo.name;
3. 도형 변환
OpenGL ES에서 도형 변환의 표현 형식은 바로 매트릭스 조작이고 GLKit도 많은 매트릭스 조작 함수를 제공했다.
//
CGSize size = self.view.bounds.size;
float aspect = fabs(size.width / size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(90.0), aspect, 0.1f, 10.f);
projectionMatrix = GLKMatrix4Scale(projectionMatrix, 1.0f, 1.0f, 1.0f);
self.mEffect.transform.projectionMatrix = projectionMatrix;
GLKMatrix4 modelViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0f, 0.0f, -2.0f);
self.mEffect.transform.modelviewMatrix = modelViewMatrix;
GLKMatrix4MakePerspective
는 투시 투영 변환GLKMatrix4Translate
은 평이 변환입니다./**
*
*/
- (void)update {
GLKMatrix4 modelViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0f, 0.0f, -2.0f);
modelViewMatrix = GLKMatrix4RotateX(modelViewMatrix, self.mDegreeX);
modelViewMatrix = GLKMatrix4RotateY(modelViewMatrix, self.mDegreeY);
modelViewMatrix = GLKMatrix4RotateZ(modelViewMatrix, self.mDegreeZ);
self.mEffect.transform.modelviewMatrix = modelViewMatrix;
}
장면 변환 함수에서
GLKMatrix4RotateY
는 Y축을 감고 다른 점은 각각 X, Z축을 감는다.4. 깊이 테스트
앞에서 설명한 바와 같이 깊이 테스트를 열려면 깊이 테스트의 버퍼를 분배하고 해당하는 프레임 버퍼에 마운트해야 한다.GLKit 코드에서 깊이 테스트의 시작은 매우 간단하다.새 위아래 문장을 만들 때
glEnable(GL_DEPTH_TEST);
호출하여 깊이 테스트를 시작합니다. // OpenGL ES
self.mContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
GLKView* view = (GLKView *)self.view;
view.context = self.mContext;
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[EAGLContext setCurrentContext:self.mContext];
glEnable(GL_DEPTH_TEST);
장면을 렌더링할 때
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClear 매개 변수GL_DEPTH_BUFFER_BIT
를 추가하면 됩니다./**
*
*/
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self.mEffect prepareToDraw];
glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT, 0);
}
총결산
OpenGL ES 의 도입 단계는 거의 다릅니다. 아직 많은 지식이 남아 있기 때문에 필요할 때 다시 배우면 됩니다.이 몇 편의 강좌를 총결하는 데 일주일 정도 걸렸다.학습 과정 중 몇 가지 부분이 가장 괴롭다.
마지막으로 컴퓨터 도형학과 선형 대수는 기초이기 때문에 스스로 시간을 많이 들여 공부하고 핵심 경쟁력을 키우는 것이 좋다고 느꼈다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.