OpenGL ES无法渲染到纹理

时间:2014-11-15 07:47:51

标签: c++ opengl-es

我写了这段代码:

首先,我生成纹理和深度缓冲区,然后将它们绑定到帧缓冲区。

glEnable(GL_CULL_FACE);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

GLint max;
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE,&max);;

if(max<=esContext->width||max<=esContext->height)
{
    printf("Too big!\n");
    getchar();
}

glGenFramebuffers(1,&framebuffer1);

glGenTextures(1,&texturel);
glBindTexture(GL_TEXTURE_2D,texturel);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,esContext->width,esContext->height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
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_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glGenRenderbuffers(1,&depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER,depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT24,esContext->width,esContext->height);

glGenRenderbuffers(2,renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER,renderbuffer[0]);
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA8,esContext->width,esContext->height);

glBindFramebuffer(GL_FRAMEBUFFER,framebuffer1);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,texturel,0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,depthbuffer);

然后我将一个框渲染到帧缓冲区并尝试将纹理渲染到我的屏幕上:

glBindFramebuffer(GL_FRAMEBUFFER,framebuffer1);

glViewport(0,0,esContext->width,esContext->height);
glClearColor(1.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

g_renderer->draw_box(&s);

glBindFramebuffer(GL_FRAMEBUFFER,0);

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

g_renderer->render(texturel,0,0,esContext->width/2,esContext->height/2);

eglSwapBuffers( esContext->eglDisplay, esContext->eglSurface );

最后,结果看起来像随机数据。 我已经尝试了很多渲染纹理的方法,甚至复制了OpenGL ES书籍中的代码,但结果仍然是错误的。

1 个答案:

答案 0 :(得分:0)

假设您正在使用ES 2.0,那么您用于纹理和渲染缓冲区的格式对渲染目标无效。

在ES 2.0中,唯一对渲染目标有效的深度格式是DEPTH_COMPONENT16

对于色彩渲染目标,唯一有效的格式为RGBA4RGB5_A1RGB565

因此,要使用标准ES 2.0,您可以使用:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
             esContext->width, esContext->height, 0,
             GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);
...
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
                      esContext->width, esContext->height);

ES 2.0有一些扩展,可以添加对您尝试使用的格式的支持:

  • OES_rgb8_rgba8添加了对RGB8和RGBA8的支持,作为彩色渲染目标格式。
  • OES_depth24添加了对DEPTH_COMPONENT24的支持,作为深度渲染目标格式。

但在尝试使用这些格式之前,您必须测试这些扩展名的存在。

任何时候你都遇到FBO渲染问题,调用glCheckFramebufferStatus()来验证帧缓冲状态是否有效总是一个好主意。