问题标签 [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 投票
0 回答
1053 浏览

c++ - 几何着色器和深度 FBO

当涉及几何着色器时,是否有关于渲染到 FBO 的特殊规则?

上下文:我正在尝试在场景中实现阴影映射,其中包括以不同方式渲染的不同类型的对象:网格,通过 VBO 和着色器以标准方式渲染 Point sprite 粒子,使用顶点和片段着色器 Quad 粒子渲染,作为点发送,但在几何着色器中扩展为四边形

我正在以标准方式进行阴影映射,这涉及创建深度 FBO 并从灯光的角度向其渲染对象的深度。网格和点精灵工作正常,但几何着色器四边形粒子的深度没有被渲染到 FBO。

是标准(非 FBO)深度缓冲区。注意前景中的大圆形颗粒。

是呈现给 FBO 的相同视图。请注意,仅绘制了网格和点精灵粒子的深度。

我的 FBO 设置如下(它基于 OpenGL 4 Shading Language Cookbook 的第 7 章):

应该渲染四边形粒子深度的着色器是:

当然,深度测试是启用的。我已经通过 gDebugger 运行它,它根本无法检测到任何错误。我已经尝试告诉片段着色器实际绘制东西,但这也没有什么区别(没有尝试将不同的值写入 gl_FragDepth)。

点精灵粒子和四边形粒子之间的唯一区别是几何着色器的使用。我正在同时渲染两者并使用相同的统一值(相同的转换矩阵),并且我已经运行 gDebugger 来确保。

我已经在一台装有驱动程序版本 8.17.13.142 的 nVidia GTX 560 Ti 和另一台装有 Radeon Mobility HD 5650 的计算机上对此进行了测试。我在两者上都得到了相同的结果。

我是否犯了任何明显的错误,或者我应该知道一些具体的事情?

0 投票
1 回答
8785 浏览

ios - OpenGL ES 到 iOS 中的视频(使用 iOS 5 纹理缓存渲染到纹理)

你知道 Apple 的带有CameraRipple效果的示例代码吗?好吧,在openGL完成了水的所有凉爽效果之后,我正试图将相机输出记录在一个文件中。

我已经用 glReadPixels 完成了,我在其中读取了 void * buffer 中的所有像素,创建 CVPixelBufferRef 并将其附加到 AVAssetWriterInputPixelBufferAdaptor,但它太慢了,因为 readPixels 需要大量时间。我发现使用 FBO 和纹理现金你可以做同样的事情,但速度更快。这是我在 Apple 使用的 drawInRect 方法中的代码:

它录制了一段视频,而且速度很快,但视频只是黑色的,我认为 textureCashRef 不是正确的,还是我填错了。

作为更新,这是我尝试过的另一种方式。我肯定错过了什么。在 viewDidLoad 中,设置 openGL 上下文后,我执行以下操作:

然后在 drawInRect: 我这样做:

然而它在渲染纹理上因 bad_acsess 而崩溃,它不是零,而是 0x000000001。

更新

使用下面的代码,我实际上设法提取了视频文件,但有一些绿色和红色闪烁。我使用 BGRA pixelFormatType。

这里我创建了纹理缓存:

然后在 drawInRect 我称之为:

我知道我可以通过不在这里做所有这些事情来优化它,但我一直想让它工作。在 cleanUpTextures 中,我使用以下命令刷新 textureCache:

RGBA 的东西可能有问题,或者我不知道,但它似乎仍然有点错误的缓存。

0 投票
1 回答
1177 浏览

opengl-es - LibGDX - 使用 FBO 将 Sprites 纹理化

我正在使用 LibGDX 开发一个简单的绘画应用程序,但我无法使用我正在使用的设置正确“绘画”它。我尝试这样做的方法是使用精灵进行绘制,并在适当的时候使用 LibGDX 的 FBO 命令将这些单独的精灵添加到背景纹理中。

我遇到的问题与混合有关,因为当精灵被添加到我正在构建的这个纹理中时,精灵的任何透明像素都将显着变亮,这些像素位于先前绘制的像素之上,这显然看起来不太好。以下是结果的样子,使用绿色>红色渐变的圆圈作为“画笔”。顶行现在是背景纹理的一部分,而底行仍然是纯精灵绘制的形式。

http://i238.photobucket.com/albums/ff307/Muriako/hmm.png

基本上,每个精灵的透明区域都会照亮它们下面的任何东西,我需要让它们完全透明。我弄乱了许多不同的混合模式组合,但找不到更好的组合。例如 GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA 没有这个问题,但是每个精灵的透明像素似乎在 alpha 中降低了,甚至从下面的图层中获取了一些颜色,这看起来更烦人。

我很乐意根据要求发布任何代码片段,但是自从我开始尝试解决这些问题以来,我的代码变得有些混乱,所以我宁愿只在必要时提供必要的部分。

0 投票
1 回答
321 浏览

opengl-es - Opengl-es 1.1 改变FBO上的像素数据

有没有办法获取 FBO 像素数据,然后:快速对其进行灰度化并再次将图像取回该 FBO?

0 投票
1 回答
683 浏览

opengl-es - Opengl-es 1.1灰度FBO

我有 FBO,我只是将它加载到纹理和正交 (2D) 网格中。如何灰度化我的 FBO 纹理?

0 投票
1 回答
3038 浏览

opengl - LibGDX FrameBuffer 混合

这里有一些简单的背景知识,我刚开始使用 LibGDX 框架进行 Android 游戏开发的第一次尝试。我正在尝试通过放置精灵来使用他们的 FrameBuffer 类构建纹理,并且我想将此纹理用作一种逐级动态/随机背景。

不幸的是,当精灵被添加到 FrameBuffer 时,它们似乎会完全覆盖它们下面的任何东西。一般来说这很好,但是我将使用的许多精灵都有半透明像素,并且因为这些透明像素会覆盖它们下面的任何实心像素,它会显示为基本背景颜色并产生非常不愉快的效果.

换句话说,从多个精灵中创建一个实体纹理并将它们层叠在一起而不完全移除较低像素(至少如果顶部像素是半透明的)的最佳方法是什么?

在这方面进行了几个小时的试验和搜索,我不知所措。谢谢你的时间!

- - - 编辑 - - -

这是用于将精灵添加到 FBO 的代码。它非常缺乏,因为目前我只是在随机位置添加一个精灵以进行测试。我很乐意根据要求发布任何代码,但是现在整个设置都非常简约,可以解决这个问题。

0 投票
0 回答
1488 浏览

opengl - 使用 FBO 渲染 YUV 数据

我能够使用着色器在屏幕上渲染 YUV 图像。为了提高性能,我想使用 FBO。但我做不到。

我的初始化代码如下

我使用下面的代码渲染我的框架

我只渲染 Y 数据的片段着色器如下

0 投票
0 回答
412 浏览

android - Andengine 在游戏暂停时从 RenderTexture 获取像素

在这种情况下,我需要保存 a 中的像素RenderTexture并将它们存储到 a Bitmap当游戏活动暂停(按下主页按钮),并使用保存的位图恢复渲染纹理。

目前我正在做以下事情:

在调用渲染纹理的引擎中onPause注册 a ,然后调用 R方法,强制重绘然后休眠 1 秒,确保绘制会发生,最后调用.Draw HandlergetBtimap()enderSurfaceView.reqestRender()Threadsuper.onPause()

我认为这不是一个好方法:)。

