问题标签 [fbo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4468 浏览

opengl - OpenGL内存不足错误,FBO大

在 PyOpenGL/PyQt 中创建大型 (2^13) 帧缓冲区对象时出现内存不足错误:

给出:

但是,如果我降级到 2^12 纹理或 FBO,这会很好。

在我看来,两个大约132mb 268mb(4 字节*8192^2)的图像(FBO+纹理)应该填满我的 1gb 视频内存,这似乎是不合理的。我错过了什么?

0 投票
2 回答
6150 浏览

opengl - 在 GLSL 中访问多个 FBO 纹理以创建另一个纹理

我创建了 4 个纹理并将它们附加到 FBO,命名为 fbo_texture0 - fbo_texture3。所有这些都已成功创建,如以下屏幕截图所示:

FBO 中的纹理 图 1

现在,我想使用 GLSL 创建从先前纹理 (fbo_texture0 - fbo_texture3) 获得的第 5 个纹理。现在,我只想将第一个纹理复制到第五个纹理中。不幸的是,这是我得到的:

纹理失败 图 2

问题是:

  1. 我如何在 GLSL 中访问这些 fbo 纹理?
  2. 如何创建第 5 个纹理?(或从第一个纹理复制到第五个纹理?)

这是程序的完整代码(如果需要):

这是顶点着色器:

这是片段着色器:

编辑#1

按照@Damon 的建议修改代码后(代码也已编辑),这是结果的屏幕截图:

在此处输入图像描述 图 3

现在,我真的不知道问题到底是什么。我尝试更改片段着色器以访问另一个纹理,例如gl_FragColor = texture2D(tex2, gl_TexCoord[0].st);,但我仍然得到与上面相同的显示。所以我认为这绝对不是模型视图/投影问题。

编辑#2

这个问题仍然不清楚。但是,我尝试glActiveTexture(GL_TEXTUREn);在程序中只给出一个命令,并注释掉其他glActiveTexture命令(不修改着色器),得到以下结果:

在此处输入图像描述 图 4glActiveTexture(GL_TEXTURE0);激活。

在此处输入图像描述 图 5glActiveTexture(GL_TEXTURE1);激活。

在此处输入图像描述 图 6glActiveTexture(GL_TEXTURE2);激活。

在此处输入图像描述 图 7glActiveTexture(GL_TEXTURE3);激活。

当至少 2被激活时,我得到了与图像 5glActiveTexture(GL_TEXTUREn);相同的结果。这让我想知道问题到底是什么。

0 投票
1 回答
923 浏览

macos - OpenGL:绘制 FBO 时的纹理

有谁知道在绘制纹理 FBO 时是否可以渲染纹理对象?例如,我想生成一个显示纹理茶壶渲染的 FBO/纹理。这可以用来显示所述茶壶的镜面反射。

我现在已经尝试了几次,它总是返回一个不可见的对象。FBO/纹理显示线条和其他非纹理阴影对象,但不显示纹理对象。奇怪的...

-- 直接在主帧缓冲区上绘制相同的场景效果很好。纹理和非纹理对象渲染得很好。

-- 生成 FBO/纹理时不使用我正在渲染的纹理 ID。所以,没有循环绑定。

-- glGetError 在 glDrawElements 之后没有返回任何错误,所以这不是问题的根源。

-- 纹理坐标正确。

-- 我的显卡(Intel x3100)确实支持 Mac OS-X 10.6.7 上的 OpenGL 2.0,并且 FBO 示例程序运行良好(但是它们没有纹理)。

这可能是非常简单的事情,但我就是找不到它......


如果不可能,那么推荐的方法是什么?带着色器?这需要某种形式的多重纹理吗?

0 投票
2 回答
25425 浏览

opengl - 使用像素缓冲区对象 (PBO) 从帧缓冲区对象 (FBO) 读取像素值

我可以使用像素缓冲区对象(PBO)直接从 FBO 读取像素值(即使用 glReadPixels)(即,当 FBO 仍然连接时)?

如是,

  1. 使用 PBO 和 FBO 的优缺点是什么?
  2. 以下代码有什么问题

{

以下 glReadPixels 工作正常

以下 glReadPixels 不起作用:(

0 投票
2 回答
6052 浏览

opengl - 帧缓冲区对象 (FBO) 与渲染和深度缓冲区关系

我在网上看到了许多示例(例如),它们执行以下操作

  • 创建和绑定 FBO
  • 创建和绑定缓冲区(纹理、渲染、深度、模板)
  • 然后,解除绑定缓冲区
  • 要使用 FBO - 绑定 FBO,请先完成工作,然后取消绑定 FBO
  • 但是,也可以使用纹理缓冲区绑定纹理缓冲区以进行读取、写入等操作
  • 但从未见过重新绑定其他缓冲区(渲染、深度、模板),为什么?

BUFFERS 创建和绑定/取消绑定的示例(以下代码仅用于展示我解释的内容并完美运行),

1. 为什么我们不需要再次绑定所有的 BUFFERS(我的意思是在使用/绘制对象到 FBO 时)?

2. 幕后发生了什么?

编辑:附加-> 绑定和解除附加-> 取消绑定

0 投票
2 回答
1950 浏览

opengl - 使用帧缓冲区对象 (FBO) 或?

情况:生成具有不同变换和旋转的形状和相应边缘的 N 个样本(使用 Sobel 滤波器或我自己的),而视口(大小 = 600*600)和相机保持不变。即将有 N 个样本 + N 个对应的边。

我想这样做,

使用一个带有 2 个渲染缓冲区的 FBO [即每个缓冲区的大小将为 = (N *600) * 600]- N 个形状的第一个和相应形状的边缘的第二个

问题:

  1. 实现上述目标的最佳方法是什么?
  2. 虽然视口大小为 600*600 像素,但形状仅占 50*50 像素左右。那么是否有任何有效的方法可以仅在第二个缓冲区上对边界框/AABB 区域应用边缘检测?也只能以有效的方式读取 2N 个边界框(N 个样本 + N 个对应边)?
0 投票
2 回答
940 浏览

opengl - OpenGL:仅使用一个帧缓冲区并切换目标纹理

除了使用多个帧缓冲区对象之外,我还可以只创建一个对象并通过在需要时切换它的目标纹理来获得相同的结果吗?

  • 在所有情况下这都是一个坏主意吗?如果是,为什么?

我一直render.SetTargetTexture()在我的程序的 API 中实现一个函数,如果在幕后使用更多的帧缓冲区,从逻辑上讲它是行不通的。然后我必须完全公开帧缓冲区。

0 投票
4 回答
1132 浏览

opengl - OpenGL/OpenGLES 中的帧缓冲纹理行为

在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心不要导致反馈循环(从您正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在读取和写入同一纹理的不同像素,它是否也是未定义的行为?一个例子是,如果我试图制作一个内部带有渲染纹理的纹理图集。在渲染纹理时,我从存储在纹理图集中的另一个纹理中读取像素。

因为我没有在纹理中读取和写入相同的像素,所以行为仍然被认为是未定义的,只是因为数据来自同一个纹理?

0 投票
1 回答
5074 浏览

opengl - OpenGL:将图像加载到纹理数组中

我正在尝试通过以下代码段将多个纹理(来自 8x8 *.bmp 图像)加载到多个 FBO 中:

但是,我无法使用 glTexSubImage3D 函数附加这些纹理。CheckGLErrors() 指示错误在以下行中,说明“无效值”错误。

阅读手册后,我认为该错误与以下语句有关:

如果 xoffset < - b 、 xoffset + width > w - b 、 yoffset < - b 或 yoffset + height > h - b 或 zoffset < - b 或 zoffset + depth > d - b ,则生成 GL_INVALID_VALUE,其中 w 是GL_TEXTURE_WIDTH,h 是 GL_TEXTURE_HEIGHT,d 是 GL_TEXTURE_DEPTH,b 是正在修改的纹理图像的边框宽度。请注意,w、h 和 d 包括两倍的边框宽度。

这让我不知道如何让这些纹理工作。有任何想法吗?提前致谢。

0 投票
1 回答
1402 浏览

c++ - 可以将 GL_FLOAT 纹理作为颜色附件分配给 FBO 吗?

对于纹理的屏幕外渲染,我在附件 GL_COLOR_ATTACHMENT0 处附加了一个由定义的纹理

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_FLOAT,NULL);

然后我使用输出 vec4 的片段着色器渲染到 FBO,所以通常情况下应该没问题。为了检查我是否正确显示纹理,我使用了函数

glTexSubImage2D()

在纹理中间添加一些灰色像素。纹理正确显示(我可以在正确的位置完美地看到这些像素),但纹理的其余部分只是嘈杂的伪影(当它不是黑色时)。

这是因为我将 GL_FLOAT 用于 GL_RGBA 纹理吗?如果是,我如何在 GLSL 中将 uvec4 转换为 vec4?我的主着色器的输出是 vec4,我不知道如何将 usampler2D 纹理的 uvec4 输出转换为我的最终 vec4。

感谢您提供的任何答案:)

编辑:我找到了解决方案:我没有清除我的 2 个渲染之间的 GL_COLOR_BUFFER_BIT。