Interesting/iPhone | Posted by hyena0 2010. 1. 20. 01:18

[iPhone] OpenGL 프로그래밍 ...3


  [iPhone] OpenGL 프로그래밍 ...3

이전 포스트에서 drawView 메소드 부분을 다루어 보았습니다.

이 drawView에서 3차원 도형을 그리는 방법을 크게 3가지로

분류해서 다루어 보겠습니다.

1. glVertexPointer, glDrawArrays 이용

2. glVertexPointer, glNormalPointer, glDrawArrays 이용

3. glVertexPointer, glNormalPointer, glTexCoordPointer, glDrawArrays 이용

우선 첫번째 부분을 보면 아래와 같은 예를 볼 수 있겠습니다.

- (void)drawView {

// Our new object definition code goes here

    const GLfloat cubeVertices[] = {

        // Define the front face

        -1.0, 1.0, 1.0,             // top left

        -1.0, -1.0, 1.0,            // bottom left

        1.0, -1.0, 1.0,             // bottom right

        1.0, 1.0, 1.0,              // top right

      

        // Top face

        -1.0, 1.0, -1.0,            // top left (at rear)

        -1.0, 1.0, 1.0,             // bottom left (at front)

        1.0, 1.0, 1.0,              // bottom right (at front)

        1.0, 1.0, -1.0,             // top right (at rear)     

        // Rear face

        1.0, 1.0, -1.0,             // top right (when viewed from front)

        1.0, -1.0, -1.0,            // bottom right

        -1.0, -1.0, -1.0,           // bottom left

        -1.0, 1.0, -1.0,            // top left


        // bottom face

        -1.0, -1.0, 1.0,

        -1.0, -1.0, -1.0,

        1.0, -1.0, -1.0,

        1.0, -1.0, 1.0,

  

        // left face

        -1.0, 1.0, -1.0,

        -1.0, 1.0, 1.0,

        -1.0, -1.0, 1.0,

        -1.0, -1.0, -1.0,

  

        // right face

        1.0, 1.0, 1.0,

        1.0, 1.0, -1.0,

        1.0, -1.0, -1.0,

        1.0, -1.0, 1.0

    };

    [EAGLContext setCurrentContext:context];    

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glViewport(0, 0, backingWidth, backingHeight);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

// Our new drawing code goes here

rota += 0.5; // 회전각도

glLoadIdentity();

    glTranslatef(0.0, 0.0, -6.0);

glRotatef(rota, 1.0, 1.0, 1.0);

glVertexPointer(3, GL_FLOAT, 0, cubeVertices);

    glEnableClientState(GL_VERTEX_ARRAY);

// Draw the front face in Red

glColor4f(1.0, 0.0, 0.0, 1.0);

    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

 

// Draw the top face in green

glColor4f(0.0, 1.0, 0.0, 1.0);

glDrawArrays(GL_TRIANGLE_FAN, 4, 4);

// Draw the rear face in Blue

glColor4f(0.0, 0.0, 1.0, 1.0);

glDrawArrays(GL_TRIANGLE_FAN, 8, 4);

// Draw the bottom face

glColor4f(1.0, 1.0, 0.0, 1.0);

glDrawArrays(GL_TRIANGLE_FAN, 12, 4);


// Draw the left face

glColor4f(0.0, 1.0, 1.0, 1.0);

glDrawArrays(GL_TRIANGLE_FAN, 16, 4);

// Draw the right face

glColor4f(1.0, 0.0, 1.0, 1.0);

glDrawArrays(GL_TRIANGLE_FAN, 20, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    [context presentRenderbuffer:GL_RENDERBUFFER_OES];

[self checkGLError:NO];

}


정육면체가 회전하게 되는 예제로 glVertexPointer 함수에서 

배열 cubeVertices 의 값을 이용하여 정육면체를 그리게 됩니다.

여기서 배열  cubeVertices 의 값을 보면 각 면의 값을 모두 가지고 있다는 것을 알게 되지요.

그래서 각 면에 해당하는 부분을 glDrawArrays 함수에서 4 행씩 증가시켜가면서

그리게 됩니다.

사실 이런 방식으로 도형을 그리게 되면 정육면체 혹은 정사면체 등의 우리가 아는 도형만

그릴 수 있고 3D 게임을 만들거나 하기 위한 복잡한 도형을 만들기는 사실상 불가능합니다.

그래서 두 번째 및 세 번째 방법을 이용해야한다는 것을 알게 됩니다.

다음 방법은 다음 포스트에서 봅시다.