CommandBuffers

 


在2月29日來發一篇也挺有意思的XD。這篇來寫一下默認管線( Built-in Render Pipeline )當中的 CommandBuffers 功能 。

默認管線當中,渲染的順序是固定的模式,不容易調整。大部分情況下就要按照,不透明/天空球/透明/後處理/UI 等的渲染順序來渲染屏幕的物件。而 CommandBuffers 則是用來自訂部分渲染的方式來擴展 Unity 的默認管線。

我們可以對要渲染的攝影機增加 CameraEvent 的方式來添加希望增加的渲染內容。例如:希望在不透明(Opaque)渲染之後希望另外增加額外的渲染則可以用 CameraEvent.AfterForwardOpaque 的方添加到攝影機上面 ( Camera.AddCommandBuffer( CameraEvent, CommandBuffer)  ) 。 同時記得不使用時需要從攝影機上移除 ( Camera.RemoveCommandBuffer( CameraEvent, CommandBuffer) ) 。

從這個魔法球的效果來說,會希望內部帶有扭曲的情形,因此我們可以如同上面講一樣,在不透明(Opaque)之後添加 CommandBuffer 讓不透明(Opaque)的部分製作全屏幕的扭曲效果(Distort),再與之後的球體物件半透明(Transparent)做疊加處理,來達到內部扭曲&染色的特殊表現。

球體貼牆面會有的邊緣效果是則是利用了深度圖( _CameraDepthTexture ) 取得的 邊緣(Edge)效果。


設定 CommandBuffer C# 的部分 : 

private void RendererCommandBuffer(ref CommandBuffer buf, ref Material mat)

{

buf.name = "[CommandBuffersEffect]";

int screenCopyID = Shader.PropertyToID("_ScreenCopyTexture");

buf.GetTemporaryRT(screenCopyID, -1, -1, 0, FilterMode.Bilinear);

SetMaterial(mat); //設定材質球Shader參數

buf.Blit(BuiltinRenderTextureType.CurrentActive, screenCopyID, mat, 0);

buf.SetGlobalTexture(_CommandBufferRT, screenCopyID);

}

CommandBuffer Shader  frag 擾動(Distort)的部分 : 

half4 fragDistortNoise (v2f i) : COLOR 

{

half2 noiseUV =  i.uv ; 

half offset1 = tex2D(_NoiseTex, noiseUV + fmod(_Time.xz,65535.0) * _NoiseSpeed ).r ;

half offset2 = tex2D(_NoiseTex, noiseUV + fmod(_Time.yz,65535.0) * _NoiseSpeed ).r ;

half value = (offset1+offset2) - 1.0;

noiseUV.x += value * _NoiseU * _NoiseStrength;

noiseUV.y += value * _NoiseV * _NoiseStrength;

half4 color = tex2D (_MainTex, noiseUV) * _Color ;

return color;

}


效果影片


References:

https://docs.unity3d.com/ScriptReference/Rendering.CommandBuffer.html

https://docs.unity3d.com/Packages/com.unity.shadergraph@4.2/manual/Polar-Coordinates-Node.html

https://blog.csdn.net/Porco_/article/details/77374639


留言

這個網誌中的熱門文章

Stencil Portal Effect

Rain Drop

Universal Render Pipeline 14