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
留言
張貼留言