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

directx - 如何在 DirectX 11 中渲染纹理并将纹理传输到常规内存?

我想利用 DirectX 加速将图像渲染到纹理。但是,我不想在屏幕上显示该图像,而是想将该图像作为位图返回到常规内存中,以便对结果进行任何处理。如何将一些纹理转移到常规内存?我正在使用 DirectX 11。

0 投票
3 回答
1844 浏览

c# - Texture2D 渲染图像

用图像填充 Texture2D 的最快方法是什么?

在 /Images/image.png 我有所需的图像。

我现有的代码只是用白色填充纹理。我怎样才能让它渲染图像?

也许我做错了,但是在屏幕上动态显示图像的最简单/最快的方法是什么?

更新

我将代码更改为使用 ContentManager。

抛出“找不到文件”。

抛出“加载“\Images\block.png”时出错。无法打开文件。”

0 投票
1 回答
2213 浏览

directx - 渲染到纹理,但如何使用 DirectX 以透明度保存它?

我正在使用 DirectX 11 SDK 并为纹理渲染一些东西(它的工作原理)。比使用 D3DX11SaveTextureToFile 将输出保存到 PNG 纹理。一切正常,但我没有得到透明度。

我想让背景(没有渲染任何元素的空间)透明。而不是这个,我得到了一些背景。

我试图将float ClearColor[4]forClearRenderTargetView函数更改为,{ 0.0f, 0.0f, 0.0f, 1.0f }因为我认为最后一个是 alpha 和1.0f给我透明度,但这对我不起作用(对于 0.0f 也是如此)。

这是我的代码中可能有用的部分:

混合状态(我认为这很好,它们适用于在屏幕上渲染透明元素 - 当然监视器的屏幕总是有一些“背景”,PNG文件没有):

和:

0 投票
1 回答
753 浏览

opengl - OpenGL深度纹理伪影

我正在为我的小 3d 引擎实现阴影映射。但是,深度纹理中似乎存在伪影,可以通过使用纹理并观察阴影,或者在四边形上绘制深度纹理来看到。

这是在四边形上绘制深度纹理时的样子:

是的,那些白色的小矩形不应该在那里。

那么,可能是什么原因造成的呢?

打开glfw窗口:

创建深度帧缓冲区和纹理:

渲染到深度纹理:

0 投票
1 回答
1850 浏览

directx - Direct3D 11 可以进行仅离屏渲染(无交换链)吗?

是否可以仅使用 Direct3D 11 渲染到纹理,即不创建交换链且不创建任何窗口?我已经尝试过了,我所有的 API 调用都成功了。唯一的问题是我从临时纹理下载的图片是黑色的。

我终于设法使用 PIX 捕获了完整的流(Parallel Nsight 似乎根本不起作用)。PIX 显示我的渲染目标也是黑色的,尽管我将其清除为蓝色。

我打算做什么有可能吗?如果是这样,一个人会怎么做?

0 投票
0 回答
2925 浏览

c++ - 渲染到纹理时的 DX11 Alpha 混合

最终编辑:

已解决...只需要深入了解 Alpha 混合的工作原理。我应该有:oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ZERO; ...设置为 D3D11_BLEND_ONE 以保留 alpha。

当渲染到后台缓冲区时,一旦颜色混合正常,就不会注意到问题,这就是最终输出。当渲染到纹理时,同样的事情也适用,然后将纹理渲染到后台缓冲区,不正确的 alpha 在将纹理错误地混合到后台缓冲区中起作用。

然后我遇到了另一个问题,alpha 似乎正在下降。这是因为颜色混合了两次,例如...

渲染成纹理...

现在...

渲染到后台缓冲区...

为了解决这个问题,在将纹理渲染到后台缓冲区时,我使用相同的混合状态,但将 SrcBlend 更改为 D3D11_BLEND_ONE,这样颜色就不会混合两次。

希望这可以帮助其他有类似问题的人....

编辑结束

为了提高性能,我试图渲染一串永远不会变成纹理的文本,以节省每次渲染每个单独的字符。

由于我严格使用 2D 渲染,因此我在启用 Alpha 混合的同时禁用了深度和模板测试。

问题是似乎没有发生任何 alpha 混合,最后绘制的任何内容都会用自己的数据覆盖当前像素......没有混合。

我使用一个我不会改变的混合状态。渲染到后台缓冲区时,混合工作正常。将最终纹理渲染到后台缓冲区时,混合也可以正常工作。只是当我渲染到混合似乎失败的纹理时。

以下是我设置单一混合状态的方法:

在渲染到纹理时,我是否缺少任何额外的步骤来启用混合?

编辑:如果我将 AlphaToCoverageEnable 设置为 true,它会混合,但看起来很糟糕。这至少证实了它使用相同的混合状态......只是根据渲染到后缓冲区或纹理时的不同工作方式:/这是我的纹理描述......

编辑:这是一些可视化... 文本

  1. 渲染到后备缓冲区 - 启用 AlphaBlending。
  2. 渲染到纹理 - 启用 AlphaBlending。
  3. 渲染到后备缓冲区 - 禁用 AlphaBlending。
  4. 取自字体文件的字母 T

*当禁用 AB 渲染时,字母完全匹配(比较 4 和 3)

*在启用 AB 的情况下渲染到后台缓冲区时,字母渲染略微(几乎不明显)褪色但仍然混合(比较 4 和 1)

*在启用 AB 的情况下渲染到纹理时,字母渲染得更加明显,而根本没有混合。(比较 4 和 2)

不知道为什么颜色会在启用 alpha 混合的情况下被洗掉......但也许它是一个线索?

