본문 바로가기

나의 플랫폼/안드로이드

[ Android Opengl es 2.0 ] 기본적인 흐름도.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Opengl es 2.0 에 대해 ,
우선 제가 공부를 하면서 어느 정도 이해한 부분을 적어보고자 합니다.
정석의 내용이 아니라 제가 생각되는 점으로 적었다는 것을 먼저 알리고 싶습니다.
틀린 점이 있으면 주제 말고 적어주셨으면 합니다.

먼저, Opengl es 2.0을 사용하기 위해서는 가장 크게 3가지로 구분이 되는 것 같더군요.

Program : Opengl es 2.0 에서 가장 큰 단위 입니다. 밑에 나오는 VertexShader와 FrameShader가 합쳐져서 위 Program이 되는 거죠.

VertexShader : 물체의 모양이나 크기, 위치등 Vertex 배열을 이용해서 작성해주는 Shader입니다.

FrameShader :  물체의 색깔, 질감등에 대해 설정을 해주는 Shader입니다.

 
위 세가지가 주축이 되어서 그립니다.
즉, VertexShader, FrameShader을 만들고, Program에 적용을 시키는 형태입니다.
 

        // VertexShader 생성

        vertexShader = LoadShader(GLES20.GL_VERTEX_SHADER, vShaderStr);
        // FrameShader 생성 

        fragmentShader = LoadShader(GLES20.GL_FRAGMENT_SHADER, fShaderStr);


        // Program을 생성
      // Program이 생성되고, 그 생성된 주소 값을 넘겨 받는 다고 생각하시면 됩니다. 

        programObject = GLES20.glCreateProgram();


        // Program이 잘못 만들어 졌으니 나가라!

        if (programObject == 0)

            return;


        // VertexShader를 Program에 적용 ( Program 주소 값에 VertexShader 적용 )

        GLES20.glAttachShader(programObject, vertexShader);
        // FrameShader를 Program에 적용 ( Program 주소 값에 FrameShader적용 )

        GLES20.glAttachShader(programObject, fragmentShader);


        // Opengl에 생성한 Program을 연결 시킨다.

        GLES20.glLinkProgram(programObject);


        // linked는 new int[1] 형태임. 위 배열에 상태값을 넣어준다.

        GLES20.glGetProgramiv(programObject, GLES20.GL_LINK_STATUS, linked, 0);

        // linked가 제대로 되어 있지 않았으므로 로그 값과 에러 상태를 출력해줍니다.

         if (linked[0] == 0)

        {

            Log.e(TAG, "Error linking program:");

            Log.e(TAG, GLES20.glGetProgramInfoLog(programObject));

            GLES20.glDeleteProgram(programObject);

            return;

        } 


위 소스는  [ OpenGL ES 2.0 Programming Guide ] 란 도서의 샘플 소스를 이용한 것입니다.
 이와 같이 이해하게 되면 우선 가장 큰 틀은 이해가 된거라고 생각합니다.

그 다음 필요한 부분이  위 LoadShader를 만드는 함수 안쪽부분인데요.

 // type : 만들 Shader의 종류를 지정 -> VertexShader나 FrameShader 둘중에 하나가 가겠죠^^

// shaderSrc : Shader를 만들 때, 사용될 Native 코드를 넘긴다. (저두 이 부분은 이해 중에 있습니다....) 

// shader : 만들어진 Shader의 주소값을 넘긴다. 
private int LoadShader(int type, String shaderSrc)

    {

        int shader;

        int[] compiled = new int[1];


        // type에 맞게 Shader 생성

        shader = GLES20.glCreateShader(type);


         // 생성에 대한 예외 처리

        if (shader == 0)

            return 0;


      // Shader 생성 시 , 적용 시킬 소스 설정

        GLES20.glShaderSource(shader, shaderSrc);


       // shaderSrc를 컴파일
       // C프로그램 컴파일 하는 것과 같다고 생각하시면 됩니다.
       // 컴파일 시 에러가 뜨면 만들어 지지 않겠죠?? (문법 오류 등등 ㅋ)

        GLES20.glCompileShader(shader);


        //  컴파일 상태 확인

        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);


        //  컴파일이 제대로 안되면 예외 처리

        if (compiled[0] == 0)

        {

            Log.e(TAG, GLES20.glGetShaderInfoLog(shader));

            GLES20.glDeleteShader(shader);

            return 0;

        }

 

        return shader;

    }



이렇게 하면 Shader가 완성이 되는 것이고~ Opengl을 사용할 수 있게 되는 것이죠. 
Native Code는 형태가 다음과 같이 되어 있습니다.

 String vShaderStr = 

                  "attribute vec4 vPosition;    \n"

                + "void main()                  \n"

                + "{                            \n"

                + "   gl_Position = vPosition;  \n"

                + "}                            \n";


        String fShaderStr = 

                  "precision mediump float;  \n"

                + "void main()                                  \n"

                + "{                                            \n"

                + "  gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n"

                + "}  


C 코드라고 보시면 됩니다. ㅎㅎ

vPosition은 위에서 보셨죠? ㅋㅋ 위치를 설정해주는 변수라고 보시면 되구요.
위치를 0으로 해놓은 걸 보니 한 가운데가 되겠군요.
기본적으로 Drawing했을 때 색깔을 빨간색으로 지정했네요.

이렇게 기본적인 틀에 대해서 알아보았습니다.
이것만 보고는 이해하기고 힘들고!
무엇보다 샘플을 보고 싶으실 분들이 많을 듯 한데요.


[ OpenGL ES 2.0 Programming Guide ] 책에서 샘플이 오픈인지 아닌지 몰라서;;;
올려드릴 수 없다는 게 아쉽네요.

그럼 먼가 궁금하시거나 물어보실점 있으면 댓글 달아주세요.

아는 부분이 있으면 알려드리도록 하겠습니다.

저 또한 열심히 공부하는 중이니 서로 정보 공유를 했으면 더 좋겠네요..^^;;