[OpenGL ES] Create Window 설명

Learn OpenGL 홈페이지는 GLFW 라이브러리를 사용하여 OpenGL 예제를 실행하였다. 저는 OpenGL ES를 공부하고 있어서 안드로이드 스튜디오에서 코드가 실행되도록 변경하였다. 지금부터 작성하는 코드는 모두 안드로이드 스튜디오(Android Studio 3.0)에서 작성하였다.

가장 먼저 안드로이드 스튜디오를 열어서 새로운 프로젝트를 하나 생성한다. 프로젝터를 생성하면 MainActivity Class가 자동으로 만들어진다. 안드로이드는 Activity라는 개념을 사용하여 화면을 구성한다. 화면을 구성하는 파일은 일반적으로 XML 파일 형식이다. 안드로이드 앱 개발과 관련된 부분은 OpenGL ES를 배우기 위해서 짧게 공부를 한 부분이라 이해 하지 못한 부분이 많다. 다음에 기회가 된다면 Activity와 안드로이드 앱 만드는 방법은 따로 정리해볼 계획이다.

public class MainActivity extends AppCompatActivity {
    public GLSurfaceView mkSurfaceView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mkSurfaceView = new GLSurfaceView(this);
        mkSurfaceView.setEGLContextClientVersion(3); //MK: GLES 버전 설정
        mkSurfaceView.setRenderer(new mkGLRenderer()); //MK: Rednerer을 내가 작성한 클래스로 설정
        setContentView(mkSurfaceView); 
        //setContentView(R.layout.activity_main);
    }
}

우리는 기본 Activity(R.layout.activity_main)을 사용하지 않고 OpenGL Rendering을 위해서 GLSurfaceView 클래스를 사용한다. GLSurfaceView를 사용하기 위해 MainActivity 클래스를 위 코드 처럼 수정한다.

public class mkGLRenderer implements GLSurfaceView.Renderer{
    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
        GLES30.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    }
    @Override
    public void onSurfaceChanged(GL10 gl10, int width, int height) {
        GLES30.glViewport(0, 0, width, height);
    }
    @Override
    public void onDrawFrame(GL10 gl10) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
    }
}

그리고 새로운 파일을 만들어서 위 클래스를 하나 생성한다. 새롭게 만든 파일의 함수는 GLSurfaceView.Renderer을 상속하여 작성한다. GLSurfaceView.Renderer을 사용하기 위해서는 최소 아래의 3개의 함수를 작성해야 한다.

  • onSurfaceCreated: 최초 View를 생성할 때 Call이 되는 함수이다.
  • onSurfaceChanged: 화면이 가로 세로 모드로 변경되면 함수가 호출된다.
  • onDrawFrame: 매 Frame마다 이 함수를 호출한다고 한다. (확실하지는 않지만 매 Frame을 생성할 때마다 함수를 호출하는 것 같다. 보통 안드로이드는 1초에 60 Frame을 만들어서 Display 한다고 알려져 있다.)

onSurfaceCreated함수 안에 작성된 내용은 안드로이드 앱 화면의 백그라운드 색상을 설정하는 코드이다. Red, Green, Blue, Alpha 값을 순서대로 함수에 넣어주면 화면의 백그라운드 색상이 변경된다. 숫자를 변경하면 앱 바탕화면 색상이 변경되는 것을 확인할 수 있다.

onSurfaceChanged 함수에서 사용된 GLES30.glViewport는 해당 화면에 그림이 그려지는 면적을 결정한다. 아래와 같이 설정을 하면 안드로이드 화면이 세로/가로로 변경이 되어도 자동으로 변경이 되는 것을 확인할 수 있다.

onDrawFrame에서 사용된 GLES30.glClear는 onSurfaceCreated에서 설정된 색상으로 색을 표시하는 함수이다.

그림 1: 해당 코드 실행 화면

이렇게 작성한 코드를 실행하면 그림 1과 같은 화면을 확인 할 수 있다. 코드는 아래에 첨부하였다. 현재 이해한 부분만 코드를 작성하였다. 추후 새로운 것을 알게 되면 계속 수정을 하거나 댓글로 남길 계획이다.

참조

  1. https://learnopengl.com/
  2. http://gdthink.blogspot.kr/2006/06/extends%EC%99%80-implements%EC%9D%98-%EC%B0%A8%EC%9D%B4.html
  3. https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glClear.xhtm
  4. https://www.opengl.org/discussion_boards/showthread.php/180241-is-glViewport-needed-or-used-in-OpenGL-ES-2-0

소스 파일 다운로드: mkblogCreateWindow.zip (347 downloads)

Leave a Comment