Interesting/iPhone | Posted by hyena0 2010. 1. 21. 00:40

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


  

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


  drawView 방식의 두번째를 다루어 보겠습니다.

  2. glVertexPointer, glNormalPointer, glDrawArrays 이용

  이 세가지 함수를 이용하는 것인데, 이전 포스트에서 본 것처럼

  도형의 꼭지점 배열에 대해 glVertexPointer 에서 선택을 하고 glDrawArrays 함수로

  그리는 방식을 취했습니다. 

  두 번째 방식은 glNormalPointer 까지 가세한 것이지요.

  normalPointer 값은 도형의 면에 대한 normal vector값을 가지고 추가로 도형을 표현하고자
  
  하는 것입니다. 이 때에는 normal vector 의 배열값이 추가로 필요합니다.

  그런데 "왜 이것이 필요할까?" 라고 생각할 수 있을 겁니다. 그 이유는 사실적으로 보이려고 하면

  나중에 광원을 가지고 그림자를 지게 할 것인데, 이 normal vector 값이 없으면 그 효과를 적용할 수 없기 때문이지요.

  아래 예를 보겠습니다.

- (void)drawView {


    [EAGLContext setCurrentContext:context];    

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glViewport(0, 0, backingWidth, backingHeight);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);


    glLoadIdentity();

    glTranslatef(0.0, 0.0, 0.0);//6.0

   

    glEnableClientState(GL_VERTEX_ARRAY);

    glEnableClientState(GL_NORMAL_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, Vertices);

    glNormalPointer(GL_FLOAT, 0, Normals);

    glDrawArrays(GL_TRIANGLES, 0, 100);//100 -> size of vertices


    glDisableClientState(GL_VERTEX_ARRAY);

    glDisableClientState(GL_NORMAL_ARRAY);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    [context presentRenderbuffer:GL_RENDERBUFFER_OES];

}


예제에서는 Vertices 배열과 Normals 배열을 각각 선택하고 glDrawArrays 를 이용하여 배열의 0에서 크기 만큼(100)

그리도록 되어 있습니다. 

normal pointer 배열을 적용하고 안하고는 조명을 적용하고 안하고를 따져보면 알 수 있습니다. 





  상단의 이미지는 normal pointer 를 적용한 경우이고, 아래의 그림은 미적용이므로 차이를 알 수 있습니다.

  빛에 대해 반응하는 차이가 보이지요.

  여기서 한가지 의문이 들 것으로 보입니다. 오늘의 포스팅에서는 배열의 내용을 설명하지 않고 있지요.

  과연 위의 그림과 같은 도형이 어떻게 나왔는지 궁금하실거 같네요.

  제가 참조한 사이트에서는 Blender 라는 공개소프트웨어를 이용해서 도형을 그린뒤 export하여 

  도형의 정보를 배열에 담아서 보여주고 있습니다. 

  세번째 방법까지 다룬 뒤 Blender로 도형을 그리고 export 하여 원하는 모양을 OpenGL ES 에서 보이는 방법을 

  보여드리도록 하겠습니다.

  

  [Next] OpenGL 프로그래밍..5