我正在尝试使用 OpenGL ES 2.0 渲染到纹理,但我似乎无法让它工作。
我是这样处理的:
struct RenderTexture
{
GLuint framebuffer;
GLuint tex;
GLint old_fbo;
RenderTexture(GLuint width, GLuint height)
{
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);
glGenFramebuffers(1, &framebuffer);
glGenTextures(1, &tex);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
width, height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
tex, 0);
glClearColor(1, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
cout << status << endl; // this is not called
}
glBindFramebuffer(GL_FRAMEBUFFER, old_fbo);
}
void begin()
{
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
}
void end()
{
glBindFramebuffer(GL_FRAMEBUFFER, old_fbo);
}
};
但是当我尝试在其上绘制并使用生成的纹理时,纹理被绘制为全黑。
如果我不将绘图代码包装在 render_tex->begin();
和 render_tex->end();
中,一切都会正确绘制,引导我相信问题与上面的代码无关。
最佳答案
在尝试渲染之前确保纹理未被绑定(bind)。即使根本不使用纹理,尝试渲染到当前绑定(bind)的纹理中也可能会调用未定义的行为并且根本不起作用。
您实际上应该在 RenderTexture
构造函数中的 glTexImage2D
之后调用 glBindTexture(GL_TEXTURE_2D, 0)
,或者恢复之前绑定(bind)的纹理,就像你对 FBO 所做的那样。只需确保在渲染到 FBO 中时未绑定(bind) tex
。
关于ios - OpenGL ES 2.0 渲染到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439697/