2012-03-02 9 views
0

私はEXT_discard_framebufferを読んで、名前付きフレームバッファの添付可能なイメージの内容を不定にします。そして、フレームバッファを破棄した後、glReadPixelsからのピクセル値は破棄するフレームバッファと同じです。どうして?そして、この拡張では、フレームをレンダリングした後にフレームバッファコンテンツの格納バックを最適化する方法をOpenGL ESで実装していますか? glDiscardFramebufferEXTのOpenGL ES 2.x:glDiscardFramebufferEXTの後にピクセルを読み取る方法は?

// 
// create a texture object 
// 
GLuint tex; 
glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

// 
// create a framebuffer object 
// 
GLuint fbo; 
GLboolean check; 

glGenFramebuffers(1, &fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

check = glIsFramebuffer(fbo1); 
if (!check) { 
    __android_log_print(ANDROID_LOG_ERROR, "debug", 
      "------ check Framebuffer object failed ------\n"); 
    return EGL_FALSE; 
} 

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 
    __android_log_print(ANDROID_LOG_ERROR, "debug", 
      "------ fbo not set completely!------\n"); 
    return EGL_FALSE; 
} 

draw_texture(fbo); 

GLubyte sampledColor[4] = {0, 0, 0, 0}; 
int randX = 128, randY = 128; 

GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT }; 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

glReadPixels(randX, randY, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, sampledColor); 
__android_log_print(ANDROID_LOG_INFO, "debug", 
    "[LINE: %d] coordinate(%d, %d) color is (%d, %d, %d, %d)\n", 
    __LINE__, randX, randY, sampledColor[0], sampledColor[1], 
    sampledColor[2], sampledColor[3]); 

glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, attachments); 

glReadPixels(randX, randY, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, sampledColor); 
__android_log_print(ANDROID_LOG_INFO, "debug", 
    "[LINE: %d] coordinate(%d, %d) color is (%d, %d, %d, %d)\n", 
    __LINE__, randX, randY, sampledColor[0], sampledColor[1], 
    sampledColor[2], sampledColor[3]); 

答えて

0

仕事は、あなたがフレームバッファの内容を気にしないドライバーに知らせることです。どのドライバ(またはGPU)がそれを行うかはあなた次第です。ドライバはすべての内容を0にリセットするか、そのまま残しておくこともできますし、glClearを次に呼び出すときにこの情報を使用し、より効率的に実行することもできます(たとえばmemsetを0値)。それが正確に何をするのか心配しないでください。

+0

こんにちは、MārtiņšMožeiko 私はglDiscardFramebufferEXT()をテストしたいですが、次のステップがglDiscardFramebufferEXTを呼び出した後に何か分かりません。あなたは私を見せることができます?どうもありがとう。 –

+0

次のステップはどういう意味ですか? –

+0

私はOpenGL ES2でglDiscardFramebufferEXT funcをテストしたいのですが、どのように正しい機能を使ってチェックするのですか? –

関連する問題