我需要渲染到Buffer texture。为何选择TBO? TBO可以很容易地映射为图形互操作的CUDA资源。它还可以存储字节大小的数据,这是我需要的。我试图在GL规范中找到相关信息。 Here声明:
缓冲纹理就像一维纹理一样,只有一个图像, 由mipmap level 0识别。
但是当我尝试将TBO附加到FBO时,我总是得到"缺少附件"检查完整性时出错,这导致我得出结论:GL_TEXTURE_BUFFER不支持作为FBO附件。
两个问题:
更详细的信息:
我正在
GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
当我试图将TBO附加到帧缓冲区时。没有必要在这里附加整个代码,因为它既是抽象的API,也不相信我,我在使用OpenGL和framebuffers时非常有经验。附加一个常规的GL_TEXTURE_2D效果很好。 以下是TBO创建的大块和附件阶段:
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);
然后附加到FBO:
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tboTex, 0);
///also tried:
/// glFramebufferTexture1D
/// glFramebufferTexture2D
答案 0 :(得分:1)
Buffer textures cannot be attached to FBOs:
如果GL_INVALID_OPERATION
是缓冲区纹理,则[pic]生成
texture
。
很好地提醒您应该始终检查OpenGL错误。
这是写SSBO的唯一选择
如果您的目标是使用渲染操作将内容写入缓冲区对象,则还可以将Image Load/Store operations与缓冲区纹理结合使用。但是如果你的硬件可以处理它,那么它也应该处理SSBO。
您还可以尝试使用geometry shaders和transform feedback operations来撰写您尝试撰写的任何内容。
然而:
它还可以存储字节大小的数据
图像可以存储"字节大小的数据"同样。图像格式GL_R8UI
表示单通道,8位无符号整数。
这并没有解决任何CUDA-interop问题,但很有可能渲染到字节。