统一着色器连接纹理

时间:2016-09-09 15:20:44

标签: unity3d textures concatenation shader

我正在尝试将纹理连接/添加到更大的纹理中,但是我无法保留更大纹理的结果。

我有一个着色器,它采用一些变量,例如较大纹理中较小纹理的位置,较小的纹理本身,当然还有较大的纹理。

基本上,我的着色器工作正常(我认为),在结果中我看到较大的一个位于正确位置的较小纹理。然而,我从未保存过更大的纹理,因此忽略了所有先例传递。

如何保存结果以将其再次发送到着色器以将所有小纹理连接到其中?

我试试这个:Graphics.Blit(_RTConcat, _RTConcat, _concat);

RTConcat是我更大的纹理,它是RenderTexture,我试图在编辑器或脚本中创建它,但结果是相同的,_concat是使用的材料着色器。

PS:我使用的是Unity 4.5.3并且无法升级,它是专业版。

编辑/更新:

我“成功”做出看起来像我想要的东西,但我不明白它为什么会起作用。

在我的主脚本中,我初始化一个生成的renderTexture并将其设置为在平面上应用它的垫子

_radarVision = new RenderTexture(_radarTextureWidth, _renderHeight, 24); _renderHeight, 24); _radarScreen.SetTexture("_MainTex", _radarVision);

_radarVision_radarScreen永远不会在我的脚本中再次编辑。

Graphics.Blit现在位于相机上的新脚本附件中,仅用于运行单个脚本:

`void OnRenderImage(RenderTexture source,RenderTexture destination)  {

Graphics.Blit(save, save, _concat);

rttmp = RenderTexture.GetTemporary(camera.targetTexture.width,  camera.targetTexture.height);

save = rttmp;

camera.targetTexture = save;
RenderTexture.ReleaseTemporary(rttmp);

}`

没有别的东西,它使我的东西工作,但我仍然困惑,因为它不应该工作......不?

2 个答案:

答案 0 :(得分:1)

我发现的最佳解决方案是:

Graphics.Blit(save, save1, _concat);
Graphics.Blit(save1, save, _concat);

我不明白为什么单个Graphics.Blit不能正常工作,而是双重工作"完美",它只会打扰我,因为它需要调用两次相同的着色器(使用像16384 * 4092那样大的纹理)但是我的最后一个解决方案,我可以在我的纹理上应用最后一个着色器而不会破坏所有内容。

当使用第二个着色器对纹理“保存时,使用GetTemporary会导致问题,我会用缓冲区猜测故事。

我总是愿意接受更好的方法,但是现在我的解决方案完全解决了我的问题,尽管它给了我一个癌症

答案 1 :(得分:0)

使用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.