-
OpenGL 끄적임 - GLSurfaceView, RenderGraphics/OpenGL ES 2.0 2018. 2. 25. 22:07반응형
1.3 OpenGL 초기화
GLSurfaceView는 OpenGL의 초기화도 담당한다. (Rendering을 bg thread에서 일어나게 한다던지) surface라고 불리는 display area에서 rendering이 일어난다. Activity lifecycle에 맞게 resource를 날릴 수 있게 helper 메소드들을 제공한다.
GLSurfaceView는 스스로의 window를 만든다. 겹쳐있는 OpenGL surface가 표시될 수 있게 View안에 “hole”을 제공한다. 하지만 window와 분리되어있기 때문에 일반적 View처럼 애니메이션이나 트랜스폼을 제공하지 못한다.
TextureView는 분리된 window나 view에 hole을 펀칭할 필요 없이 OpenGL을 rendering할 수 있도록 제공한다. (4.0이상부터) TextureView 자체에는 OpenGL을 초기화하는 것을 제공하지 않고 OpenGL 초기화를 직접 실행해야한다.
1.create a GLSurfaceView
GLSurfaceView에 GL을 이용해서 그리려면 Renderer가 필요하다. setRender()로 해야한다. 새로운 프레임을 그리거나 surface가 생성되거나 변경됐을 때 GLSurfaceView에 의해서 renderer는 다시 불려진다.
아래를 보면 Open GL 1.0을 사용하는 단말은 대단히 적어서 2.0부터 사용해도 된다.
https://developer.android.com/about/dashboards/index.html#OpenGL
SurfaceView에 Activity Lifecycle에 따라 method를 호출하는 것은 대단히 중요하다. 우리 앱에서 다른 앱으로 이동했을 때, 죽지 않도록 OpenGL Context 를 Release하고 background rendering thread에 pause, resume를 해주는 것이다.
2.create a Renderer class
onSurfaceCreated(GL10 glUnused, EGLConfig config) -activity 처음 실행 시 혹은 다른 activity로부터 돌아왔을 때
onSurfaceChanged(GL10 glUnused, int width, int height) -create이후 사이즈가 변경되었을 때 호출된다. activity가 portrait나 landscape로 변경되었을 때
onDrawFrame(GL10 glUnused) -GLSurfaceView가 frame을 그릴 때마다 호출한다. screen을 clear할 때조차도 우리는 무언가 draw하는 동작을 수행한다. 이 메소드를 먼저 호출하고, rendering buffer는 screen에 swap이나 display된다. 만약 아무것도 그리지 않는다면 콜백 함수는 그대로 호출되기 때문에 나쁜 결과가 나올 수도 있으니 주의하자.
renderer 메소드들은 GLSurfaceView에서 별도 thread로 호출된다. GLSurfaceView는 기본적으로 render를 지속적으로 한다. 기본 display refresh rate나 우리가 GLSurfaceView.setRenderMode()로 변경할 수 있다.
GLSurfaceView는 background thread에 rendering한다. 우리는 꼭 OpenGL을 호출할 때 이 rendering thread에만 그리도록 주의해야한다. (Android UI를 main thread에만 그리듯이 말이다.) ex) 우리의 Runnable을 rendering thread로 보내려면 GLSurfaceView.queuEvent()를 호출할 수 있다.
3.create a new Renderer
glClearColor(1.0f, 0.0f, 0.0f, 0.0f) 는 alpha, r, g, b 파라미터로 alpha는 특히 반투명이나 불투명도 조절하는데 사용된다. red 값에 alpha를 0로 하면 red값이 사라지고 1로 하면 red값이 잘 보이게 된다.
이제 onDrawFrame()을 구현하게 되는데, glClear(GL_COLOR_BUFFER_BIT); 은 모든 color 값을 없애고 이전의 glClearColor에 정의된 color값으로 screen을 채운다.
OpenGL ES 2 for Android
반응형'Graphics > OpenGL ES 2.0' 카테고리의 다른 글
OpenGL 끄적임 - FrameBuffer (0) 2019.07.07 OpenGL 끄적임 - Image Crop (0) 2019.05.17 OpenGL 끄적임 - 4. Adding color and Shader (0) 2018.06.17 OpenGL 끄적임 - 5. Screen Aspect Ratio (0) 2018.05.31 OpenGL 끄적임 - 2 Vertices, Shaders (0) 2018.04.08