精選文章

SmallBurger Asset Home

  SmallBurger

2021年3月15日 星期一

如何在URP下做ReplacementShader?

在預設渲染管線下,ReplacementShader還蠻常拿來做一些特殊效果(比方後置特效之類的),但SRP渲染管線之後,就無法使用這個功能,官方說法是說可以利用LightMode來達到類似的效果,但是如果Camera Transform不同或平行視角射影機的話,目前看起來切LightMdoe是無法達到相同的效果,由於近期要做的功能也有這方面的需求,在此分享一下怎麼在URP下做到類似的效果,這邊使用shader_feature的做法,也可以自行使用multi_compile的方式…

以下為時時拍射場景高度比的例子:
  1. 定義ShaderFeature:
    #pragma shader_feature CAPTURE_HEIGHT_RATIO
  2. 如果是CAPTURE_HEIGHT_RATIO,才加入高度比的輸出參數:
    struct VertexOutput
    {
    #ifdef CAPTURE_HEIGHT_RATIO
    float heightRatio : TEXCOORD0;
    #endif
    ...
    }
  3. 如果是CAPTURE_HEIGHT_RATIO,才計算並傳入到output
    #ifdef CAPTURE_HEIGHT_RATIO
    output.heightRatio =
    GetHeightRatio(worldPosition.y);
    #endif
  4. 如果是CAPTURE_HEIGHT_RATIO,回傳顏色為高度比
    #ifdef CAPTURE_HEIGHT_RATIO
    return half4(input.heightRatio, 0.0, 0.0, 1.0);
    #endif
  5. 最後是C#的部份,拍高度的Camera在拍之前,把Keyworld enable起來,拍完後,就設回disable:
    Shader.EnableKeyword("CAPTURE_HEIGHT_RATIO");
    UniversalRenderPipeline.RenderSingleCamera(context, m_captureCamera);
    Shader.DisableKeyword("CAPTURE_HEIGHT_RATIO");
這樣就可以達到不同的camera replace shader的效果,而不用在那邊layer設來設去或Material改來改去…相關參考影片如下:



沒有留言:

張貼留言