统一着色器串联纹理
unity shader concatenation texture
我正在尝试 concatenate/add 将一个纹理变成一个更大的纹理,但我未能保留更大纹理的结果。
我有一个着色器,它采用一些变量,例如较大纹理中较小纹理的位置、较小纹理本身,当然还有较大纹理。
基本上,我的着色器工作正常(我认为),结果我在正确的位置看到较大纹理中的较小纹理。然而,我更大的纹理从未被保存,所以所有的先例都被忽略了。
如何保存结果以将其再次发送到着色器以将所有小纹理连接到其中?
我试试这个:Graphics.Blit(_RTConcat, _RTConcat, _concat);
RTConcat
是我更大的纹理,它是 RenderTexture
,我尝试在编辑器或脚本中创建它,但结果是一样的,_concat
是material 使用着色器。
PS : 我用的是unity 4.5.3,无法升级,是专业版。
编辑/更新:
我 "success" 制作了一些看起来像我想要的东西,但我不明白为什么它会起作用。
在我的主脚本中,我初始化了生成的 renderTexture 并将其设置为将其应用到平面上的垫子
_radarVision = new RenderTexture(_radarTextureWidth, _renderHeight, 24);
_renderHeight, 24);
_radarScreen.SetTexture("_MainTex", _radarVision);
_radarVision
和 _radarScreen
再也不会在我的脚本中编辑了。
Graphics.Blit
现在在附加到相机的新脚本中只创建到 运行 单个脚本:
`void OnRenderImage(RenderTexture 源,RenderTexture 目标)
{
Graphics.Blit(save, save, _concat);
rttmp = RenderTexture.GetTemporary(camera.targetTexture.width, camera.targetTexture.height);
save = rttmp;
camera.targetTexture = save;
RenderTexture.ReleaseTemporary(rttmp);
}`
没有别的,它让我的东西工作了,但我仍然感到困惑,因为它不应该工作......不是吗?
我找到的最佳解决方案是:
Graphics.Blit(保存, 保存1, _concat);<br>
Graphics.Blit(save1, save, _concat);
我不明白为什么单个 Graphics.Blit
不起作用,但双重 "perfectly",这让我很困扰,因为它需要调用两次相同的着色器(与真正一起工作的着色器)像 16384*4092 这样的大纹理)但是我的最后一个解决方案,我可以将最后一个着色器应用于我的纹理而不会破坏一切。
使用 GetTemporary
将第二个着色器应用于纹理保存时会导致问题,我猜这是一个带有缓冲区的故事。
我总是愿意接受更好的建议,但现在我的解决方案完全解决了我的问题,尽管它让我得了癌症
使用 RenderTexture、Blit 和 Material 组合不是最佳解决方案。这里的开销太大了。你必须调用 Blit 两次,因为我猜你不能一次读取和渲染到相同的渲染纹理。我认为最直接和最好的解决方案是:
subTex = ... ;// Initialize the sub tex
subTex.Apply(); // Upload elementTex to the Gpu
Graphics.CopyTexture(subTex, offset, size, globalTex, offset, size); // the subTex will be copied to globalTex in both GPU, and CPU. This is a GPU->GPU and a CPU ->CPU copy so it's very quick without any additional drawcall at all.
我正在尝试 concatenate/add 将一个纹理变成一个更大的纹理,但我未能保留更大纹理的结果。
我有一个着色器,它采用一些变量,例如较大纹理中较小纹理的位置、较小纹理本身,当然还有较大纹理。
基本上,我的着色器工作正常(我认为),结果我在正确的位置看到较大纹理中的较小纹理。然而,我更大的纹理从未被保存,所以所有的先例都被忽略了。
如何保存结果以将其再次发送到着色器以将所有小纹理连接到其中?
我试试这个:Graphics.Blit(_RTConcat, _RTConcat, _concat);
RTConcat
是我更大的纹理,它是 RenderTexture
,我尝试在编辑器或脚本中创建它,但结果是一样的,_concat
是material 使用着色器。
PS : 我用的是unity 4.5.3,无法升级,是专业版。
编辑/更新:
我 "success" 制作了一些看起来像我想要的东西,但我不明白为什么它会起作用。
在我的主脚本中,我初始化了生成的 renderTexture 并将其设置为将其应用到平面上的垫子
_radarVision = new RenderTexture(_radarTextureWidth, _renderHeight, 24);
_renderHeight, 24);
_radarScreen.SetTexture("_MainTex", _radarVision);
_radarVision
和 _radarScreen
再也不会在我的脚本中编辑了。
Graphics.Blit
现在在附加到相机的新脚本中只创建到 运行 单个脚本:
`void OnRenderImage(RenderTexture 源,RenderTexture 目标) {
Graphics.Blit(save, save, _concat);
rttmp = RenderTexture.GetTemporary(camera.targetTexture.width, camera.targetTexture.height);
save = rttmp;
camera.targetTexture = save;
RenderTexture.ReleaseTemporary(rttmp);
}`
没有别的,它让我的东西工作了,但我仍然感到困惑,因为它不应该工作......不是吗?
我找到的最佳解决方案是:
Graphics.Blit(保存, 保存1, _concat);<br>
Graphics.Blit(save1, save, _concat);
我不明白为什么单个 Graphics.Blit
不起作用,但双重 "perfectly",这让我很困扰,因为它需要调用两次相同的着色器(与真正一起工作的着色器)像 16384*4092 这样的大纹理)但是我的最后一个解决方案,我可以将最后一个着色器应用于我的纹理而不会破坏一切。
使用 GetTemporary
将第二个着色器应用于纹理保存时会导致问题,我猜这是一个带有缓冲区的故事。
我总是愿意接受更好的建议,但现在我的解决方案完全解决了我的问题,尽管它让我得了癌症
使用 RenderTexture、Blit 和 Material 组合不是最佳解决方案。这里的开销太大了。你必须调用 Blit 两次,因为我猜你不能一次读取和渲染到相同的渲染纹理。我认为最直接和最好的解决方案是:
subTex = ... ;// Initialize the sub tex
subTex.Apply(); // Upload elementTex to the Gpu
Graphics.CopyTexture(subTex, offset, size, globalTex, offset, size); // the subTex will be copied to globalTex in both GPU, and CPU. This is a GPU->GPU and a CPU ->CPU copy so it's very quick without any additional drawcall at all.