I'm trying to render to a texture using OpenGL ES 2.0, but I can't seem to make it work.
This is how I proceed:
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);
}
};
But when I try drawing on it and using the resulting texture, the texture is drawn as totally black.
If I just don't wrap the drawing code in render_tex->begin();
and render_tex->end();
, everything draws correctly, leading me to believe that the problem is isolated to the code above.
A texture is an OpenGL Object that contains one or more images that all have the same image format. A texture can be used in two ways: it can be the source of a texture access from a Shader, or it can be used as a render target.
The main difference between the two is that OpenGL ES is made for embedded systems like smartphones, while OpenGL is the one on desktops. On the coding level, OpenGL ES does not support fixed-function functions like glBegin/glEnd etc... OpenGL can support fixed-function pipeline (using a compatibility profile).
Make sure the texture is not bound before trying to render into it. Even if not using texturing at all, trying to render into a currently bound texture may invoke undefined behaviour and just not work.
You should actually call glBindTexture(GL_TEXTURE_2D, 0)
after the glTexImage2D
in your RenderTexture
constructor, or maybe restore the previously bound texture, like you do with the FBO. Just make sure the tex
is not bound when you render into the FBO.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With