问题标签 [rendertarget]
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.
c# - 使用与开始时相同的参数重新启动 SpriteBatch
是否可以接收已经调用 Begin() 的传入 SpriteBatch,调用 End() 因为您想更改 RenderTarget,然后使用最初传入的相同参数再次调用 Begin() ?
c# - 如何在 Unity 中从 RenderTexture 访问原始数据
问题的简短版本
我正在尝试访问 Unity 中的 RenderTexture 的内容,我一直在使用 Graphics.Blit 使用自己的材质进行绘制。
我的材质成功地将一些 yuv 图像转换为 rgb,我通过将其分配给 UI 元素的纹理进行了测试。结果是屏幕上可见的正确 RGB 图像。
但是,我还需要 QR 码扫描仪的原始数据。我正在这样做,就像我会从这里解释的那样从相机访问它。在那里的评论中提到,也可以从填充了 Graphics.Blit 的 RenderTexture 中提取。但是当我尝试这样做时,我的纹理只包含 205 的值。这是我在 Update 函数中使用的代码,直接在 Graphics.Blit 调用之后:
当将此纹理分配给相同的 UI 元素时,它是灰色的并且略微透明。查看图像值时,它们都是 205。
为什么是可能的?我尝试填充的 RenderTexture 和 Texture2D 格式是否存在问题?
完整代码
在下面,我添加了我正在使用的整个代码。变量的名称与我上面使用的名称略有不同,但它们的作用基本相同:
multithreading - 虚幻引擎 4:将 ReadPixels() 适配到多线程框架
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用 RenderTarget->ReadPixels(),但由于 ReadPixels() 的本机实现包含对 FlushRenderingCommands() 的调用,它会阻塞游戏线程,直到图像被保存。作为一项计算密集型操作,这大大降低了我的 FPS。
为了解决这个问题,我正在尝试创建一个可以作为 CaptureComponent 访问相机的专用线程,然后遵循类似的方法。但是由于 FlushRenderingCommands() 块只能从游戏线程中调用,我不得不在没有调用的情况下重写 ReadPixels()(以一种非阻塞方式,灵感来自https://wiki.unrealengine 上的教程。 com/Render_Target_Lookup): 但即便如此,每当保存图像时,我仍面临游戏内 FPS 不稳定的问题(我确认这不是因为实际保存到磁盘操作,而是因为像素数据访问)。我重写的 ReadPixels() 函数如下所示,我希望得到一些关于这里可能出现问题的建议。我不确定是否可以从非游戏线程调用 ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER,以及这是否是我的问题的一部分。
编辑:我注意到的另一件事是,如果我在渲染目标设置中禁用 HDR,口吃就会消失(但这会导致图像质量低下):因此图像的大小可能仍然会阻塞一个似乎是合理的由于我实现它的方式,核心线程的数量。
three.js - 如何调整纹理渲染目标的大小(在窗口调整大小之后)?
我为纹理做了这个,但它不起作用,相同的纹理被拉伸到更大的区域,导致楼梯伪影(我更新了相机、平面、四边形、渲染器)
我已经看过这个 webgl 解决方案,但我不知道如何在 three.js 中执行此操作 - 我尝试使用新纹理重新定义相同的纹理变量,但它导致 webgl 冻结。webl即时更新渲染目标的宽度和高度
qt - 将渲染目标添加到 QOpenGLWidget 的默认帧缓冲区
我想将第二个渲染目标添加到 QOpenGLWidget 的默认帧缓冲区。
原因是我想实现对象拾取并通过将分割掩码渲染到gl_FragData[1]
. 不幸的是,您只能GLuint
从小部件中检索句柄,并且在句柄中没有构造函数,QOpenGLFramebufferObject
也没有其他选项可以检索帧缓冲区。
是否有可能在没有变通方法的情况下将另一个纹理附加到小部件的默认帧缓冲区?
我能想到的唯一两个选择是:
1.
在初始化时使用原生OpenGL调用(我宁愿坚持纯Qt)附加纹理(当然我会存储segmentationTexture
以便以后删除它):
然后在paintGL()
在 OpenGL 绘制调用之前并用于glReadBuffer(GL_COLOR_ATTACHMENT1);
从gl_FragData[1]
. 或者,如果这不起作用,则仅使用本机 OpenGL 代码来生成纹理。
2.
创建第二个帧缓冲区对象,将其绑定,paintGL()
然后使用默认帧缓冲区交换内容glBlitFramebuffer
(以考虑多重采样)以显示渲染,但使用第二个帧缓冲区从gl_FragData[1]
. 但这感觉有点“讨厌”。
qt - 具有自定义帧缓冲区和多个渲染目标的 QOpenGLWidget
与我的另一个问题相关,我正在尝试渲染分割掩码以启用对象拾取。但我无法达到预期的效果。
选项 1 根本不起作用。我无法检索颜色附件 1 的内容,或检查它是否存在(我仅使用本机 OpenGL 调用创建了附件)。
使用这篇文章,我能够通过创建一个带有第二个颜色附件的自定义帧缓冲区来重现图像green.png
和图像,然后将其绑定并绘制到(全部在)。red.png
paintGL()
不知何故,我不得不使用这个人的帧缓冲区创建代码,因为当我自己创建帧缓冲区时,总是有一个警告说toImage called for missing color attachment
,尽管我附加了颜色附件并textures()
调用了帧缓冲区返回了两个对象。然后我尝试在之后插入我的渲染代码
但这仍然导致红色和绿色图像。但是当使用正常的默认帧缓冲区时,代码渲染得很好。我将着色器调整为(用于测试目的的简短版本):
由于我能够生成红色和绿色图像,我假设必须有一种方法可以使用此自定义帧缓冲区检索片段数据。我现在拥有的解决方案是程序的完整(!)副本和另一个专用的片段着色器,其唯一目的是渲染分段,并第二次执行所有 OpenGL 绘制调用。你可以猜到,这是一个有点丑陋的解决方案,虽然风景不是那么大,我的电脑可以轻松处理。有没有人有想法/链接?
javascript - 如何为 THREE.WebGLRenderTarget 渲染和设置自定义 mipmap
我想为 THREE.js 中的效果为渲染帧生成自定义 mip 贴图,但不清楚如何实现。我想在每一帧之后再次重新生成 mip 贴图。
此示例展示了如何为纹理生成 mipmap,但看起来该mipmaps
数组需要一个image
或canvas
标记的句柄,而 renderTarget 纹理没有。理想情况下,我希望能够做这样的事情:
这可能吗?我将如何实现这一目标?
谢谢!
graphics - 为什么需要重新创建 Direct2D 渲染目标?
我正在制作一个游戏引擎,我将同时支持 OpenGL 和 Direct2D。我听说 rendertargets 可以在 EndDraw() 上返回错误,需要重新创建用它创建的每个资源。我想知道这种情况是否经常发生,我是否应该处理该错误以及它是如何发生的。在 OpenGL 中,您不会因此而丢失上下文。那么,是什么导致了渲染目标的丢失,即使有这个问题,我也应该在游戏中使用 direct2D 吗?提前致谢。