마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

OpenGL ES 2.0을 이용하여 FrameBuffer로 부터 Rendering 된 이미지 구하기

0 추천

OpenGL ES 2.0을 이용하여 이미지 편집 툴을 구현하고 있습니다. fragment shader를 통해 이미지의 밝기, 대조, 채도 등을 수정할 수 있도록 하였고, 수정된 내용은 실시간으로 반영되어 화면에 표시되도록 하였습니다. 이제 저장 버튼을 누르면 수정된 이미지가 저장되게끔만 구현하면 되는 상황인데요. 아래의 코드를 사용하여 이미지를 저장하면 수정되기 전 원본 이미지만 저장이 됩니다.

    public static Bitmap saveTexture(int texture, int width, int height) {
        int[] frame = new int[1];
        GLES20.glGenFramebuffers(1, frame, 0);
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frame[0]);
        GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, texture, 0);

        ByteBuffer buffer = ByteBuffer.allocate(width * height * 4);
        GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.copyPixelsFromBuffer(buffer);

        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
        GLES20.glDeleteFramebuffers(1, frame, 0);

        return bitmap;
    }

밝기, 대조, 채도 등이 수정되는 이미지를 실시간으로 화면에 출력하기 위해 다음과 같은 과정을 거치게 됩니다.

1. 텍스쳐 생성 및 바인딩

2. texImage2D를 통해 이미지 bitmap 바인딩

3. vertex, fragment shader를 컴파일하여 프로그램 생성.

4. 3번에서 생성된 프로그램을 사용하여 실시간으로 화면에 드로잉.

그리고 저장 버튼을 눌렀을 때 위에 기재한 saveTexture 메서드의 texture 인수로 1번에서 생성된 texture를 넘겼는데, 저장된 내용이 원본 이미지인 것을 보니 4번을 통해 화면에 드로잉되는 내용은 바인딩된 texture에 반영이 안되는 것 같습니다. 이경우 어떻게 하면 수정된 이미지를 저장할 수 있을까요?

OpenGL ES 초보에게 도움 좀 부탁드려요.

THK (2,360 포인트) 님이 2017년 1월 10일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...