我正在尝试将纹理连接/添加到更大的纹理中,但是我无法保留更大纹理的结果。
我有一个着色器,它采用一些变量,例如较大纹理中较小纹理的位置,较小的纹理本身,当然还有较大的纹理。
基本上,我的着色器工作正常(我认为),在结果中我看到较大的一个位于正确位置的较小纹理。然而,我从未保存过更大的纹理,因此忽略了所有先例传递。
如何保存结果以将其再次发送到着色器以将所有小纹理连接到其中?
我试试这个: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);
}`
没有别的东西,它使我的东西工作,但我仍然困惑,因为它不应该工作......不?
答案 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.