본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] OpenGL 로 삼각형 그리기

by 돼지왕 왕돼지 2012. 2. 15.
반응형


안녕하세요 돼지왕 왕돼지입니다.
오늘은 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들을 명시
 
로그인 없이 추천 가능합니다. 손가락 꾸욱~

반응형

댓글