ComputeShader에는 2가지의 Barrier가 있다. 아하... 이 이야기를 하기전에 Barrier가 뭔지를 설명해야 겠구나.. Barrier란..? 일단 ComputeShader와는 상관없이 Barrier는 2가지 종류가 있다. 하나는 execution barrier, 나머지는 memory barrier다. CPU든 GPU든 이런 것들이 계산과 처리를 할 때, (여기서 CPU와 GPU같은 것이 만들어진 구조를 아키텍처[그냥단어다]라고 부른다.) 특히 멀티쓰레드로 작업을 할 때, 이 멀티쓰레드 작업의 결과가 올바르게 나오기 위해, 때로는 쓰레드의 실행을 멈추었다가 다시 실행해야 되고, 때로는 메모리 쓰여진 데이터가 다른 쓰레드에서 이 쓰여진 데이터를 읽어야 하는 경우가 있다. 실행을 멈추고 다시 ..
3.0까지 texture에 직접 쓸 수 있는 방법이 없었다. FBO로 감싸서 그려야 했고, 그 과정은 코드로는 간단하지만, 실제 GPU에서는 상당한 작업이 들어가는 작업이었다. 이제 ComputeShader는 바로 읽기/쓰기를 지원한다. 하지만 여기에는 제약이 있는 데, 기존에 사용하던 방식이 아닌 다른 함수를 통해 텍스쳐를 만들어야 한다. Immutable-storage에 텍스쳐만들기 말이 좀 해깔리지만(Immutable:바꿀 수 없는) 그냥 ComputeShader는 Immutable-storage의 텍스쳐만 쓸(write) 수 있다고 생각하면 된다. 이렇게 만들 수 있는 함수는 glTexStorage*()함수들이다. 텍스쳐 만드는 코드 GLuint texId = 0; glGenTextures( 1,..
ComputeShader는 한개의 쉐이더만 있으면 된다. 다음은 ComputeShader를 컴파일하는 함수다. GLuint CompileComputeShader( const char* szShaderCode ) { GLuint rc = 0; int rvalue; GLchar log[1024]; GLsizei length; GLuint program = glCreateProgram(); GLuint shader = glCreateShader(GL_COMPUTE_SHADER); glShaderSource( shader, 1, &szShaderCode, nullptr ); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &rvalue ); ..
안드로이드의 최소버전(minSdkVersion)을 기준으로 네이티브 코드는 링크가 된다.[*1], 그러다 보니 이 minSdkVersion을 강제로 올려야 되는 상황이 발생한다. 만들고 있는 앱을 지원하지 않는 기능을 제외하고는 낮은 버전에서도 돌리고 싶은 데, 이 minSdkVersion값을 올려버리면 아예 지원하는 기기가 달라지기에 문제가 아닐 수 없다. 어쩔 수 없이 다른 방법을 사용해야 하는 데, 기기에 깔린 libGLESv3.so 파일을 읽어드려서 필요한 함수포인터를 알아 낼 수가 있다. dlOpen을 이용하기 dlOpen함수를 사용하여 dlsym을 통하여 함수의 포인터를 구할 수도 있지만, 이 또한 문제가 발생할 수 있는 데, 기기의 제조사가 OpenGL ES 3.x용 libGLESv3.so파..
GPU도 연산회로를 포함하고 있다. 게다가 이 연산은 3차원 공간과 색공간을 처리할 수 있는 특화된 연산함수를 포함한다. 주로 삼각함수와 고등학교에서 배운 벡터연산 등을 빠르게 계산할 수 있게 설계가 되어있다. 이 것을 잘 활용한다면 CPU의 부하를 줄이고 코어수가 훨씬 많은 GPU를 이용하기 때문에 더 많은 계산을 할 수 있다. OpenGL ES 는 3.1부터 이 연산을 바로 지원하도록 하고 있다. 이 전까지는 뭔가 그리는 것으로 작업 끝내는 용도였지만, 이 제 연산만 하고 다시 CPU에서 끌어다 쓸 수 있게 지원을 해준다. 그 것이 ComputeShader라는 녀석이다. 3.0이하 버전에서도 약간의 트릭을 써서 만들 수는 있다. Fragment shader로 그려서 FBO에 결과를 다시 읽어오면 같은..
Texture(또는 FBO)를 다른 Texture(또는 FBO)에 복사하려면 보통 대상을 FBO(Framebuffer Object)로 만들고 Shader를 작성하여 복사를 한다. 이 방식에는 FBO와 Texture를 엮는 과정이 발생하게 되는 데, 이 게 좀 부하가 걸리는 작업이다. 이 부하를 줄이고, Framebuffer를 사용하는 복잡한 과정없이 바로 복사할 수 있는 함수들이 있다. 모든 상황을 지원하는 것이 아니기에 정리를 좀 해 본다. 1 : FBO -> FBO glBlitFrameBuffer(3.0), glCopyPixels(2.0) 2 : FBO -> Texture glCopyTexSubImage2D(2.0) 3 : Texture -> FBO 바로 지원하는 함수는 없다. Shader를 만들어서..
ComputeShader를 작성하여 열심히 코딩을 하던 중에 어떤 기기는 잘 동작하지만 어떤 기기는 계속되는 깜빡임(flickering)으로 인해 심한 스트레스를 받고 있는 상황이었다. ComputeShader의 정확히 정해지지 않은 스펙과 Mali 드라이버의 버그 등 해결책이 보이지 않던 상황에서 한가지 "내가 간과하고 있는 것이 있는 가?" 하는 질문을 스스로에게 던지게 되었다. 웹을 뒤지고 뒤져서 글을 하나 발견하게 되었는 데, "FrameBuffer를 올바르게 사용하는 법"이라는 글이었다. https://community.arm.com/developer/tools-software/graphics/b/blog/posts/mali-performance-2-how-to-correctly-handle-f..
Single Thread에서 작업을 할 경우, 이 FenceSync라는 녀석은 필요가 없다. 하지만 이전에 포스트했던 shared Context를 사용할 경우 문제가 발생할 수 있다. 다음의 시나리오를 통해 발생할 수 있는 상황을 연출해보자. 이 전에 OpenGLES를 멀티 쓰레드로 사용하는 방법은 다음의 링크를 이용하기 바란다. jamssoft.tistory.com/227 안드로이드 NDK OpenGLES 초기화 및 Shared Context OpenGLES 초기화는 자주하는 작업은 아니지만, 다시 하려고 하면 어떻게 하는지 까먹는 작업이라 이렇게 정리를 해둔다. NDK로 코드가 작성되었으며, 이게 우끼게도 Java는 다른 식으로 작성해야 문 jamssoft.tistory.com Thread B에서 t..
OpenGLES 초기화는 자주하는 작업은 아니지만, 다시 하려고 하면 어떻게 하는지 까먹는 작업이라 이렇게 정리를 해둔다. NDK로 코드가 작성되었으며, 이게 우끼게도 Java는 다른 식으로 작성해야 문제가 없다. 초기화 순서 1. eglInitialize 2. eglBindAPI 3. eglChooseConfig 4. eglCreate(Window 또는 Pbuffer)Surface 5. eglCreateContext 6. eglMakeCurrent 초기화는 다음의 순서로 진행한다. 순서가 바뀔 수도 있지만, 필자가 가진 모든 기기에서 위 순서를 사용할 경우 문제 없이 잘 초기화가 되었다. 그리고, 아래의 설명은 필자가 그냥 경험으로 터득?한 것이라 틀린 부분이 많을 수 있다. 어짜피 초기화만 끝나면 신..
GLSurfaceView안드로이드는 OpenGLES을 사용할 수 있는 방법 중에 간단하면서도 쓸만한 GLSurfaceView를 지원해 주고 있다.속도가 빠른 장점이 있다. 정확히 TextureView를 이용한 것 보다는 빠른 것 같다. GLSurfaceView는 화면을 그리는 코드가 Render Thread로 분리되어 실행되기 때문에 MainThread에 주는 무리를 줄일 수 있고, 분리된 Thread로 인해 빠르게 화면을 그릴 수가 있다. 기본 사용법1. AndroidManifest.xml설정2. 초기화 및 Renderer지정3. onPause/onResume 1. AndroidManifest.xml 설정 일단 OpenGLES를 사용한다는 것을 알려야 하기 때문에 AndroidManifest.xml파일..
동영상이나 디지털인식장치(카메라 등등)을 사용할 때, 이미지의 정보가 RGB보다는 YUV색을 쓰는 경우가 많다. 이 YUV로 표현된 형태를 Texture등으로 만들어야 할 경우 RGB 색공간으로 변환하는 작업을 해야 하는 데, 이미지라는 상당히 큰 데이터를 다루는 문제라 실제 변환작업은 영상의 frame-rate를 떨어뜨릴 정도로 부하가 걸린다.이 변환작업만으로 완성된 결과가 나오면, 상관없을 정도지만, 이 것뿐만아니라 다른 작업또한 부하가 걸리니, 이 작업의 부하를 좀 줄일 필요가 있다. 실제 카메라등에서 넘어오는 데이터는 그 들만의 형태를 가지게 되는 데, 이 것을 변환하는 작업은 2부분으로 주로 나뉜다.1 ) 처음에는 color pixel의 배치가 순서대로 되어 있지 않으므로(보통 Y-U-V가 따로..
- Total
- Today
- Yesterday
- TTS
- 아끼는 법
- 공유 컨텍스트
- 금리
- gpgpu
- choreographer
- 안드로이드
- 블로그
- 재태크
- 적금
- 애드핏
- ComputeShader
- 컴퓨트셰이더
- 예금
- 전기세
- 티스토리
- OpenGL ES
- 사용료
- 컴퓨트쉐이더
- 전기료
- texture
- 에어콘
- OpenGLes
- Android
- 텍스처
- 애드센스
- 재테크
- 에어컨
- 전기요금
- 경제보복
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |