Michael IV
Michael IV

Reputation: 11496

Rendering to TBO

I need to render to Buffer texture. Why TBO? TBO can be mapped easily as CUDA resource for graphic interop. It can also store byte sized data, which is what I need. I was trying to find related info in GL specs. Here it is stated that:

Buffer Textures work like 1D texture, only they have a single image, identified by mipmap level​ 0.

But when I try to attach TBO to FBO I am always getting "Missing attachment" error when checking completeness, which leads me to a conclusion that GL_TEXTURE_BUFFER is not supported as FBO attachment.

Two questions:

  1. Is it true?
  2. Is the only alternative here to write to SSBO

More detailed info:

I am getting

GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT

When I am trying to attach the TBO to the framebuffer.There is no point to attach the whole code here as it is both heavily abstracted API and belive me,I am pretty experienced in using OpenGL and framebuffers.Attaching a regular GL_TEXTURE_2D works great. Here is the chunk of the TBO creation and the attachment stage:

GLuint tbo;
GLuint tboTex;
glGenBuffers(1, &tbo);
glBindBuffer(GL_TEXTURE_BUFFER, tbo);
glBufferData(GL_TEXTURE_BUFFER, viewportWidth * viewportHeight * 4, NULL, GL_DYNAMIC_DRAW);
glBindBuffer(GL_TEXTURE_BUFFER, 0);
glGenTextures(1, &tboTex);
glBindTexture(GL_TEXTURE_BUFFER, tboTex);
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA8, tbo);
glBindTexture(GL_TEXTURE_BUFFER, 0);

Then attach to FBO:

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tboTex, 0);

///also tried:
/// glFramebufferTexture1D
/// glFramebufferTexture2D

Upvotes: 0

Views: 687

Answers (1)

Nicol Bolas
Nicol Bolas

Reputation: 474116

Buffer textures cannot be attached to FBOs:

GL_INVALID_OPERATION is generated by[sic] if texture is a buffer texture.

A good reminder for why you should always check your OpenGL errors.

Is the only alternative here to write to SSBO

If your goal is to use a rendering operation to write stuff to a buffer object, you could also use Image Load/Store operations with buffer textures. But if your hardware could handle that, then it should handle SSBOs too.

You could also try to use geometry shaders and transform feedback operations to write whatever you're trying to write.

However:

It can also store byte sized data

Images can store "byte sized data" as well. The image format GL_R8UI represents a single-channel, 8-bit unsigned integer.

That doesn't resolve any CUDA-interop issues, but rendering to bytes is very possible.

Upvotes: 1

Related Questions