나의별
안드로메다에서 아이뽕 뽀개기??
aero2k(twitter)
twbjkim77@gmail.com(facebook)
[GLES20] 16. Q/A 몇가지와 FBO 사용시 유의점 정리 | android.3D
나의별 2012.01.01 15:43
안녕하세요 나의별님 질문자입니다 답변감사합니다. ^^



질문 1. & 2.  

   FBO를 사용안하냐는 질문이었습니다
   glGetRenderbufferParameteriv 사용해서 가로세로 크기를 얻어왔거든요
   그대로 하면 되겠네요

질문 3.

더블버퍼링이란 es 1.1지원하는가? 안하는가? 하는문제가 아니지 않나요?
하나의 프레임버퍼일때 프레임버퍼의 기록속도 와   재생속도의 차이에 발생하는것을 해결하는 방안이잖아요
프레임버퍼를 여러개 만들어서 스왑해주면 되잖아요

하긴 fbo가es2.0기준이라 더블버퍼링 할려면 fbo를 이용해 스왑해야 하기때문에 하신말씀인거 같긴하네요 ㅎ


질문 4.

glsurfaceview의 renderer 에서 ondrawframe인가는 함수가 끝나면
내부적으로 context에다 그리라고 해주는거 같더군요
   편리하기도 하지만 ondrawframe 외의 메서드로 native 랜더러를 호출하면 그려지지도 않더군요 ^^;;

  
첨안.

포팅할때 정말로 필요한 팁이네요 감사드리고 질문또 하겠습니다 ㅎㅎㅎ
새복 많이 받으세요
  

안녕하세요.
제기억에는 갤럭시s, 탭, s2등에서 glGetRenderbufferParameteriv api가 정상동작하지 않았었습니다.
0만 날라옴.   지원하지 않는것도 갔고, 혹 시도해 보시고 안되면 자바 단에서 싸이즈 변경되는 listener함수 호출시 color render buffer와 depth render버퍼의 크기를 변경해 주셔야 할겁니다~
새해복많이 받으세요~
저도 현재 네이브 단에서 FBO 생성해서 RTT를 적용하는데 자바단에서는 잘 그려지는게 네이티브 단으로 가면 context를 못찾는 에러가 나는데요..
RTT시에 순서가 FBO에 color render buffer와 depth render buffer의 순서가 잘못될 경우, OpenGL status error가 나오더라구요...
이 순서가 ios나 java단에서는 별 신경 안썼는데, windows(android) EGL로 할때 보면 에러가 나더라구요 ^^;
9tab gaussian blur(http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/) 예제를 참조해 보는 것도 괜찮을것 같네요.
createFramebuffer(m_fbo[0], m_fbtex[0]);
createFramebuffer(m_fbo[1], m_fbtex[1]);

void RenderingEngine::createFramebuffer(GLuint& fbo, GLuint &fbtex) {
glGenTextures(1, &fbtex);
glBindTexture(GL_TEXTURE_2D, fbtex);
//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.x, m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbtex, 0);
{
GLenum status;
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch (status) {
case GL_FRAMEBUFFER_COMPLETE:
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
LOG_PRINT("Error: unsupported framebuffer format");
//cerr << "Error: unsupported framebuffer format" << endl;
exit(0);
default:
LOG_PRINT("Error: invalid framebuffer config");
//cerr << "Error: invalid framebuffer config" << endl;
exit(0);
}
}
}

그런데 여기에는 depth renderbuffer가 없습니다.
저는 위의 createFramebuffer를 아래와 같이도 유도해서 만들어 봤었습니다.

for (int i=0; i<OffscreenCount; ++i) {
glGenRenderbuffers(1, &m_renderbuffers.SceneDepth[i]);
glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffers.SceneDepth[i]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, m_size.x, m_size.y);
glGenRenderbuffers(1, &m_renderbuffers.SceneColor[i]);
glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffers.SceneColor[i]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, m_size.x, m_size.y);
glGenFramebuffers(1, &m_framebuffers.Scene[i]);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffers.Scene[i]);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
     GL_RENDERBUFFER, m_renderbuffers.SceneColor[i]);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
     GL_RENDERBUFFER, m_renderbuffers.SceneDepth[i]);
