2014-09-18 3 views
0

Я получаю ERROR: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT со следующим кодом. Любые идеи о том, что я мог бы быть здесь отсутствует:Render to Texture in opengl

glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 640, 480, 0, GL_RGBA4, GL_UNSIGNED_BYTE, NULL); 

glGenFramebuffers(1, &renderTexture); 
glBindFramebuffer(GL_FRAMEBUFFER, renderTexture); 
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0); 
glDrawBuffer(GL_COLOR_ATTACHMENT0); 


GLint val = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

if(val != GL_FRAMEBUFFER_COMPLETE) 
{ 
    std::cout <<"\n Error in framebuffer : 2"; 
} 

Вот остальная часть кода для визуализации и Blit по умолчанию FB.But оленья кожа делают ничего какие-либо идеи? Ожидая зеленого ясно по умолчанию FB

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glClearColor(0.0f,1.0f,0.0f,0.0f); 


glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glBindFramebuffer(GL_READ_FRAMEBUFFER, renderTexture); 
glReadBuffer(GL_COLOR_ATTACHMENT0); 
glDrawBuffer(GL_COLOR_ATTACHMENT0); 
val = glGetError(); 
if(val == GL_NO_ERROR) 
    std::cout<<"\n Bind Fine"; 

val = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if(val != GL_FRAMEBUFFER_COMPLETE) 
{ 
    std::cout <<"\n Error in framebuffer : 3"; 
} 
glBlitFramebuffer(0,0,128,128,0,0,128,128, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
+4

Неверный порядок звонков. Вам нужно вызвать 'glBindFramebuffer()' перед 'glFramebufferTexture2D()'. –

+0

Отличный !! Спасибо .. Это сработало! – user3696282

ответ

6

Вы должны связать FBO, прежде чем принимать вызовы, которые работают на нем. Вызовы OpenGL, которые изменяют объекты, как правило, работают с объектом, связанным в данный момент. Это та же самая схема, которую вы используете с текстурой в начале опубликованного кода, где вы создаете идентификатор текстуры с glGenTextures(), привяжите его с помощью glBindTexture(), а затем выполните вызовы, которые изменяют текстуру, например glTexParameteri() и glTexImage2D().

В корпусе FBO glFrameBufferTexture2D() и glDrawBuffer() действуют в настоящее время связанным FBO. Таким образом, glBindFramebuffer() вызова должен быть перед теми вызовами:

glGenFramebuffers(...); 
glBindFramebuffer(...); 
glFramebufferTexture2D(...); 
glDrawBuffer(...); 

Это всегда хорошая идея, чтобы позвонить glGetError() если вы видите какое-либо непредвиденное поведение вашего кода. Вы бы видели ошибку GL_INVALID_OPERATION от вызова glFramebufferTexture2D(), потому что FBO не был связан.

Еще пара замечаний по коду:

  • glDrawBuffer() вызов является излишним в данном случае. GL_COLOR_ATTACHMENT0 - буфер по умолчанию для FBOs.
  • В то время как вы можете использовать glFramebufferTexture() здесь, glFramebufferTexture2D() будет работать так же хорошо. glFramebufferTexture() требует более новой версии OpenGL (3.2) и полезен только для многоуровневых вложений (массивов текстур и т. Д.).
+0

Я обновил код для рендеринга текстуры, а затем Blit по умолчанию FB, но ничего не получается. Все черное. Любые идеи? – user3696282