2011.06.07 17:53
SpriteBatch안에 BitmapFont를 그리고 그 다음에 무언가를 그리면 안그려진다. 이유를 모르겠다... SpriteBatch를 끝내면 정상적으로 그려지는데.. 무조건 글자는 마지막에 그려야되는건가
신고

'OPENGL > libgdx' 카테고리의 다른 글

BitmapFont 문제  (3) 2011.06.07
libgdx(2) - Basic Graph  (0) 2011.06.02
Posted by JAVA_HOME

댓글을 달아 주세요

  1. CreamNuts 2011.06.17 15:19 신고  댓글주소  수정/삭제  댓글쓰기

    글자는 당연 마지막에 그려야 제일 상단에 그려집니다..

  2. JAVA_HOME 2011.06.18 22:32 신고  댓글주소  수정/삭제  댓글쓰기

    CreamNuts //상단이 문제가 아니라 그냥 그 다음에 그리는 작업이 다 뻗어버렸습니다 .
    해결 : 윈도우 작업에서 우분투로 작업환경를 바꿨는데 그냥 됩니다 -_-;; 코드도 그대로고 왜 그런지는 미스터리 -_-;;

  3. 시켄슈 2011.12.16 00:27 신고  댓글주소  수정/삭제  댓글쓰기

    BitmapFont한글을 출력을 못하는데 혹시 해결방법을 아시나요?

2011.06.02 20:30
 안드로이드에서 HelloWorld를 찍을때는 각각을 독립된 프로젝트로 두었습니다. 하지만 기본으로 제공하는 예제를 보면 안드로이드에서는 소스는 전혀 없으며 데스크탑 소스에서 존재하는 소스를 불러오는 것을 볼 수 있습니다.

 홈페이지에 자세히 설명되어 있어서 따로 설명하는 것은 시간낭비라는 생각이 들었습니다. -_-
 방법은 http://code.google.com/p/libgdx/wiki/ProjectSetup 에 있습니다.( 그리고 desktop의 data를 안드로이드의 assets 폴더와 동기화 시키는 방법도 여기에 있습니다.


그리고 비디오 튜토리얼에서 메니페스트에서 android:targetSdkVersion="9" 로 지정하라고 합니다. 풀스크린모드 뭐라고 하는데 잘 못알아듣겠습니다 -_-; 기억하라고 하니까 하기는 하는데 튜토리얼 소스들에도 제대로 명시 안되어있습니다.(동영상 튜토리얼에서 뭐라고하는지 알아들으신분은 댓글로 써주세요 -.-)

* 자꾸 타겟지정이 자꾸 에러가 나서 뭐가 문제인가 보니 옛날의 SDK에서는 이 attribute를 지원하지 않는 것 같습니다. 그냥 8로 올려버리니까 되네요.(minSdkVersion이 아니라 프로퍼티에서 올린겁니다)  버젼 몇부터 지원하게 됬는지는 모르겠습니다.


 이제 시작해보겠습니다.



 작업은 메인 프로젝트에 renderer를 만들고 데스크탑에서 실행해보고(메인 포함해서 3줄정도 일겁니다 -_-) 안드로이드에서 실행해보겠습니다(추가되는 코드는 1줄일겁니다 -..-)

 








OscilloScopeRenderer.java


SinGenerator.java

DesktopMain.java




신고

'OPENGL > libgdx' 카테고리의 다른 글

BitmapFont 문제  (3) 2011.06.07
libgdx(2) - Basic Graph  (0) 2011.06.02
Posted by JAVA_HOME

댓글을 달아 주세요

2011.06.01 17:29
 Oscilloscope 강좌를 OpenGL ES로 하다보니 순수 OpenGL ES API로는 체계적인 공부가 부족한 저로써는 너무 많은 애로사항에 부닺혔습니다.
 
 그러던 중에 libgdx라는 녀석을 찾았습니다.
 성능도 준수하고, 무엇보다도 크로스 플랫폼이여서 데스크탑에서 작성하고 실행해 볼 수도 있고 이걸 간단히 안드로이드로 바로 이식할 수 있는 오픈 엔진이라고 해서 사용해 볼까 합니다.(사실 아파치 2.0 라이센스에 끌렸던 것도 있습니다...--;)

공식 사이트는 
http://libgdx.badlogicgames.com/ 과
http://code.google.com/p/libgdx/ 입니다. 