问题是RenderTexture.getBitmap()必须在渲染线程中调用glReadPixels(),因为调用需要正确执行 GL 上下文。

那么在 GL 上下文被破坏之前有没有得到通知?

或者有关如何以不同方式完成此操作的任何建议?

0 投票
1 回答
6875 浏览

opengl-es-2.0 - 用于 FBO 渲染的 OpenGL ES2.0 屏幕外上下文

我想使用 FBO 进行屏幕外渲染(在没有任何 WS 的控制台环境中)。我知道有必要创建一个 OpenGL 上下文,并且至少为任何操作创建一个虚拟窗口,因此我进行了以下初始化:

这种类型的初始化适用于目标系统,但如果我在 FBO 中画了一些东西,并且在读回它(getReadPixels)后总是只能得到一个黑色图像。我在 X11 上尝试了相同的代码,它(已经)在 eglCreateWindowSurface 调用上失败并出现错误:EGL_BAD_NATIVE_WINDOW WORKS,但是如果我将一个真正的 X11window 本机窗口处理程序传递给这个调用,它就可以工作(这种情况下我可以读回有效的渲染图像还)

请澄清我应该使用哪种类型的表面进行 FBO 渲染?或者我做错了什么?

其余绘制代码: //init 并启动 opengl es shanders Shaders_Init();

提前致谢!!!!!问候, 盖萨

0 投票
0 回答
652 浏览

opengl - GLSL 中多通道、多 RT 渲染的奇怪问题

我看到一个多通道、多 RT 乒乓渲染的奇怪问题

我正在使用 3 个着色器和一个 FBO,在任何阶段都没有错误。我使用的是opengl 4,所以我没有使用glBegin/glEnd,我使用我自己的矩阵进行转换,我使用顶点缓冲区进行渲染

该测试的总体思路是为三个单独的 fbo 附件渲染 3 种不同的颜色(我意识到在第一遍中两次渲染 vbo 效率不高,但这只是为了帮助我理解其他来源中的问题)然后将一组单独的纹理绑定到 fbo 并使用第一组作为采样器。最后一步是将结果混合到后台缓冲区中

奇怪的是,当第一个应该是红色而第二个应该是绿色(因为这些值来自第二个着色器)时,两个四边形的输出都显示为红色。

如果我将第二个着色器中的 SamplePix 函数更改为始终从第二个采样器中获取,则两者都显示为绿色,如果从第三个采样器中查找,则全部显示为黄色,但它似乎只能从一个采样器中读取。

现在我似乎无法解释为什么我可以从每个采样器中读取,但循环似乎没有正确查找(在着色器 2 中)

此外,如果我切换到渲染在着色器 2 中采样的纹理,我会在第二遍中看到黑色四边形(图 2)

希望有人可以对这个问题有所了解。(我也尝试在第一次通过后添加一个同步围栏对象,但这并没有什么不同)

红色的

纹理样本:

特克斯