编辑:如果我清除渲染目标纹理说...... 0.0f,0.0f,1.0f,1.0f(RGBA,蓝色)......这是结果: 在此处输入图像描述

只有 alpha > 0.0f & < 1.0f 的像素与颜色混合。另一个线索,但我不知道如何解决这个问题......

0 投票
1 回答
2236 浏览

opengl - glClear() 在 Intel HD 4000 (GL 4.0) 上给出 GL_OUT_OF_MEMORY 但在 GeForce (GL 4.2) 上没有给出……为什么?

现在,这是一个非常奇怪的行为。

TL;DR - 在渲染到纹理设置中,在调整窗口大小(帧缓冲区 0)时,只有下一次调用glClear(GL_COLOR_BUFFER_BIT)绑定帧缓冲区 0(窗口的客户区)才会给出GL_OUT_OF_MEMORY,仅在两个之一上GPU,但是渲染仍然正确且正确地进行。

现在,所有坚韧不拔的细节:

所以这是在带有两个 GPU 的 Vaio Z 上(可以通过机器上的物理切换按钮切换到):

  1. OpenGL 4.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2(GLSL:4.20 NVIDIA 通过 Cg 编译器)

  2. OpenGL 4.0.0 - Build 9.17.10.2867 @ Intel Intel(R) HD Graphics 4000 (GLSL: 4.00 - Build 9.17.10.2867)

我的程序在使用 GLFW 64 位的 Win 7 64 位下的 Go 1.0.3 64 位。

我有一个相当简单直接的渲染到纹理“迷你管道”。首先,使用最简单的着色器(没有照明,什么都没有,只是纹理三角形网格,它们只是一些立方体和平面)将普通 3D 几何图形渲染到一个帧缓冲区,该帧缓冲区具有作为深度/模板附件的深度/模板渲染缓冲区和一个texture2D 作为颜色附件。对于纹理,所有过滤都被禁用,mip-maps 也是如此。

然后,我使用 texelFetch(tex, gl_FragCoord.xy, 0) 从所述帧缓冲区纹理(颜色附件)中采样渲染一个全屏四边形(实际上是一个“超大”全屏 tri),因此不使用包装。

当我强制核心配置文件和不强制使用核心配置文件时,两个 GPU 都可以很好地呈现这一点。没有为此报告任何 GL 错误,所有渲染也都按预期进行。除非我在使用 Intel HD 4000 GPU 的 GL 4.0 渲染器(在核心配置文件和 Comp 配置文件中)时调整窗口大小。只有在这种情况下,单个调整大小将在帧缓冲区 0(屏幕)上的下一个 glClear(GL_COLOR_BUFFER_BIT) 调用之后直接记录 GL_OUT_OF_MEMORY 错误,但仅在调整大小后记录一次,而不是在每个后​​续循环迭代中。

有趣的是,我什至实际上并没有对调整大小进行任何分配!我暂时禁用了窗口调整大小时发生的所有逻辑——也就是说,现在我完全忽略了窗口调整大小事件,这意味着 RTT 帧缓冲区及其深度和颜色附件分辨率甚至没有更改/重新创建。这意味着下一个 glViewPort 仍将使用与第一次创建窗口和 GL 上下文时相同的尺寸,但无论如何错误发生在 glClear() 上(不是之前,只是之后,只有一次 - 我已经双重和三重检查了)。

这会是驱动程序错误,还是我在这里做错了什么?

0 投票
0 回答
1338 浏览

opengl - Opengl - 解除绑定帧缓冲区清除附加纹理

我在渲染纹理以供以后使用时遇到了一些问题。目前,我正在生成一个帧缓冲区对象,创建两个纹理(一个 RGB 和一个 DEPTH_COMPONENT),附加两个纹理,检查状态是否正常,然后在绑定帧缓冲区时进行绘制。在 gDEBugger 内部,我可以看到所有东西都被贴图绘制得很好。

但是,当我尝试绑定回默认缓冲区( glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) )时,纹理会被清除为零,并且绘制到纹理的所有内容最终都会回到静态缓冲区中。此外,我还尝试将另外两个空纹理绑定到帧缓冲区,并且所有内容都移动到新纹理。

这是之前之后

有任何想法吗?

编辑:删除代码。

TL;DR:问题在于使用 EXT(例如 glBindFramebufferEXT 而不是 glBindFramebuffer 等)。

0 投票
2 回答
1429 浏览

android - OpenGL ES 无法使 LUMINANCE FBO 在 Android 中工作

我正在使用帧缓冲区在视频渲染器上进行一些后期处理着色器。其中一个着色器的查找非常密集,因此我想更改为仅亮度的帧缓冲区以加快速度。我尝试在初始化时将 glTexImage2D 调用从 RGBA 更改为 LUMINANCE,但是当我尝试在“onDrawFrame”中附加缓冲区时出现错误。

问题是我已经从示例中破解了代码并且不太了解它所做的一切。一方面,我还创建了一个深度附件,因为我正在渲染视频,所以我不需要任何深度信息,但我不知道我是否可以禁用它。无论如何,这是我在 onSurfaceCreated 中对 FBO 的初始化:

这是在 onDrawFrame 中附加缓冲区的代码:

有人有什么建议吗?我也可以放弃深度缓冲区组件还是强制性的

0 投票
1 回答
630 浏览

opengl - 如何使用纹理作为深度附件?

我有一个带有多个渲染目标的帧缓冲区。它们都是纹理而不是渲染缓冲区。如何使用纹理A组件作为深度附件?我想使用默认的深度测试。RGBA