在opengl中渲染到纹理

use*_*282 0 opengl

我得到ERROR:GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,代码如下.关于我在这里可能缺少的任何想法:

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";
}
Run Code Online (Sandbox Code Playgroud)

这里有其余的代码用于渲染和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);
Run Code Online (Sandbox Code Playgroud)

Ret*_*adi 6

您需要在对其进行操作的调用之前绑定FBO.修改对象的OpenGL调用通常在当前绑定的对象上运行.这与您在贴出的代码开头处遵循纹理的方案相同,您可以在其中生成纹理ID glGenTextures(),将其绑定glBindTexture(),然后进行修改纹理的调用,例如glTexParameteri()glTexImage2D().

在FBO情况,glFrameBufferTexture2D()glDrawBuffer()就当前绑定的FBO运营.所以glBindFramebuffer()呼叫需要在这些呼叫之前:

glGenFramebuffers(...);
glBindFramebuffer(...);
glFramebufferTexture2D(...);
glDrawBuffer(...);
Run Code Online (Sandbox Code Playgroud)

glGetError()如果您发现代码有任何意外行为,那么打电话总是一个好主意.你会看到GL_INVALID_OPERATION来自glFramebufferTexture2D()调用的错误,因为没有绑定FBO.

关于代码的更多观察:

  • glDrawBuffer()在这种情况下,呼叫是多余的.GL_COLOR_ATTACHMENT0是FBO的默认绘制缓冲区.
  • 虽然你可以glFramebufferTexture()在这里使用,但也可以使用glFramebufferTexture2D().glFramebufferTexture()需要更新的OpenGL版本(3.2),并且只对分层附件(纹理数组等)有用.