우선 기본 라이브러리인 libgdx-0.9.1.zip(2011-06-01 기준 최신 릴리즈판)과 helloworld를 받아서 실행해보겠습니다.

 사실 helloworld 안에 실행가능한 라이브러리가 있어서 helloworld만 받아도 실행하는데 지장은 없습니다.

 우선 Desktop 버젼인 gdx-helloworld를 실행해 봅시다.

 이클립스로 import하게 되면 기본적으로 필요한 라이브러리들이 build path에 들어가 있습니다. 만약에 추가되지 않는다면 프로젝트 루트폴더에 적당한 폴더를 만들고 아래의 파일들을 복사하고 build path로 지정을 합니다.


 그럼 일단 실행해보겠습니다.

 



 다음과 같은 이쁜(?) hello world 로고가 나오는군요.

 이제 Android에서의 

 우선 빈 안드로이드 프로젝트를 하나 만들겠습니다.
 그리고 libs폴더를 만들고(일반 자바와 달리 libs라는 이름으로 하셔야됩니다!) gdx.jar, gdx-backend-android.jar, 그리고 armeabi, armeabi-v7a 폴더를 복사합시다.
 refresh 한번 해주시고 일반 java build path추가 하듯이 gdx-.jar와 gdx-backend-android.jar를 추가해줍시다.

 그리고 위에서 사용한 HelloWorld.java(실제 소스)를 복사해서 넣고, 여기에 들어가는 텍스쳐인 badlogic.jpg를 data폴더 채로 assets 폴더에 넣어줍니다. 

 이제 메인 액티비티를 AndroidApplication을 상속받도록 고치고(Activity의 하위 클래스입니다) initialize(new HelloWorld(), false); 를 추가해줍시다.


이제 실행해 보겠습니다.


 데스크탑에서와 동일한 화면을 볼 수 있습니다. 같은 소스코드로 이식이 가능하다는 것이 매우 편리한 것 같습니다.

 하지만 테스트 해 볼때 데스크탑 프로젝트에 소스를 복사하고 실제 이식을 할 때는 안드로이드에 복사를 하는 등의 귀찮은 작업조차 하지 않아야 진정한 Cross-platform 이라고 말할 수 있겠죠? 물론 이마저도 가능합니다. gdx-welloworld-android를 import해 보시거나 http://code.google.com/p/libgdx/wiki/ProjectSetup에 보시면(셋업을 참고한 곳입니다.) 아시겠지만, 메인프로젝트를 만들고 Desktop과 Android에서 각각 실행해 볼 수 빌드환경을 구축할 수 있습니다. 다음 강좌부터 다시 시작하는 Oscilloscope에서는 방금 말한 빌드 환경을 구축하는 것 부터 하겠습니다.




신고

'OPENGL > Oscilloscope' 카테고리의 다른 글

libgdx(1) - Helloworld  (0) 2011.06.01
OpenGL ES - Oscilloscope - 2. Dynamic Graph  (2) 2011.03.25
OpenGL ES - Oscilloscope - 1. Draw Stopped Graph  (1) 2011.03.23
Posted by JAVA_HOME

댓글을 달아 주세요

2011.03.25 23:38

지난 포스팅에 이어서 이번에는 실제 Oscilloscope에서 보이는 것 처럼 움직이는 Sin 그래프를 만들어 봅시다.

지난번에는 GraphView라는 클래스에 Axis와 Sin함수의 계산, 실제 Graph Line 등의 모든 Graph의 구성요소가 다 들어있었습니다.
하지만 이번에는 MVC 패턴에 맞게(!!) 계산하는 부분은 따로 SinCalculator class로, 현재의 값을 가지고 있는 모델은 GraphModel class로, 축을 그려주는 부분은 Axis class로, 실제 그래프는 GraphLines class로 모두 나누겠습니다.
처음부터 이렇게 나누어서 만들었어야 되는데 포스팅의 편의상 하나로 만들어 버려서 죄송합니다 (__)

GLRenderer.java

Axis.java

GraphLines.java

GraphModel.java

SinCalculator.java





 움직이는 것을 보니까 이제 조금 그럴듯 해진것 같군요!

 원래는 이번 포스팅에서 Rendering을 하는 주기까지 설정하려고 했었습니다만..
Rerendering 주기를 줄 때 C에서 사용하던 GLUT의 timer callback function과 같은 기능으로 구현하고 싶었으나 이해를 조금 더 하고 구현을 해야되겠다는 생각이 들어서 다루지 않았습니다.

 다음 포스팅은 위에서 말한 Rendering 주기 설정, Effect, String 삽입 등을 하여 마무리를 해보도록 하겠습니다.

PS. JUnit 포스팅을 한 김에 안드로이드 JUnit을 사용해보았는데 실제 작업에서는 어떻게 해야될지 감이 잘 안오네요. 공부가 더 필요할거 같습니다. ㅠㅠ
신고

'OPENGL > Oscilloscope' 카테고리의 다른 글

libgdx(1) - Helloworld  (0) 2011.06.01
OpenGL ES - Oscilloscope - 2. Dynamic Graph  (2) 2011.03.25
OpenGL ES - Oscilloscope - 1. Draw Stopped Graph  (1) 2011.03.23
Posted by JAVA_HOME

댓글을 달아 주세요

  1. JAVA_HOME 2011.03.25 23:44 신고  댓글주소  수정/삭제  댓글쓰기

    참고 할만한 사이트 추가 : http://sgpag.springnote.com/pages/5603723

  2. SHTM 2012.03.22 16:49 신고  댓글주소  수정/삭제  댓글쓰기

    GraphModel.java 소스코드가 잘못들어가있네요~^^ 수정해주세요~!

2011.03.23 22:55

사실 OpenGL ES를 포스팅하게된 계기는 안드로이드에서 오실로스코프와 같은 View가 필요했기 때문이다. 2D 그래픽이므로 기본으로 제공되는 canvas를 쓸까도 생각해보았지만 3D로의 확장 가능성을 열어두고 싶었고, Performance 면에서 OpenGL이 좋지 않을까 하는 막연한 기대(!)때문이었다.

 계획으로는 총 3단계로 나누어서 포스팅을 하고자 한다.
 첫번쨰 포스팅은 기본적인 Initializing과 멈춰있는 그래프 하나 정도를 그리고 두번째에서는 실시간으로 Update되는 그래프, 세번째에서는 글자 삽입, 효과 주기 등의 다듬는 과정을 거칠까한다. 

 필자도 배우면서 하는것이므로 다음 포스팅때 앞에서 구현한 코드를 대폭(!) 고칠수도 있으니 이해해주기 바란다. 

 오늘은 그 첫번째로서 멈춰있는 그래프를 하나 그려볼까한다.
 우선 화면의 중심에 X축과 Y축을 그리고 Sin그래프 하나를 그려보겠다.

 이미 OpenGL ES 튜토리얼에서 initializing을 다루었으므로 실제로 그리는 부분만 코드를 첨부하겠다.
 좌표계의 설정등 Detail한 부분은 3번째에서 할 것이므로  다루지 않겠다.

우선 가로로 길게보는 그래프이므로 가로화면 모드로 고정하기 위해서(landscape) AndroidManifest.xml에서 다음을 추가하자.



그리고 일단 2D 좌표계로 고정을 하겠다.(3D로의 확장은 다음에 고려해보겠다)
(좌표계를 설정해주지 않으면 의도한 바대로 그래프가 나오지 않는다.!!)


다음은 X,Y축과 Sin그래프를 그리는 코드이다.



아래는 실행한 화면이다.




조금 더 다듬은 모습으로 프로토 타입을 만들고 싶었으나 Sin그래프를 그리는 과정에서 그래프가 나타나지 않아서 버그를 잡느라고 시간을 많이써서 이번 포스팅은 여기까지 하겠다.
신고

'OPENGL > Oscilloscope' 카테고리의 다른 글

libgdx(1) - Helloworld  (0) 2011.06.01
OpenGL ES - Oscilloscope - 2. Dynamic Graph  (2) 2011.03.25
OpenGL ES - Oscilloscope - 1. Draw Stopped Graph  (1) 2011.03.23
Posted by JAVA_HOME

댓글을 달아 주세요

  1. 김명훈 2012.11.20 22:22 신고  댓글주소  수정/삭제  댓글쓰기

    OpenGl을 처음 접하게 된 학생입니다.
    2d좌표계 고정은 어디에서 해야 하나요?...

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

댓글을 달아 주세요


티스토리 툴바