统一着色器串联纹理

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.