Jas
Jas

Reputation: 870

Opengl framebuffer separate stencil texture

I cannot find any documentation for a separate stencil texture for framebuffer objects. Basically here is what I have so far:

glBindTexture(GL_TEXTURE_2D, this->mTextures[FRAMEBUFFER_STENCIL_TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, width, height, 0, GL_RED_INTEGER, GL_INT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,  GL_TEXTURE_2D, this->mTextures[FRAMEBUFFER_STENCIL_TEXTURE],    0);

But this causes a creation error. Is my format wrong or is it something else?

Upvotes: 4

Views: 1844

Answers (1)

Reto Koradi
Reto Koradi

Reputation: 54592

Yes, those format values are wrong for a stencil texture. You need to use specific stencil enums for both the internalFormat and format. The call should look like this for an 8-bit stencil texture:

glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8,
             width, height, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, 0);

As has been pointed out in comments, pure stencil textures are only available in OpenGL 4.4 and higher.

An alternative is to allocate a depth/stencil texture, and just not use the depth part. However, sampling from the stencil part of a depth/stencil texture requires OpenGL 4.3 or higher, so that only reduces the version requirement by one minor version.

Upvotes: 4

Related Questions