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. cocos2dx粒子系统的简单使用

    cocos2dx自带的几种封装好的粒子系统,下面做个简单使用演示. ParticleFire 火焰粒子系统 ParticleFireworks 烟花粒子系统 ParticleSun 太阳粒子系统 Pa ...

  2. day07 深浅拷贝

    今日概要 深浅拷贝(重点) 文件操作 详细内容 直接赋值: 直接将对象的引用赋值给另一个对象 v1=1000 v2=v1 #v1 v2指向同一个内存地址 print(id(v1),id(v2))#相等 ...

  3. Ubuntu16.04的sublime text3 的安装教程

    1. sublime text3的官网位置 https://www.sublimetext.com/3 2.apt安装方式 1.  安装 GPG -key: wget -qO - https://do ...

  4. 《DSP using MATLAB》Problem 7.3

  5. 简单的shell脚本练习(一)

    1:求1000一内的偶数和 方法一: #!/bin/bash #用累加实现1000以内的偶数和 sum= ;i<=;i=i+)) do sum=$(($sum+$i)); done echo $ ...

  6. Nginx中文url出现404问题

    Nginx中文url出现404问题 前提条件检查,如我的系统centos,需要检查系统字符集是不是支持utf-8, 怎么配置可以参考这个帖子 https://www.vpser.net/manage/ ...

  7. VS2012 安装 NPOI (管理NuGet程序包)

    问题背景 选择项目后右键==>管理NuGet程序包,搜索NPOI,返回服务器无法找到...404 解决方法: 第一步: 访问:https://www.nuget.org/api/v2/      ...

  8. 【C++】vector用法详解

    转自:https://blog.csdn.net/fanyun_01/article/details/56842637#commentBox 一.简介 C++ vector类为内置数组提供了一种替代表 ...

  9. json 数据在textarea中显示的时候,切换 beauty和ugly模式

    转化为beauty模式 var jsonText = $('#json').val(); $('#json').val(JSON.stringify(JSON.parse(jsonText), nul ...

  10. mongodb 超出内存限制

    mongodb 查询数据默认占用最大内存为100M,如果查询涉及到大量数据进行$group.$sort时会抛出类似以下的异常: Received error :: { $err: \"Exc ...