본문 바로가기

나의 플랫폼/안드로이드

[Android Opengl es 2.0 ] 여러 Object를 한 번에 그리기.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
 코딩을 하는 도중... 만약에 1000개 이상의 Object들을 한꺼번에 그릴 려고 할 때,

For문으로 1000개를 돌려야 할까요???? 개발 요구사항에 따라 다르겠지만,

만약 전체적인 회전이나  컬러 알파 정도는 수정할 수 있는 방법이 있었습니다. 

바로!!! 1000개의 Object의 Vertex를 지정하고,
한번에 그리는 것입니다.!!! ( 제가 초보라서.. 이제 알게됨..^^;)

Vertex와 Index 배열을 잘 이용하면 쉽게 그릴 수 있습니다.

먼저 테스트 해본 배열은 

 private final float[] mVerticesData = {

    

            // X, Y, Z, U, V,alpha,colorR,colorG,colorB,colorA

    

      0.0f, 0.5f, 0, 1.0f, 0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,    // 0

     -0.5f, 0.5f, 0, 0.0f, 0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,    // 1

     -0.0f, 1.0f, 0, 1.0f, 1.0f,1.0f,0.0f,0.0f,1.0f,1.0f,    // 2

     -0.5f, 1.0f, 0, 0.0f, 1.0f,1.0f,0.0f,0.0f,1.0f,1.0f,    // 3

    

      0.0f, 0.0f, 0, 1.0f, 0.0f,0.0f,1.0f,1.0f,1.0f,1.0f,    // 4

     -0.5f, 0.0f, 0, 0.0f, 0.0f,0.0f,1.0f,1.0f,1.0f,1.0f,    // 5

     -0.0f, 0.5f, 0, 1.0f, 1.0f,0.0f,1.0f,1.0f,1.0f,1.0f,    // 6

     -0.5f, 0.5f, 0, 0.0f, 1.0f,0.0f,1.0f,1.0f,1.0f,1.0f,    // 7

    

      0.0f,-0.5f, 0, 1.0f, 0.0f,1.0f,1.0f,1.0f,1.0f,1.0f,    // 8

     -0.5f,-0.5f, 0, 0.0f, 0.0f,1.0f,1.0f,1.0f,1.0f,1.0f,    // 9

     -0.0f, 0.0f, 0, 1.0f, 1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,    // 10

     -0.5f, 0.0f, 0, 0.0f, 1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,    // 11

     };

    

    private short[] indices = { 

     0, 1, 2, 2, 1, 3,                                           // 첫번째 4각형
     4, 5, 6, 6, 5, 7,                                           // 두번째 4각형

     8, 9, 10, 10, 9, 11,                                      //  세번째 4각형

     };  


 주석에 적어 놓은 것과 같이, vertex 포인터 위치, 알파값 , 색깔 값으로 지정이 되어 있습니다.

[Shader 코드] : VertexShader에는 위치 값을 FrameShader에는 알파와 색깔 값을 설정

 private final String mVertexShader =

        "uniform mat4 uMVPMatrix;\n" +

        "attribute vec4 aPosition;\n" +

        "attribute vec2 aTextureCoord;\n" +

        "varying vec2 vTextureCoord;\n" +

        "attribute float aAlpha;\n" +

        "varying float vAlpha; \n" +

        "attribute vec4 aColor;\n" +

        "varying vec4 vColor; \n" +

        

        "void main() {\n" +

        "  gl_Position = uMVPMatrix * aPosition;\n" +

        "  vTextureCoord = aTextureCoord;\n" +

        "  vAlpha = aAlpha;\n" +

        "  vColor = aColor;\n" +

        "}\n";


    private final String mFragmentShader =

        "precision mediump float;\n" +

        "varying vec2 vTextureCoord;\n" +

        "varying float vAlpha; \n" +

        "varying vec4 vColor; \n" +

        "uniform sampler2D sTexture;\n" +

        "void main() {\n" +

        "  gl_FragColor = texture2D(sTexture, vTextureCoord)*vColor*vAlpha;\n" +

        "}\n";



[ Attribute 적용 코드 ] : 버퍼로 초기화를 해준 후, 각각 Attribute에 할당

mTriangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length

                * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();

        mTriangleVertices.put(mTriangleVerticesData).position(0);

        

        

        mTriangleIndics = ByteBuffer.allocateDirect(indices.length

                * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asShortBuffer();

        mTriangleIndics.put(indices).position(0);

        

        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);

        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,

                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);

        checkGlError("glVertexAttribPointer maPosition");

        GLES20.glEnableVertexAttribArray(maPositionHandle);

        checkGlError("glEnableVertexAttribArray maPositionHandle");

        

        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);

        GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false,

                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);

        checkGlError("glVertexAttribPointer maTextureHandle");

        GLES20.glEnableVertexAttribArray(maTextureHandle);

        checkGlError("glEnableVertexAttribArray maTextureHandle");

        

        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_COLOR_OFFSET);

        GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false,

                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);

        checkGlError("glVertexAttribPointer maColorHandle");

        GLES20.glEnableVertexAttribArray(maColorHandle);

        checkGlError("glEnableVertexAttribArray maColorHandle");

        

        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_ALPHA_OFFSET);

        GLES20.glVertexAttribPointer(maAlphaHandle, 1, GLES20.GL_FLOAT, false,

                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);

        checkGlError("glVertexAttribPointer maAlphaHandle");

        GLES20.glEnableVertexAttribArray(maAlphaHandle);

        checkGlError("glEnableVertexAttribArray maAlphaHandle");



[ Draw 부분] : 3개의 Object에 한 개당 6개의 index 포인트가 있으므로 18을 설정

        GLES20.glDrawElements ( GLES20.GL_TRIANGLES, 18, GLES20.GL_UNSIGNED_SHORT, mTriangleIndics );

 

결과 화면 


 
이 소스는 Apidemo에 있는 opengl2.0 샘플을 변경 한 것입니다.

render 소스만 첨부 할터이니~ 참고하세요^^