Unity中的屏幕坐標:ComputeScreenPos/VPOS/WPOS


Unity中的屏幕坐標:ComputeScreenPos/VPOS/WPOS

1、通過 VPOS / WPOS 語義獲取。

  VPOS 是 HLSL 中 對 屏幕 坐標 的 語義, 而 WPOS 是 Cg 中 對 屏幕 坐標 的 語義。

    

  上面的Shader,得到的效果如圖:

    

  

  VPOS/ WPOS 的 z 分量 范圍是[ 0, 1], 在 攝像機 的 近 裁剪 平面 處, z 值 為 0, 在 遠 裁剪 平面 處, z 值 為 1。  

  對於 w 分量, 我們 需要 考慮 攝像機 的 投影 類型。 如果 使 用的 是 透視 投影, 那么 w 分量 的 范圍是 [1/Near, 1/Far], Near 和 Far 對應 了 在 Camera 組件 中 設置 的 近 裁剪 平面 和 遠 裁剪 平面 距離 攝像機 的 遠近; 如果 使 用的 是 正交 投影, 那么 w 分量 的 值 恆 為 1。

 

2、通過 ComputeScreenPos 獲取。

  這個函數在 UnityCG.cginc 里被定義。

     首先 在 頂點 着色 器 中將 ComputeScreenPos 的 結果 保存 在 輸出 結構 體中。

  然后 在 片 元 着色 器 中進 行 一個 齊 次 除法 運算 后 得到 視 口 空間 下 的 坐標。

  

  

  

  視 口 空間 中的 坐標, 公式 如下:

    

  

  上面 公式 的 思想 就是, 首先 對 裁剪 空間 下 的 坐標 進行 齊 次 除法, 得到 范圍 在[ − 1, 1] 的 NDC, 然后 再將 其 映射 到 范圍 在[ 0, 1] 的 視 口 空間 下 的 坐標。

    

  

  ComputeScreenPos 的 輸入 參數 pos 是 經過 MVP 矩陣 變換 后 在 裁剪 空間 中的 頂點 坐標。 UNITY_ HALF_ TEXEL_ OFFSET 是 Unity 在 某些 DirectX 平台 上 使 用的 宏, 在這里 我們 可以 忽略 它。 這樣, 我們 可以 只 關注# else 的 部分。_ ProjectionParams. x 在 默認 情況下 是 1( 如果 我們 使用 了 一個 翻轉 的 投影 矩陣 的 話 就是 − 1, 但這 種 情況 很 少見)。

  

參考:

1、《Unity Shader 入門精要》- 4.9.3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM