반응형
안녕하세요 돼지왕 왕돼지입니다.
오늘은 Android OpenGL 을 이용하여 기본 primitive 인 삼각형을 한번 그려보도록 하겠습니다.
후에는 필수 API 들에 대한 설명들도 있습니다.
Android GLSurface에 대한 기본구조에 대해서는 이 글을 참조하세요.
2012/02/10 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] OpenGL 사용하기 위한 GLSurfaceVIew 생성 기본골격.
기본 API 들에 대해서는 다음을 참조하세요.
2012/02/15 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] OpenGL APIs ( Matrix Stack, Light, Blend )
2012/02/14 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] OpenGL APIs ( Draw, Texture, Rotate )
2012/02/14 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] OpenGL 기초 APIs ( Face & View type )
2012/02/14 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] OpenGL 기초 APIs ( Viewport & Clear )
2012/02/14 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] OpenGL 기초 APIs ( Rotation, LoadIdentity, ColorPointer, Enable )
Array, Index buffer 준비
private ShortBuffer _indexBuffer;
private FloatBuffer _vertexBuffer;
private int _nrOfVertices = 3;
private short[] _indicesArray = {0, 1, 2};
private float[] coords = {
-0.5f, -0.5f, 0f, // (x1, y1, z1)
0.5f, -0.5f, 0f, // (x2, y2, z2)
0f, 0.5f, 0f, // (x3, y3, z3)
};
// memory 할당 ( 3 = a vertex 를 이루는 좌표값 갯수, 4 = float의 byte 수 )
ByteBuffer vbb = ByteBuffer.allocateDirect( _nrOfVertices * 3 * 4 );
vbb.order(ByteOrder.nativeOrder());
_vertexBuffer = vbb.asFloatBuffer();
// memory 할당 ( 2 = short의 byte 수 )
ByteBuffer ibb = ByteBuffer.allocateDirect( _nrOfVertices * 2 );
ibb.order(Byteorder.nativeOrder());
_indexBuffer = ibb.asShortBuffer();
// buffer에 coordinate 넣어주기.
// buffer size와 일치하지 않으면 에러 발생
_vertexBuffer.put(coords);
_vertexBuffer.position(0);
_indexBuffer.put(_indicesArray);
_indexBuffer.position(0);
위와 같이 좌표값을 array 형태로 사용하게 되면 꼭 client state 를 설정해주어야 한다. 어떻게?
내가 지금부터 array 를 사용해서 vertex를 그릴 것이라고.
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
삼각형 그리기.
gl.glColor4f( r, g, b, a );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, _vertexBuffer );
gl.glDrawElements( GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer );
참고 함수들
gl.glEnableClientState(GLenum array);
gl.glDisableClientState(GLenum array);
- client-side의 capacitities를 enable하고 disable 함.
- array에는 어떤 array를 사용할지에 대해 값이 한개만 들어감.
GL_COLOR_ARRAY : color array가 enable 되고 rendering에 사용됨
GL_NORMAL_ARRAY : normal array가 enable되고 rendering에 사용됨
GL_POINT_SIZE_ARRAY_OES : point size array가 render될 때의 size를 control한다. 이 때 glPointSize로 define된 값은 무시된다.
GL_TEXTURE_COORD_ARRAY : texture coordinate array가 enable되고 rendering에 사용됨
GL_VERTEX_ARRAY : vertex array가 enable되고 rendering에 사용됨
gl.glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- rendering 할때 사용할 vertex coordinate array를 설정하는 것.
- size 는 한개의 vertex가 차지하는 좌표 수 ( ex) (x, y, z)의 경우 3, 2D의 경우 2 )
range는 2, 3, 4 중 하나
- type 은 coordinate의 data type
GL10.GL_FLOAT
GL10.GL_BYTE
GL10.GL_SHORT
GL10.GL_FIXED
- stride 는 vertices간의 byte offset 지정 (보통 0)
- pointer는 array 지정
- 여기서 지정해준 정보들은 client-side state에 저장이 된다.
gl.glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
- 호출해주면, vertices, normals, colors, texture coordinates들에 대해 스스로 subroutine call을 하며 primitive를 만든다.
- count는 indices 수.
- mode는 primitives의 종류를 명시
GL10.POINTS
GL10.GL_LINE_STRIP
GL10.GL_LINE_LOOP
GL10.GL_LINES
GL10.GL_TRIANGLE_STRIP
GL10.GL_TRIANGLE_FAN
GL10.GL_TRIANGLES
- type은 index array의 자료형
- indices는 index들을 명시
로그인 없이 추천 가능합니다. 손가락 꾸욱~
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Traceview 에 대해 알아보자. ( Profilinig ) (0) | 2012.02.15 |
---|---|
[Android/안드로이드] Emulator의 /system/app 폴더에 apk 올리기. (0) | 2012.02.15 |
[Android/안드로이드] OpenGL Primitives (0) | 2012.02.15 |
[Android/안드로이드] OpenGL APIs ( Matrix Stack, Light, Blend ) (0) | 2012.02.15 |
[Android/안드로이드] OpenGL APIs ( Draw, Texture, Rotate ) (0) | 2012.02.14 |
댓글