m_textures.Scene[i] = CreateFboTexture(m_size.x, m_size.y);
m_fbo[i] = m_framebuffers.Scene[i];
m_fbtex[i] = m_textures.Scene[i];
}
            
GLuint RenderingEngine::CreateFboTexture(int w, int h) const
{
             GLuint texture;
             glGenTextures(1, &texture);
             glBindTexture(GL_TEXTURE_2D, texture);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
             return texture;
}


엄청 길어져 버렸다능 -ㅁ-;

나중에 RTT나 Blur 다룰때 정리 해야겠네요 ^^;
앗 답변 감사합니다.. 제가 NDK 테스트로 해보는 소스가 NDK 샘플에 있는 hello-gl2로 하고 있는데요. 여기에 네이티브단에 FBO 사용해서 RTT 사용하면 계속 안되서 EGL문제인가 해서 SurfaceView관련 랜더러 속성 바꿔보기도 하고 여러가지 하는데 결국은 네이티브 단에서는 RTT사용하는거 안되고 있습니다. 아이폰에서는 잘 되었는데요.. 아이폰에서는 FBO로만 해놔서.. 흑..마지막에 FrameBuffer 0으로 세팅해도 결국은 잘 안되는거 보면 저 아직 내공이 마니.. 부족한가봐요. ㅎㅎ
  • 나는나는나에요
  • 2012.01.05 19:56
  • 답글 | 신고
저도 안드로이드쓰는데 꽤 좋은 정보같아요. 감사하구요 다음에 시간나면 또 또 또 또또 들리도록하겠습니다 ㅎㅎㅎ
http://www.youtube.com/watch?v=zXKV78VERio&feature=colike
혹시 자바단에서 color render buffer와 depth render buffer 사이즈를 어떻게 변경 할 수 있나요?
NDK로 다른건 FBO RTT 다른 폰에서즌 잘 적용되는데 갤러시S2에서는 FBO생성이 안되서요....
갤럭시는 왜 맨날 그러는지 항상 속썩여요.
http://blog.shayanjaved.com/2011/03/13/shaders-android/
요기 소스를 한번 참고해 보는것도 좋을것 같네요.
AndroidShader.apk 라는 앱인데, java로 RTT를 구현하고 있습니다.
참고로 위의 소스를 갤탭(PowerVR)에서는 정상 동작하지만, 갤2(Nvidia?)의 경우에는 GL_UNSIGNED_INT 사용시
GL_INVALID_ENUM(1280)뜨면서 사망합니다.
갤2에서는 지원하지 않는것 같으니,.
GLES20.glDrawElements(GLES20.GL_TRIANGLES, _quadi.length, GLES20.GL_UNSIGNED_INT, _qib);
를 GL_UNSIGNED_SHORT 으로 변경해 주면 정상 동작 했었습니다.
물론 _qib, _quadi 등도 int 에서 short 형으로 자료를 변경해 줘야 하고요 ^^;
안녕하세요.   답변 감사합니다.
저도 자바단에서는   RTT   구현을 하였지만 문제는 모든 GL코드를 NDK단으로 내렸을때 다른 안드로이드폰은 RTT가 잘 먹었는데 갤럭시S2에서만 FBO생성이 안되어서요.. 저만 그런건지 잘 모르겠어요.. 그래서 혹시 여쭤 보았습니다..^^;
http://code.google.com/p/myastro/downloads/list
위치에 NDK 단에 RTT 구현한 소스 포함해서 올렸는데,
혹 필요하시면 참고하십시요.
OGLES20Application.release.v.1.3.0.zip  
갤탭과 갤S2에서는 RTT 구현시 동작하는 것은 확인하였습니다.
(갤탭에서 Spot Light가 적용이 안되는 문제는 있음 ^^;)
앗. 지금 봤어요. 회사일 때문에 정신이 없었어요. 감사합니다. 왠지 저랑 비슷한일 하시는거 같아요... ㅎㅎ

등록
텍스티콘 텍스티콘