我写了这段代码:
首先,我生成纹理和深度缓冲区,然后将它们绑定到帧缓冲区。
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书籍中的代码,但结果仍然是错误的。
答案 0 :(得分:0)
假设您正在使用ES 2.0,那么您用于纹理和渲染缓冲区的格式对渲染目标无效。
在ES 2.0中,唯一对渲染目标有效的深度格式是DEPTH_COMPONENT16
。
对于色彩渲染目标,唯一有效的格式为RGBA4
,RGB5_A1
和RGB565
。
因此,要使用标准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有一些扩展,可以添加对您尝试使用的格式的支持:
但在尝试使用这些格式之前,您必须测试这些扩展名的存在。
任何时候你都遇到FBO渲染问题,调用glCheckFramebufferStatus()
来验证帧缓冲状态是否有效总是一个好主意。