2011.03.21 20:39
NeHe Tutorial의 6. Texture Mapping에 해당하는 내용입니다.

 텍스쳐 매핑은 3D 위에 이미지를 입혀 사물을 더 사실감 있게 보이고 프로그램을 더 빠르게 동작할 수 있게 해주는 이점이 있습니다. 
 준비물은 지난포스팅의 코드, 그리고 Texture로 사용할 이미지파일이 필요합니다.
 
 우선 Cube만을 사용할 것이므로 Pyramid를 제거하겠습니다.
 그리고 Cube에서 ColorArray를 Texture Array로 바꾼 다음 2D Texture Mode를 Enable시킵니다.

 OpenGL 이었다면 여기에서 끝이 났을테지만, 앞에서 이야기를 하지 않고 넘어갔던 Cube의 구현의 문제가 있습니다.
 Quad를 그릴때 Triangle과 달리 Quad를 그릴수가 없어 Triangle 두개를 그려서 하나의 Quad를 완성하는 방법을 취했는데, 코드의 중복을 피하기 위해서 vertex를 정의하고 이들을 조합한 indexBuffer를 이용하였습니다.
 하지만 Texture를 하나의 Quad에 나타내기 위해서는 각 면을 다 정의한 Vertex가 필요합니다. 따라서 앞에서 정의한 Vertex를 실제 면의 개수에 맞게 24개(4*6)로 늘려서 정의 하겠습니다. 예제코드(http://insanitydesign.com/wp/projects/nehe-android-ports/?sms_ss=dzone)에서 쓰는 방법이어서 저도 같은 방법을 취하였는데 더 좋은 방법이 있다면 댓글을 달아주세요^^

 사용하는 이미지는 256*256의 Bitmap image인데, OpenGL 표준에서는 가로 및 세로의 Pixel수를 power of 2로 규정하고 있고, 실제 제 Nexus One에서 구동해본 결과 이를 지키지 않으면 흰색박스로 나타버립니다. 가로와 세로의 크기가 같지 않아도  power of 2 이면 괜찮습니다. 
 한편 이미지 Format은 주로 쓰는 jpg, png, bmp 모두 가능한 것으로 확인했습니다.



 스샷을 찍고 보니 Cube가 찌그러져 보이는군요. 실제 폰으로 보면 괜찮습니다.

 고치고 보니 원래의 소스코드와 다른점이 거의 없어져서 저작권의 문제도 있고 하니 직접 올리지는 않겠습니다.
 소스코드가 필요하신분은 원래 소스인 http://insanitydesign.com/wp/projects/nehe-android-ports/?sms_ss=dzone 에서 받으세요.


  
신고
Posted by JAVA_HOME

댓글을 달아 주세요

2011.03.20 14:20
NeHe Tutorial의 4장과 5장에 해당하는 내용입니다.

지난 포스팅에서는 Vertex 3개로 삼각형을 그리고 색을 입히는 내용을 다루었습니다.
오늘은 지난번의 평면에서 Rotate를 하여 입체감을 느껴보고 실제 3D Object를 만들어보겠습니다. 

Rotate를 하는 것은 쉽습니다. 그리기 전에 glRotatef 함수로 Angle과 벡터를 지정하여 회전을 시켜주면 됩니다.(State 기반)
우선 Y축을 기준으로 Rotate 시켜보겠습니다.




중심이 되는 방향벡터를 Y만 설정하여 Refresh 되는 동안 각도를 증가 시켜서 오른쪽으로 회전하게 만들었습니다.
 
이제 기초적인 것들을 배웠으니 실제 3D Object를 만들어봅시다. 
 
특별한 것은 없습니다 Triangle 4개를 그려서 Pyramid, Quad 6개를 그려서 Cube를 만들어 봅시다.


지금까지 만든 코드는 ViewPort 와 같은 초기화 작업을 신경쓰지 않아서 3D 모델이 되니까 도형이 보기가 안좋아져서 아래의 코드를 사용하였습니다. 
저작권 문제도 있고 하니 코드는 생략 하겠습니다.
(Source 코드 : http://insanitydesign.com/wp/projects/nehe-android-ports/?sms_ss=dzone )


다음 포스팅에는 표면에 이미지를 입히는 Texture Mapping을 공부해보겠습니다.



 
신고
Posted by JAVA_HOME

댓글을 달아 주세요

2011.03.19 17:43

이번 포스팅은 NeHe Tutorial의 2장과 3장의 내용에 해당하는 것입니다.

지난 포스팅에 이어 실제 Polygon을 출력해보고 색을 넣어보겠습니다.
 
시작하기전에 OpenGL은 State 기반(Attribute를 먼저 설정해주고 명령을 내림) 이라는 것을 알고 있으면 이해하기 쉬울 것이다.


기존의 Vertex를 정의하던 방법 대신 Float Array를 Buffer로 만들어서 전달합니다. Buffer로 put하는 방법은 일단 다음으로 넘기겠습니다.

일단 실행해보겠습니다.


빨간색 삼각형 하나가 생겼군요. 이제 점마다 색을 다르게 입혀보겠습니다. 마찬가지로 Color 값을 ColorBuffer에 넣어 전달하는 방법으로 합니다.


다시 실행해봅시다 




 아까와 같은 단순한 색이 아니라 꼭지점의 색이 다르고 그에 따라서 그라데이션 효과가 들어간 삼각형을 그려봤습니다.


 오늘 한 것은 z축이 0이어서 그림판에 그린것과 다를것이 없는 단순한 2D 도형에 불과했습니다. 하지만 실제로 모델링 자체는 3D이며 이를 활용한 다양한 방법을 적용할수 있는데요, 다음 포스팅에는 이를 확인하기 위하여 3D Rotation 기법을 보여드리도록 하겠습니다.
신고
Posted by JAVA_HOME

댓글을 달아 주세요

2011.03.15 11:19

 Android에서 OpenGL는 이미 ES버젼이 SDK에 포함된 내부 API이고 이를 보여줄 View도 GLSurfaceView라는 클래스로 제공을 하고 있으므로 C에서와 같이 Initialize를 하는데 드는 노력을 줄일 수 있다.

 OpenGL을 Android에서 사용할 때 우리가 해야할 일은 두가지이다.
 View를 상속 받은 SurfaceView, SurfaceView를 상속받은 GLSurfaceView에 Render를 할 클래스를 설정해주고 이를 보여줄 Activity의 View로 설정하는 것이다. 




OpenGL_MainActivity GLRenderer





 실제 Android(필자가 가진 Nexus One/Froyo)에서 구동한 결과이다.

 초기화 이후에는 실제 그림을 그리는 Renderer에만 집중할 것이므로 다음 포스팅부터는 GLRenderer에 대해서만 다루겠다.
  
신고
Posted by JAVA_HOME

댓글을 달아 주세요

2011.03.15 10:42

 OpenGL에 대해서 한번 공부해 보려고 했는데 튜토리얼이나 툴들이 C 라이브러리가 주류여서 자바를 쓰는 저에게는 거부감이 있었습니다. 개발자가 언어에 거부감을 가지면 안되는데 말이죠. 많이 공부해야 겠습니다.
 
   Android에서는 OpenGL ES가 기본 API에 있으므로 외부 라이브러리를 쓰지 않아서 강력하다고 생각이 되고, 개인적으로도 Android에 OpenGL을 써보고 싶어서 포스팅을 하게 되었습니다.

 Source는 NeHe의 Tutorial을 OpenGL ES로 포팅하면서 사용하겠습니다.
<원문>
 http://nehe.gamedev.net

<포팅버젼>
http://insanitydesign.com/wp/projects/nehe-android-ports/?sms_ss=dzone

 
신고
Posted by JAVA_HOME

댓글을 달아 주세요


티스토리 툴바