问题标签 [render-to-texture]

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 回答
2102 浏览

opengl - 为什么即使只请求 1x1 mipmap 级别,glGetTexImage 也会传输所有 mipmap 纹理?

我在 FBO 中渲染到浮点纹理,并且需要 CPU 上该纹理的所有像素的平均值。所以我认为使用 mipmapping 来计算 1x1 mipmap 的平均值非常方便,因为我节省了 CPU 计算时间,我只需要将 1 个像素传输到 CPU,而不是 1024x1024 像素。

所以我使用这条线:

glGetTexImage(GL_TEXTURE_2D, variableHighestMipMapLevel, GL_RGBA, GL_FLOAT, fPixel);

但尽管我只特别要求最高的 mipmap 级别,它的大小始终为 1x1 像素,但完成该行代码所需的时间取决于纹理的级别 0 mipmap 的大小。这对我来说毫无意义。例如,在我的测试中,1024x1024 基础纹理的这条线比 32x32 基础纹理花费的时间大约长 12 倍。

fPixel 中的结果是正确的,只包含想要的像素,但时间清楚地表明整个纹理集被转移,这对我来说是主要的原因,因为转移到 CPU 显然是我的瓶颈。

我使用 Win7 和 opengl 并在 ATI Radeon HD 4800 和 GeForce 8800 GTS 上进行了测试。

有谁知道这个问题,或者有一种聪明的方法只将最高 mipmap 的一个像素传输到 CPU?

0 投票
2 回答
3369 浏览

c++ - 在 OpenGL 中创建和混合动态纹理

我需要将球体渲染到纹理(使用帧缓冲区对象(FBO)完成),然后将该纹理与后台缓冲区进行 alpha 混合。到目前为止,除了在每一帧开始时清除它之外,我还没有对纹理进行任何处理。

我应该说我的场景只包含一个空旷空间中的行星,球体应该出现在行星旁边或周围(现在有点像月亮)。当我将球体直接渲染到后台缓冲区时,它会正确显示;但是当我执行将其渲染为纹理然后将该纹理与后台缓冲区混合的中间步骤时,球体仅在它位于行星前面时才会显示,不在前面的部分只是“切断” “:

被行星边缘切断的球体

我使用glutSolidSphere绑定到 FBO 的 RGBA8 全屏纹理渲染球体,确保每个球体像素接收 1.0 的 alpha 值。然后,我将纹理传递给片段着色器程序,并使用此代码在 alpha 混合时将全屏四边形(纹理映射到其上)渲染到后缓冲区:

这是着色器代码(取自用 Cg 编写的 FX 文件):

我什至不知道这是深度缓冲区的问题还是 alpha 混合的问题,我尝试了很多启用和禁用深度测试(将深度缓冲区附加到 FBO)和 alpha 混合的组合。

编辑:我尝试将一个空白的全屏四边形直接渲染到后台缓冲区,甚至在地球边缘裁剪。出于某种原因,启用渲染四边形的深度测试(即删除线glDisable(GL_DEPTH_TEST)glEnable(GL_DEPTH_TEST) in the code above)解决了这个问题,但是现在除了行星和球体之外的所有东西都显示为白色:

白色不正确的白色背景的球体

我确保(并且可以确认)纹理的 alpha 通道在每个像素上都是 0,但球体除外,​​所以我不明白可以在哪里引入白度。(也仍然有兴趣解释为什么启用深度测试会产生这种效果。)

0 投票
1 回答
13139 浏览

directx-11 - 在directx 11中一次渲染到多个纹理

我正在尝试使用 C++ directx 11 SDK 一次性渲染两个纹理。我想要一个纹理包含结果图像的每个像素的颜色(我通常在渲染 3D 场景时在屏幕上看到的颜色),另一个纹理包含每个像素和深度的法线(3 个浮点表示正常,1 个浮点表示深度)。现在,我能想到的是创建两个渲染目标,并将第一遍渲染为颜色,第二遍将法线和深度分别传递给每个渲染目标。但是,这似乎是在浪费时间,因为我可以在第一遍中获得每个像素的颜色、法线和深度的信息。那么有没有办法用像素着色器以某种方式输出两个纹理?

任何帮助,将不胜感激。

PS我正在考虑像素着色器中的RWTexture2D或RWStructuredBuffer。一点背景知识:我需要这两个图像在计算着色器中进行进一步处理。这带来了同步的一个附带问题:由于像素着色器(与计算着色器不同)一次写入每个像素,我怎么知道像素着色器何时完成并告诉计算着色器开始图像后处理?

0 投票
1 回答
3671 浏览

opengl - lwjgl 并渲染到纹理

我需要能够渲染到纹理,然后将该纹理绘制到全屏四边形。通过公然复制 lwjgl 教程,我能够制作一个带纹理的移动四边形,但我不能让它渲染到纹理:

以下是我添加行以渲染到纹理的代码部分:

设置 FBO ////////// 这是我为帧缓冲区添加代码的地方 /////////////

这是渲染代码: ////////// 这些行是新的,添加到渲染到帧缓冲区 ///////// GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboID); GL11.glViewport(0, 0, WIDTH, HEIGHT); ///////// 这是原始的渲染周期代码,我想把它放到 FBO /////// GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

当我运行此代码时,我得到一个黑色矩形大约一秒钟,控制台告诉我帧缓冲区已完成,然后我得到一个关于渲染周期中无效操作的 openGL 错误,它崩溃了。我认为问题出在我的全屏四码代码中,但我不知道如何正确处理。我是否需要为渲染到屏幕创建新的着色器程序?我是否需要删除 glBegin(GL_QUADS) 并使用顶点缓冲区?

