zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SpringBoot,来实现MySQL读写分离技术
    range范围
    tuple元组
    序列通用操作及可变序列通用操作
    list列表
    数据
    python基础知识
    charm写代码时添加快捷键
    2、添加到项目里 在⚙图标里选择Add Remote...charm初期设置(远程服务器)
    5、优化
  • 原文地址:https://www.cnblogs.com/tekkaman/p/9606319.html
Copyright © 2011-2022 走看看