2016-09-09 62 views
1

我試圖將紋理連接/添加到更大的紋理,但我無法保持較大紋理的結果。統一着色器連接紋理

我有一個着色器,它需要一些變量,比如較大紋理中較小的紋理的位置,較小的紋理本身以及較大的紋理。

基本上,我的着色器工作正常(我認爲),在結果中我看到較大的紋理在正確的位置。但是我的更大的紋理永遠不會被保存,因此所有的先例pass都會被忽略。

如何保存結果以將其重新發送到着色器以將所有小紋理連接到它中?

我試試這個:Graphics.Blit(_RTConcat, _RTConcat, _concat);

RTConcat是我更大的紋理,這是一個RenderTexture,我試圖在編輯器或腳本來創建它既但結果是相同的,_concat是使用着色材料。

PS:我使用統一4.5.3,不能升級,這是一個專業版。

編輯/更新:

我「成功」來,看起來像我想要做什麼東西,但我不明白爲什麼它的工作。

在我的主腳本我初始化一個產生渲染紋理,將其設置到其應用在一個平面

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

_radarVision_radarScreen都從來沒有在我的腳本重新編輯的墊子。現在

Graphics.Blit是在一個新的腳本附加相機上創建僅運行一個腳本:

'無效OnRenderImage(渲染紋理源,渲染紋理目的地) {

Graphics.Blit(save, save, _concat); 

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

save = rttmp; 

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

}` 

沒有什麼其他,它使我的東西工作,但我仍然困惑,因爲它不應該工作...不是?

回答

1

而且我已經找到了最好的解決方案是:

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

我不明白爲什麼一個Graphics.Blit不工作,但一個雙重的工作「完美」,它唯一打擾我,因爲它需要調用兩次相同的着色器(其工作的紋理非常大,如16384 * 4092),但是我的最後一個解決方案是,我可以將最後一個着色器應用於我的紋理,而不會破壞所有內容。

使用GetTemporary會導致一個問題時,應用第二個着色器紋理`保存,我用緩衝區猜測故事。

我總是打開了一個更好的辦法的建議,但現在我的解決方案完全解決我的問題,儘管它已經給了我一個癌症

0

使用渲染紋理,BLIT和材質組合是不是最好的解決方案。這裏的開銷太多了。你必須調用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.