问题标签 [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.
arrays - 使用 opengl 将每个像素绘制到后缓冲区或纹理中以显示到屏幕 - 没有 glDrawPixels()
基本上,我有一组数据(流体模拟数据),这些数据是从用户输入(从系统内存中开始)实时生成的。我想将流体的密度作为 alpha 值写入纹理 - 我对数组值进行插值以生成屏幕大小的数组(网格相对较小)并将其映射到 0 - 255 范围。将这些值写入纹理以供使用的最有效方法(ogl 函数)是什么?
其他地方建议的东西,我认为我不想使用(如果我弄错了,请告诉我):
glDrawPixels() - 我的印象是每次调用它都会导致中断,这会使其变慢,尤其是在高分辨率下。
使用着色器 - 我不认为着色器可以接受和处理每帧数组中的数据量(在别处提到他们可能接受的数据量上限太低)
ios - iOS:如何在 GLES2 中渲染到 1 通道纹理
经过数小时的抨击,我现在很确定这是不可能的。
到目前为止,这是我用于渲染纹理的代码(如下);它可以完成工作,但是非常浪费。我只想要一个 8 位通道,可能是 16 位灰度。我不想要一个无用的 RG 和 B 频道。
但是如果我尝试在 glTexImage2D 中切换 GL_RGBA /*GL_ALPHA*/,glCheckFramebufferStatus 会捕获“帧缓冲区不完整”错误:36054 0x8CD6 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
IRC 上的人建议使用 GL_R,但 Xcode 不为此提供自动完成功能,所以看起来它可能是为 GLES 从 GL 中剪除的东西之一
但这似乎真的很奇怪!这是一个移动设备。当然,可以将执行操作所需的位数减少四倍……当然,这将是最后要做的事情之一。
?!?
谁能彻底埋葬这个?是否可以在 GLES2.0 中渲染到单通道纹理?
ios - GLES2.0 RTT(渲染到纹理):如何在 GLES2 中枚举目标纹理格式?
我刚刚使用此代码:http ://pastie.org/1944600将源纹理模糊到目标纹理上。
我真的很想将我的目标纹理创建为仅 Alpha,但它只适用于 RGBA。
那么,如何列出所有可用的目标纹理格式?
opengl - OpenGL/OpenGLES 中的帧缓冲纹理行为
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心不要导致反馈循环(从您正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在读取和写入同一纹理的不同像素,它是否也是未定义的行为?一个例子是,如果我试图制作一个内部带有渲染纹理的纹理图集。在渲染纹理时,我从存储在纹理图集中的另一个纹理中读取像素。
因为我没有在纹理中读取和写入相同的像素,所以行为仍然被认为是未定义的,只是因为数据来自同一个纹理?
opengl - ffmpeg 视频到 opengl 纹理
我正在尝试将使用ffmpeg从视频中抓取和转换的帧渲染为要放在四边形上的OpenGL纹理。我已经用尽谷歌并没有找到答案,我找到了答案,但似乎没有一个有效。
基本上,我avcodec_decode_video2()
用来解码帧,然后sws_scale()
将帧转换为 RGB,然后glTexSubImage2D()
从中创建一个 openGL 纹理,但似乎无法正常工作。
我已确保“目标”AVFrame 在 SWS 上下文设置中具有二维的能力。这是我的代码:
正如您在该代码中看到的那样,我还将帧保存到 .ppm 文件中,只是为了确保它们确实在渲染,它们就是这样。
正在使用的文件是 854x480 的 .wmv,这可能是问题所在吗?事实上我只是告诉它去 512x256?
PS 我看过这个Stack Overflow 问题,但没有帮助。
另外,我也有glEnable(GL_TEXTURE_2D)
,并且通过加载一个普通的 bmp 来测试它。
编辑
我现在在屏幕上显示图像,但它是乱码,我猜想与将事物更改为 2 的幂有关(在解码中,swscontext
如gluBuild2DMipmaps
我的代码所示)。我通常与上面显示的代码几乎完全相同,只是我已更改glTexSubImage2D
为gluBuild2DMipmaps
并将类型更改为GL_RGBA
.
这是框架的样子:
再次编辑
刚刚意识到我还没有显示 pFrameRGB 如何设置的代码:
既然我已经将PixelFormat
in更改avgpicture_get_size
为,我也已将其更改为 ,并更改为,我得到了一个稍微好一点的图像,但看起来我仍然缺少线条并且它仍然有点拉伸:PIX_FMT_RGB24
SwsContext
GluBuild2DMipmaps
GL_RGB
另一个编辑
在遵循 Macke 的建议并将实际分辨率传递给 OpenGL 之后,我得到了几乎正确的帧,但仍然有点偏斜并且是黑白的,现在它也只有 6fps 而不是 110fps:
附言
我有一个功能可以将帧保存到图像之后sws_scale()
,它们作为颜色和一切都很好,所以 OGL 中的某些东西正在使它成为黑白。
最后编辑
在职的!好的,我现在可以正常工作了,基本上我不会将纹理填充到 2 的幂,而只是使用视频的分辨率。
我通过正确的 glPixelStorei() 幸运猜测正确显示了纹理
另外,如果其他subimage()
人像我一样有显示空白的问题,你必须至少填充一次纹理,glTexImage2D()
所以我在循环中使用它一次,然后再使用glTexSubImage2D()
。
感谢 Macke 和 datenwolf 提供的所有帮助。
c++ - 在 OpenGL ES 2.0 中测量渲染到纹理的性能
基本上,我正在使用由两个三角形和一个片段着色器组成的屏幕大小的矩形进行某种图像处理,它正在完成整个处理工作。实际效果类似于动画,因为它依赖于一个统一变量,称为current_frame
.
我对用“MPix/s”来衡量性能非常感兴趣。我所做的是这样的:
就理论而言,我的概念有什么问题吗?
此外,我的印象是,glFinish()
在移动硬件上不一定要等待先前的渲染调用,并且可能会进行一些优化。
当然,我总是可以在每次抽签后强制执行glReadPixels()
,但这会很慢,所以这并没有真正的帮助。
你能否告诉我我的测试场景是否合理以及是否还有更多可以做的事情。
directx - 多个渲染目标不保存数据
我正在使用 SlimDX,针对带有着色器模型 4 的 DirectX 11。我有一个像素着色器“preProc”,它处理我的顶点并保存三个数据纹理。一个用于每个像素的法线,一个用于每个像素的位置数据,一个用于颜色和深度(颜色占用 rgb,深度占用 alpha 通道)。
然后我稍后在后处理着色器中使用这些纹理以实现屏幕空间环境光遮蔽,但似乎没有数据保存在第一个着色器中。
这是我的像素着色器:
它输出以下结构:
并采用以下结构作为输入:
但是在我的后处理着色器中:
它只是输出一个浅蓝色屏幕(我将渲染目标重置为每帧开始时的颜色)。getCol 已经过测试,可以在仅处理一个渲染目标时从 renderTex 材质返回颜色。如果我将像素着色器更改为对 randomTex 纹理(我的代码之前从文件中加载并且不是渲染目标)进行采样,那么一切都会很好地渲染,所以我确信它不是我的后处理着色器。
如果我的 slimDX 代码失败了,我会这样做:
创建我的纹理、shaderresourvecviews 和 rendertargetviews:
渲染到我的多个渲染目标:
然后是我将 postProcessing 着色器渲染到屏幕时的函数:
编辑:我为当前运行的单帧添加了 PIX 函数调用输出:
EDIT2:我一直在阅读,也许我需要在 preProc 传递之后将纹理作为渲染目标解除分配,然后再将它们作为 ShaderResourceViews 传递给我的 postProcess 着色器。我假设调用 context.OutputMerger.SetTargets() 将释放所有当前分配的渲染目标,然后仅分配函数参数中指定的渲染目标。如果不是这种情况(我还不能确定它是否存在),那么我将如何在 SlimDX 中取消分配渲染目标?
EDIT3:啊,根据这个MSDN Page,调用 OutputMerger.SetRenderTargets() “覆盖所有有界渲染目标和深度模板目标,无论 ppRenderTargetViews 中的渲染目标数量如何。” 所以当我告诉 OutputMerger 渲染到屏幕时,我所有的渲染目标都会自动释放。这让我回到了第一方。
c# - XNA 何时丢弃 Render Target 内容?
我知道 XNA 中的渲染目标是易变的,但它们的易变程度如何?我找不到任何说明何时丢弃其内容的文档。是在你开始向他们画画的时候,还是可以在任何时候?
我想简单地绘制一次渲染目标,然后无限期地将其用作 Texture2D。这可能吗?我需要启用RenderTargetUsage.PreserveContents
它才能正常工作吗?我读过 PreserveContents 在 Xbox 和手机硬件上非常慢。
xna - 我怎样才能保留渲染目标结果,使它们是非易失性的?
我正在 XNA 中编写一个应用程序,它依赖于渲染目标,这些目标只渲染一次,然后无限期地使用。我遇到的问题是在某些情况下,渲染目标的内容会丢失或被丢弃,例如当计算机进入睡眠状态或应用程序进入全屏模式时。
当内容丢失时重新渲染到每个目标是一种选择,但可能不是最佳选择,因为当有很多目标时它可能会相当昂贵。
我可能可以将每个结果保存为 PNG 图像,然后将该 PNG 备份为纹理,但这会增加大量 I/O 开销。
建议?