0 投票
0 回答
756 浏览

iphone - OpenGL ES - glReadPixels 与 TextureCached

我需要从 OpenGL ES 2.0 的帧缓冲区中读取像素数据。我知道这可以通过 glReadPixels 轻松完成,但是从 iOS 5 开始,我们可以使用 TextureCached 对象来加快阅读速度。

我已经实现了 Brad Larson 提出的解决方案(我将永远感谢他,我认为他在社区分享这么多知识方面做得很好......)在 iPhone OpenGL ES 2.0 中替代 glReadPixels 的速度更快

一切似乎都正常,我得到了正确的数据,如果我将它与 glReadPixels 进行比较,数据是相同的。当我测量这两种可能解决方案的性能(检索数据时消耗的时间)时,我的问题就出现了。

这是我的结果:

(帧缓冲区和纹理大小320x480像素)

GPUImageProcessingDemo[1252:707] glReadPixels 2750 us

GPUImageProcessingDemo[1252:707] 纹理读取 1276 us

GPUImageProcessingDemo[1252:707] glReadPixels 2443 us

GPUImageProcessingDemo[1252:707] 纹理读取 1263 us

GPUImageProcessingDemo[1252:707] glReadPixels 2494 us

GPUImageProcessingDemo[1252:707] 纹理读取 1375 us

这似乎很有趣,因为它几乎是使用 glReadPixels 所需时间的一半。问题是当我将纹理大小更改为更大一点时,我会得到以下结果:

(帧缓冲区和纹理大小480x620像素)

GPUImageProcessingDemo[1077:707] glReadPixels 2407 us

GPUImageProcessingDemo[1077:707] 纹理读取 2842 us

GPUImageProcessingDemo[1077:707] glReadPixels 2392 us

GPUImageProcessingDemo[1077:707] 纹理读取 3040 us

GPUImageProcessingDemo[1077:707] glReadPixels 2224 us

这有意义吗?还是我应该期望总是得到更好的结果?

0 投票
2 回答
2407 浏览

c++ - 如何使用 glReadPixels() 从 FBO 返回调整大小的图像?

很快:我需要一种快速的方法来调整缓冲区图像的大小,然后将像素返回给我以将它们保存到文件等。

目前我首先使用 glReadPixels(),然后我自己通过像素来使用我自己的调整大小函数调整它们的大小。

有什么方法可以加快调整大小,例如让 OpenGL 为我完成这项工作?我想我可以在启用 miplevel 和 mipmapping 的情况下使用 glGetTexImage(),但正如我之前注意到的,该功能在我的 GFX 卡上存在错误,所以我无法使用它。

我只需要一个 miplevel,它可以是 1 到 4 之间的任何值,但不是全部,以节省一些 GPU 内存。那么是否可以只生成一个所需大小的 miplevel?

注意:我不认为我可以使用多重采样,因为我需要对模板测试进行像素精确渲染,所以如果我用多重采样渲染它,它会产生模糊的像素,并且它们会因模板测试和遮罩而失败,结果将不正确(AFAIK) . 编辑:我只想缩放颜色(RGBA)缓冲区!

0 投票
1 回答
1596 浏览

opengl - 将整数纹理附加到帧缓冲区

我正在尝试将具有内部格式的纹理附加GL_R32UI到帧缓冲区,以用作 ID 缓冲区。但是,即使它是唯一的附件,也会glCheckFramebufferStatus不断出现。GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

这对我来说很奇怪,因为 OpenGL 4.2 规范似乎声明这GL_R32UI是 OpenGL 实现在附加到帧缓冲区时必须支持的格式之一。我怀疑这是驱动程序错误。我是对的,还是谁能告诉我我忽略了什么?

0 投票
3 回答
2949 浏览

three.js - THREE.js:从 THREE.WebGLRenderTarget 获取数据

ATHREE.Texture可以用作材质中的贴图,并具有称为“图像”的属性。ATHREE.WebGLRenderTarget可以用作材质中的贴图,但没有称为“图像”的属性。

我将如何从 a 中检索纹理数据WebGLRenderTarget?我想将它保存到一个文件中(或者,如果不可能的话,作为一个字节数组)。

0 投票
1 回答
867 浏览

iphone - iphone - Cocos2d 益智游戏,如何解决棋子位置?

我在使用 cocos2d 的第一个应用程序方面需要帮助,我正在尝试开发益智游戏,游戏有图像片段并且它是透明背景,我需要将这些片段匹配到正确的位置/位置!我的问题是我不知道如何在图像上找到该作品的确切位置/位置?有人能帮帮我吗?

试图制作这样的游戏: 动物拼图

和拼图图像和这样的碎片: 拼图图像和碎片

0 投票
1 回答
2443 浏览

opengl - 带有立方体贴图纹理的 glFramebufferTexture2D

我正在尝试将渲染到纹理概念与立方体贴图纹理一起使用,但不知何故,纹理并未在绘制调用中应用于几何。这是我的代码

我已经验证帧缓冲区绑定是否完整。draw_cube() 也可以按预期正确绘制几何图形。当我删除 FBO 并向 glteximage2D() 提供数据时,它会正确地将立方体贴图纹理应用于 draw() 调用中的几何体。宽度高度与 draw_cube 调用中设置的视口相同。

上面的代码有什么问题?