본문 바로가기

GRAPHICS/OpenGL ES

(8)
[OPENGL ES] OpenGL ES 1.0, Batchinig으로 프레임 속도 압도적으로 개선하기 그동안 안드로이드에서 OpenGL ES 1.0 기반의 그래픽을 최적화하고, 프레임 속도를 개선하기 위해 참 다양한 작업들을 적용해 왔는데, 이번에 가장 월등한 해결책을 찾을 수 있었다. 여기까지 오기 위해 다양한 자료들을 참조하던 중에 통상적으로 쓰이는 그래픽 기술로 크게 Batching과 Culling이 있었다. (참조 : http://egloos.zum.com/littles/v/3440645 ) Batching은 쉽게 말해 픽셀을 모아찍는 것이고 Culling은 필요한 부분만을 드로잉하는 것이다. Culling의 경우에는 개념으로 따졌을때나 실질적으로 활용할때나 사용하던 기술로 어느정도 한계점에 다다른 상황이었고 Batching의 경우에는 아직 사용하지 못한 영역이었다. 주안점은 이것이다. Draw ..
[OPENGL ES] 안드로이드에서 SurfaceView의 배경 투명하게 Draw하기 안드로이드 앱에서 사용하는 OpenGL ES 뷰인 SurfaceView의 배경을 투명하게 하고자 시행착오를 좀 겪었는데 최종적으로 얻은 결과는 결과적으로 뷰의 배경은 투명하게 할 수 있었으나, SurfaceView가 무조건 레이아웃의 최상단을 차지하게 된다는 점이다. 구현방법은 우선 SurfaceView 클래스를 참조하는 부분에서setZOrderOnTop(true); setEGLConfigChooser(8,8,8,8,16,0); getHolder().setFormat(PixelFormat.RGBA_8888); getHolder().setFormat(PixelFormat.TRANSLUCENT);네가지 요소를 추가한다. PixelFormat.TRANSLUCENT의 경우에는 추가해주지 않아도 투명한 배경을 만..
[OPENGL ES] FloatBuffer allocation 관리를 통한 그래픽 최적화 앱 메모리 검사를 하면서 쌓이는 ByteBufferAsFloatBuffer, ByteBufferAsShortBuffer 등 때문에 의아해 했었고, 이것들이 OpenGL draw에 필수적인지, 항상 allocation 해주어야 하는지 서치와 실험을 계속했다. 결과적으로 ByteBuffer를 FloatBuffer에 nativeOrder로 간접적으로 할당해주어야 하는 방법은 일반적인데, 이를 한 픽셀을 draw 할 때마다 해 줄 필요는 없는 것이었고, 최초 draw를 시작하는 onSurfaceCreated 에서 한번 수행해주는 것으로 드로잉에 문제가 없음을 확인할 수 있었다. 다만, memory allocation은 한번으로 족하지만 이를 float 배열로 받아 put(values) 하고 position(0)..
[OPENGL ES] 안드로이드 액티비티 이동간 출력해 준 그래픽 유지하기 뷰에 그래픽을 출력하는 건 문제가 없는데 이를 액티비티 이동간 보전해야 하는 문제가 있었다. 그러니까 한번 다른 액티비티를 다녀오고 나면, 액티비티가 pause 되었다가 resume 되는데, 여기서 view가 보전되지 않고 까맣게 날아가버리는 게 문제였다. 해결법으로 onPause와 onResume을 오버라이드 하여 onPause시 그래픽을 출력하는 뷰에 똑같이 onPause, onResume시에도 마찬가지로 뷰에 onResume을 적용하면 기존 출력해 준 뷰를 유지하는 걸 확인할 수 있었다 :) 참고 : https://stackoverflow.com/questions/9341705/android-how-to-properly-suspend-opengl
[OPENGL] 특정 변수값에 따른 HSV 형식 색 표현을 RGB를 이용해 해보기 우선 웹상에 많은 hsv와 rgb를 바꿔주는 페이지에서 hsv를 조정해줄 때 rgb가 어떻게 변화하는지를 파악했다. 고정값으로 Saturation을 100으로, Brightness를 50으로 조정했고, 여기서 hue값을 0에서 240까지 조정함에 따라 색이 HSV 형식 색 표현에서 파란색에서 빨간색까지 옮겨가게 된다. hue의 범위가 어떻게되느냐에 따라 RGB에서 변화되는 값이 달라지게 되는데, hue가 0에서 60일때는 R : 255 | G : 0 ~ 255 | B : 0 hue가 60에서 120일때는 R : 255 ~ 0 | G : 255 | B : 0 hue가 120에서 180일때는 R : 0 | G : 255 | B : 0 ~ 255 hue가 180에서 240일때는 R : 0 | G : 255 ~..
[OPENGL ES] 모델간 겹치는 상황에서 색이 깨지지 않게 하기 visualization중 모델 여러개를 그려서 색을 겹쳐 Interpolate 효과를 내고 싶었는데 모델들이 겹치니 색이 깨지는 걸 확인했다. 폭풍 서치를 통해 여러 방법들을 적용할 수 있었다. 우선 적용하기 이전에 모델들이 이렇게 깨져보였다면 다음과 같은 glDisable과 Enable을 통해 모델들이 겹치면서도 깨지지 않는 모습을 구현할 수 있다. glBlendFunc같은 경우 모델과 색상들의 blending에서 아주 중요한 역할의 코드인데 파라미터에 어떤 설정을 해주느냐에 따라 섞이는 모습이 천차만별로 변하는 것을 확인할 수 있다. 아래같은 경우에는 위의 코드대로 GL_ONE, GL_ONE으로 설정해 주었을 때에 blending의 결과이다. 다음 아래같은 경우는 GL_SRC_ALPHA, GL_DS..
[OPENGL ES] OPENGL 얇게 이해하기 - 3D 도형의 색 문제 해결하기 OPENGL에서 그래프 렌더링 관련하여 2D로 변경해주어야 하는 일이 있었는데 그래프의 높이를 낮추어 2D에 가까운 형태로 구현해주었을 때 조명문제 때문에 2D가 깔끔하지 않게 그려지는 이유가 있었다. 그리고 더 찾아보고 적용하다보니 이게 조명문제 때문만이 아니라 그려진 도형에 해당하는 색상을 전부 입혀주지 않았기 때문에 발생한 일이었다. 모든 면에 제대로 된 색상을 입히고 색이 깨지는 현상을 보지 않으려면 vertices에 8줄의 값을 설정해주었다면 이에 입히는 color도 8줄로 설정해주어야 한다는 것이다. 물론 8줄보다 적거나 많거나 할 경우도 있을 수 있다. 이건 어디까지나 얕게 이해하고 얕게 적용하는 예 중에 하나니까. 기존 네 줄로 선언되있던 colors 배열을 네 줄을 추가해 8줄로 vert..
[OPENGL] OpenGL es 3D차트 애니메이션을 위해 참조할 자료 유투브 https://www.youtube.com/watch?v=53xRjgXeXpo