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

Unity中的屏幕坐标:ComputeScreenPos/VPOS/WPOS的更多相关文章

  1. unity3d ppsspp模拟器中的post processing shader在unity中使用

    这个位置可以看到ppsspp的特殊处理文件位置来看看这些特效 用来测试的未加特效图片 ppsspp: 传说系列一生爱---英杰传说 最后的战士 aacolor 是关于饱和度,亮度,对比度,色调的调节, ...

  2. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug

    问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...

  3. Unity中使用Attribute

    Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...

  4. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  5. Unity中使用WebView

    Unity中使用WebView @(设计) 需求,最近游戏中需要引入H5直播页面和更新比较频繁的赛事页面,需求包括:加密传参数.和Unity交互,在Unity框架下其实有几种方案: 内置函数Appli ...

  6. Unity中创建二维码

    在网络上发现了一个可以把字符串转换成二维码的dll,但是我们要怎么使用他呢.不废话,直接进入主题. 用到的引用 using UnityEngine;using ZXing;using ZXing.Qr ...

  7. 在Unity中创建可远程加载的.unity3d包

    在一个Unity项目中,发布包本身不一定要包括所有的Asset(译为资产或组件),其它的部分可以单独发布为.unity3d,再由程序从本地/远程加载执行,这部分不在本文讨论范围.虽然Unity并没有直 ...

  8. 【原创翻译】初识Unity中的Compute Shader

    一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...

  9. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

随机推荐

  1. # 20175120 2018.3.10 《Java程序设计》第2周学习总结

    ## 教材学习内容总结第二章内容1.标识符第一个字符不能是数字字符不能是关键字和true\false\null2.8个基本数据类型boolean int byte short long float d ...

  2. Google - chanceToLose24Game

    /* 一个类似24点的游戏,假设牌桌上有无数张1-10的牌,然后你手上的牌的总和是k,现在你可以随机到牌桌上抽牌加到总和里,如果你手上牌的总和在20-25之间就是win,如果总和超过25就是lose, ...

  3. cannot find package "context"

    导入  github.com/go-sql-driver/mysql 和 database/sql 时,报cannot find package "context"的错误因为go1 ...

  4. JS 点击复制

    一.原理分析 浏览器提供了 copy 命令 ,可以复制选中的内容 document.execCommand("copy") 如果是输入框,可以通过 select() 方法,选中输入 ...

  5. Python脚本模拟僵尸进程与孤儿进程

    最近一台机器的systemd内存高达30%多,一直不变,后来排查是僵尸进程,什么是僵尸进程呢,只能google,百度等先了解,然后自己总结了一下,虽然这是基础的东西,但是对于我来说就如新大陆一样.花了 ...

  6. utf-8mb4和排序规则

    MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode. 最新的 UTF-8 规范只使用一到四个字节,最大能编码21位, ...

  7. 论文阅读笔记:【Transforming Auto-encoders】

    [Transforming Auto-encoders]: G E Hinton, A Krizhevsky, S D Wang. Transforming auto-encoders[C]. //I ...

  8. caffe-windows环境配置(github上官方BVLC/caffe的推荐配置方法详解)

    [转载来的文章:如有侵权,请联系我!我将马上删除!] 首先声明一下,如标题,本教程是caffe在windows系统上的配置方法,而且是github上官方BVLC/caffe目前推荐的配置方法,并不是使 ...

  9. Batch Close process

    @echo offecho.rem Kill all chrome drivertaskkill /im chromedriver.exe /f pause

  10. ANSI编码导致的乱码

    美帝那边的一个 donet 项目,打开后发现一段string里面各种乱码.一通折腾后发现是编码格式问题.这段string所在的类文件保存格式为ANSI,而不是VS默认的UTF-8. ANSI编码电脑是 ...