问题标签 [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 回答
2774 浏览

macos - FBO:渲染到纹理,绘制渲染纹理时纹理映射错误

我在 Mac OS X 应用程序上使用 OpengGL 在NSOpenGLView.

该应用程序是一个电影播放器​​。它将电影帧解码为CVOpenGLTextureRef(这是 OpenGL 纹理),我使用GL_QUAD. 一切正常。

以下是代码的相关部分。

它工作得很好,我可以调整窗口大小,并且纹理正确映射到较小的窗口。

请参阅此处了解从全屏到 500x280 像素的不同窗口大小: 没有 FBO

我现在想使用 FBO 渲染到纹理,我开始制作一个非常简单的实现,其中包括将电影帧渲染到屏幕外的 FBO(纹理),然后将该纹理绑定到屏幕上绘制。

这是代码:

代码不能正常工作,因为图像/纹理不仅是颠倒的,而且纹理映射也是错误的。只有当窗口全屏时它才能正常工作,否则它的行为真的很奇怪。

见下图: 与 FBO

如您所见,纹理在窗口内正确缩放,但它会根据全屏窗口大小和实际窗口大小之间的差异按比例“裁剪”。

我已经尝试了一切都没有成功。

由于这是我第一次使用 OpenGL,我是否遗漏了什么?我要疯了。。

0 投票
1 回答
592 浏览

opengl - OpenGL:渲染到 FBO 时是否支持纹理组合器功能?

我有一个渲染到第一个 FBO 的 OpenGL 纹理,我需要编辑它的亮度,渲染到第二个 FBO,然后在屏幕上绘制它。

如果我将纹理渲染到第二个 FBO(不修改其亮度)然后在屏幕上绘制它,它会正确显示。

如果我尝试编辑渲染纹理的亮度(使用纹理组合器功能,如glTexEnv),我会得到错误的输出,如全黑或全白纹理、改变对比度等。

如果我在屏幕上而不是 FBO 上绘图时应用亮度调节,效果很好。亮度按预期修改。

glTexEnv所以我的问题是:我可以在渲染到 FBO 时使用纹理组合器功能吗?

这是我在绘制到 FBO 时用来修改亮度的代码(它不起作用):

0 投票
2 回答
1865 浏览

opengl - GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

我正在尝试“读取”附加到第一个 FBO(fboA)的纹理,修改它(使用片段着色器)并渲染到第二个 FBO(fboB)。

我无法弄清楚,我得到的只是黑色或白色纹理。

这是代码:

这是片段着色器代码:

我希望在 fboB 中呈现更暗的纹理,但我只得到全黑纹理。如果我写,也会发生这种情况gl_FragColor = texture2D(texture, gl_TexCoord[0].st);

相反,如果我gl_FragColor = vec2(1.0, 0.0, 0.0, 1.0);正确地写了一个全红色的纹理作为输出。

如果我注释掉该glUseProgram()语句,则代码可以正常工作,并且 fboB 中的纹理是 fboA 中纹理的精确副本。

为什么会发生这种情况?我错过了什么吗?

0 投票
1 回答
4442 浏览

opengl - FBO Blitting 不工作

我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。

你能看出我遗漏了什么吗?我认为问题可能出在glFramebufferRenderbuffer电话上。我尝试将第一个 arg 切换为GL_READ_FRAMEBUFFER但它没有修复。

我检查glGetError并没有错误。如果我设置错误,肯定会失败并给我INVALID_ENUMINVALID_OPERATION帮助我缩小问题范围。

我使用此代码的方式是,为了启用多重采样,我必须更改的是在绘制时绑定 multi_fbo,然后调用将绑定和 blit 的解析函数。之后,我的 fbo 纹理(当我直接渲染到它时效果很好)现在应该包含多重采样渲染。但它只是黑色的。我还调用glEnable(GL_MULTISAMPLE)了初始化代码的另一部分。

我现在将尝试将非多重采样纹理blit 到另一个纹理以确保它有效。希望这将帮助我缩小我搞砸的地方。

更新:事实证明,将常规 FBO 复制到另一个相同的 FBO(两者都具有附加到颜色附件 0 的纹理)会产生相同的黑屏。blit 根本行不通。

同样奇怪的是,一旦我尝试进行 blit,然后绘制 SOURCE fbo 的纹理,它仍然是全黑的。这就像试图破坏一切一样。

有人知道或有任何 FBO blitting 代码吗?我找不到任何东西,但我知道人们已经得到了多重采样 FBO 的工作。

以下是您可以提供帮助的方法:如果您有glBlitFramebuffer任何时候调用的代码,我希望看到其他调用来设置该操作。一旦我调用它,我似乎什么也得不到,除了黑色缓冲区和纹理。

更新:Blit to backbuffer 工作,即使是多重采样!这当然不需要任何设置,因为我只是绑定了帧缓冲区 0。所以问题似乎是我设置了 FBO,它有一个应该被 blitted 的纹理附件。

0 投票
1 回答
5610 浏览

opengl - 如何在多采样纹理上渲染帧缓冲区对象?

我目前有一个使用多个通道的渲染引擎,其中图像的各个部分在纹理上渲染,然后使用着色器组合。它有效,现在我想激活多重采样。

我在这里( http://www.opengl.org/wiki/Framebuffer_Object_Examples#MSAA )读到,使用 OpenGL,您不能将 a 附加GL_TEXTURE2D_MULTISAMPLE到帧缓冲区对象。

似乎使用多重采样并且仍然可以访问结果作为纹理的一种方法是使用多重采样渲染缓冲区,然后将结果复制到多重采样纹理中。

我的问题是:前进的最佳方式是什么?

  • 是否可以在渲染缓冲区中渲染并使用我的着色器中的输出,而不复制到纹理中?
  • 我是否应该将缓冲区的内容复制到纹理中,然后使用它?
  • 还有其他更好的解决方案吗?

谢谢。

0 投票
2 回答
314 浏览

opengl-es - 更大的 GLSL 片段输出,没有多个缓冲区附件

有什么办法可以排放更多,例如。来自 GLSL 片段着色器的 4 个字节,如果实现不支持多个 FBO 缓冲区附件或“深”缓冲区格式?

例如,在使用 WebGL 或 OpenGL ES 时,如果必须在多个通道中重复部分计算以获得更多输出通道,则每个片段被限制为 RGBA 输出会使复杂的计算效率极低。

0 投票
1 回答
954 浏览

opengl - 帧缓冲区对象,渲染和将纹理传递给着色器时遇到问题

我正在尝试将一个简单的场景渲染到帧缓冲区,然后将其作为纹理传递给我的着色器。但是,我渲染的对象显示为黑色。我无法弄清楚我做错了什么。

在下面的代码中,我创建了一个 FBO 并为其附加了深度缓冲区和纹理。

下面的代码是我的渲染方法。我已经尝试过使用 tga 纹理,并且效果很好。

我已经尝试过 .tga 纹理并且着色器运行良好。我正在使用 glfw 和 glew。我也不确定 glSomeFunction 和 glSomeFunctionEXT 之间的区别

0 投票
0 回答
222 浏览

opengl - 来自 FBO 的 Opengl 纹理(无论是否使用 mimap)

在使用 FBO 时我必须遗漏一些明显的东西:

我在应用程序开始时调用 TMyForm::Init() 一次:

在 Draw() 函数中,我将缓冲区发送到卡片(渲染场景正常)和预览窗口(全黑或全白,取决于我切换回默认窗口上下文还是 fbo 上下文):

所以我的问题是“第 2 部分”没有做我希望的事情:将 fbo 内容纹理化到当前窗口。我尝试更改“glTexCoord2d”但没有成功。

0 投票
1 回答
1701 浏览

android - OpenGL ES 1.1:如何替换 glBlendFuncSeparate?

我的问题和这里差不多

如果 glBlendFuncSeparate 对我可用,这也是答案:

但是,由于我需要为 MALI-400MP(Samsung Galaxy Nexus S II)提供支持,我不能使用 glBlendFuncSeparate(GL_OES_blend_func_separate 扩展不存在)。

建议使用 glColorMask,但如何正确使用它?有没有其他方法可以做到这一点?

0 投票
2 回答
1425 浏览

opengl - 我自己的 z 缓冲区

如何制作自己的 z 缓冲区以正确混合 Alpha 通道?我正在使用glsl。我只有一个想法。这是使用 2 个“缓冲区”,其中一个存储深度分量和另一种颜色(带有 alpha 通道)。我不需要在我的程序中访问缓冲区。我不能使用统一数组,因为 glsl 对统一变量的数量有限制。我不能使用 FBO,因为没有定义有时写入和读取帧缓冲区的行为(并且不在任何卡上工作)。

我该如何解决这个问题?!

或者如何从 glsl 读取实际的实时 z-buffer?(我的意思是对于每个片段着色器调用 z-buffer 必须更新)