iOS 개발 - OpenGL ES 시작 자습서 4

5165 단어
자습서
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 의 도입 단계는 거의 다릅니다. 아직 많은 지식이 남아 있기 때문에 필요할 때 다시 배우면 됩니다.이 몇 편의 강좌를 총결하는 데 일주일 정도 걸렸다.학습 과정 중 몇 가지 부분이 가장 괴롭다.
  • 첫 번째 부분은 OpenGL ES의 정점 속성, 무늬 스티커인데 정점에서 도형까지의 과정에 대해 이해하지 못하고 OpenGL ES의 데이터 캐시 메커니즘에 대해 잘 모르기 때문에 무지함은 사람들로 하여금 어려움을 알고 물러나게 한다.
  • 두 번째 부분은 shader와glsl이다.glsl은 디버깅을 할 수 없고 정보를 컴파일할 수 없고 조회를 할 수 없고 문법을 이해하지 못한다. 1.0+1은 모두 틀릴 수 있지만 자신은 영문도 모르고 2분의 주석 코드를 통해 문제를 포지셔닝할 수 밖에 없다. 특히 사람을 맥 빠지게 한다.
  • 세 번째 부분은 OpenGL ES의 3차원 도형 변환과 조명 등인데 이 부분은 수학 지식과 물리 지식이 많고 코드는 일반적으로 매우 간단하다.이 부분은 앞부분보다 어렵지만 어디가 부족한지 알기 때문에 모르겠지만 당황하지 않고 조금 아플 뿐입니다.

  • 마지막으로 컴퓨터 도형학과 선형 대수는 기초이기 때문에 스스로 시간을 많이 들여 공부하고 핵심 경쟁력을 키우는 것이 좋다고 느꼈다.

    좋은 웹페이지 즐겨찾기