티스토리 뷰

OpenGL ES 2.0 Practice 1 : Simple Triangle


OpenGL ES 2.0을 이용한 간단한 Triangle 그리는 예제 코드 입니다.  (Android, Java)

GLES20.glUseProgram(mProgram);

        // screen clear color

        GLES20.glClearColor(0.3f, 0.8f, 0.3f, 1.0f);

        // clear screen

        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);


        int aPositionLoc = GLES20.glGetAttribLocation(mProgram, "aPosition");

        GLES20.glVertexAttribPointer(aPositionLoc, 3, GLES20.GL_FLOAT, false, 0, mPosition);


        // triangle color

        GLES20.glUniform3f(GLES20.glGetUniformLocation(mProgram, "uColor"), 1.0f, 0.0f, 0.0f);

// enable attribute location

        GLES20.glEnableVertexAttribArray(aPositionLoc);


        // rendering

        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 3);


// disable attribute location

        GLES20.glDisableVertexAttribArray(aPositionLoc);


        // starting gl command buffer, non-block

        GLES20.glFlush();


GLES20.glUseProgram 에서 사용되는 Program 생성을 위한 코드 입니다.

private String vertexShaderSource =

            "precision mediump float;\n" +

            "attribute vec3 aPosition;\n" +


            "void main() {\n" +

            " gl_Position = vec4(aPosition, 1.0);\n" +

            "}\n";


    private String fragmentShaderSource =

            "precision mediump float;\n" +

            "uniform vec3 uColor;\n" +

            "void main() {\n" +

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

            "}\n";


    protected int createProgram(int type)

    {

        int program = GLES20.glCreateProgram();


        int vertexShader = getShader(GLES20.GL_VERTEX_SHADER, vertexShaderSource);

        int fragmentShader = getShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderSource);


        GLES20.glAttachShader(program, vertexShader);

        GLES20.glAttachShader(program, fragmentShader);

        GLES20.glLinkProgram(program);


        return program;

    }


    private int getShader(int type, String shaderSource)

    {

        int shader = GLES20.glCreateShader(type);

        GLES20.glShaderSource(shader, shaderSource);

        GLES20.glCompileShader(shader);


        int[] compiled = new int[1];

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

        if (compiled[0] == 0)

        {

            Log.e(TAG, "Could not compile shader");

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

            Log.e(TAG, shaderSource);

        }

        else {

            Log.d(TAG, "Shader = " + shader);

        }


        return shader;

    }


그리고 Java 환경이어서 GL 함수에 입력될 float형 array를 FloatBuffer 로 사용해야하는데, 아래 코드 참조요.. 

protected FloatBuffer createFloatBuffer(float []values) {

        FloatBuffer buffer = ByteBuffer.allocateDirect(values.length * Float.SIZE).

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


        buffer.put(values);

        buffer.position(0);


        return buffer;

    }


결과 화면.... (Nexus 7 2nd, Android 6.0)


OpenGLES20SimpleTriangle.zip




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함