2种方法:

1. 使用 VPOS 或 WPOS语义,如:

  1. Shader "Test/ScreenPos1"
  2. {
  3. SubShader
  4. {
  5. Pass
  6. {
  7. CGPROGRAM
  8. #pragma vertex vert
  9. #pragma fragment frag
  10.  
  11. struct appdata
  12. {
  13. float4 pos : POSITION;
  14. };
  15.  
  16. struct v2f
  17. {
  18. float4 pos : SV_POSITION;
  19. };
  20.  
  21. v2f vert (appdata v)
  22. {
  23. v2f o;
  24. o.pos = mul(UNITY_MATRIX_MVP, v.pos);
  25. return o;
  26. }
  27.  
  28. fixed4 frag (v2f i : WPOS) : SV_Target
  29. {
  30. fixed2 viewPos = i.pos.xy / _ScreenParams.xy;
  31. return fixed4(viewPos, , );
  32. }
  33. ENDCG
  34. }
  35. }
  36. }

其中,VPOS/WPOS 的z分量范围为[0,1],在摄像机的近裁剪平面处,z值为0,在远裁剪平面处,z值为1。

2. 使用 UnityCG.cginc 中的 ComputeScreenPos 方法,如:

  1. Shader "Test/ScreenPos2"
  2. {
  3. SubShader
  4. {
  5. Pass
  6. {
  7. CGPROGRAM
  8. #pragma vertex vert
  9. #pragma fragment frag
  10.  
  11. #include "UnityCG.cginc"
  12.  
  13. struct appdata
  14. {
  15. float4 pos : POSITION;
  16. float4 scrPos : TEXCOORD0;
  17. };
  18.  
  19. struct v2f
  20. {
  21. float4 pos : SV_POSITION;
  22. float4 scrPos : TEXCOORD0;
  23. };
  24.  
  25. v2f vert (appdata v)
  26. {
  27. v2f o;
  28. o.pos = mul(UNITY_MATRIX_MVP, v.pos);
  29. o.scrPos = ComputeScreenPos(o.pos);
  30. return o;
  31. }
  32.  
  33. fixed4 frag (v2f i) : SV_Target
  34. {
  35. fixed2 viewPos = i.scrPos.xy / i.scrPos.w;
  36. return fixed4(viewPos, , );
  37. }
  38. ENDCG
  39. }
  40. }
  41. }

详细参考《Unity shader入门精要》 91页。

转载请注明出处:http://www.cnblogs.com/jietian331/p/7025853.html

渲染结果如下:

Unity之fragment shader中如何获得视口空间中的坐标的更多相关文章

  1. opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则

    opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则. 比如说要在视口空间判断一个三角形是否是正面朝向用户,就需要用左手定则而非右手定则.

  2. Unity Shaders Vertex & Fragment Shader入门

    http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...

  3. 【Unity Shaders】Shader中的光照

    写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已.当然,我相信这是因为我们写得少...不过这也是由于官方文档对这方面介绍很少的缘故, ...

  4. 【Unity Shaders】Vertex & Fragment Shader入门

    写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...

  5. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  6. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  7. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  8. Vertex And Fragment Shader(顶点和片段着色器)

    Vertex And Fragment Shader(顶点和片段着色器) Shader "Unlit/ Vertex­_And_Fragment_Shader " { Proper ...

  9. unity之初识shader

    自己做个总结先.当然文中很多内容都是从各位大神的文档当中看的.我只是站在巨人的肩膀上.       首先什么是shader?其实就是一个在显示屏当中的显示程序,俗称着色器.它可以定义物体在硬件显示屏当 ...

随机推荐

  1. 类中的函数带有self,不带self的区别

    1.类里函数不带self,这是我们调用类里的函数直接用类名.函数名() class shop(object): def scan_goods(): #括号内不带self print('浏览商品') d ...

  2. [development][suricata] linux下一代权限控制 capabilities

    读suricata源码过程中,  读到了 libcap-ng 应该就是anthroid手机,每次安装app时候, 询问的那个capablities.....吧.... 中文文档: http://rk7 ...

  3. [daily][qemu][kvm] qemu增加减少CPUID

    做 DPDK 大页内存测试, 发现KVM模拟出来的CPU不支持 1GB 的大页 可以使用如下命令是否支持: [root@dpdk ~]# cat /proc/cpuinfo |grep pdpe1gb ...

  4. LeetCode 589 N-ary Tree Preorder Traversal 解题报告

    题目要求 Given an n-ary tree, return the preorder traversal of its nodes' values. 题目分析及思路 题目给出一棵N叉树,要求返回 ...

  5. go不在dock显示运行

    用这种方法就可以了go build -ldflags -H=windowsgui XXX.go

  6. 对vue.js的template编译的理解

    简而言之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点) 详情步骤: 首先,通过compile编译器把template编译成AST语法树(abstract sy ...

  7. finecms如何调用自定义内容

    我们建站的时间经常会有一些固定的元素,比如电话.地址等,这种相对比较简单的东西可以让编辑人员直接在后台就可以定义,那么finecms有没有这个功能呢?怎么定义?如何调用? finecms后台有一个自定 ...

  8. dxCameraControl控件(拍照)

    拍照演示 主要属性设置 Active:True DeviceIndex:设备号,默认为0 其他方法 procedure Capture; //捕获 procedure Pause; //暂停 proc ...

  9. Linux小脚本

    将固定的换包步骤,做成脚本replacePackage.sh,赋予执行权限(chmod +x   replacePackage.sh).这样小小自动化也能节约时间呀. replacePackage.s ...

  10. LSTM输入层、隐含层及输出层参数理解【转载】

    转自:https://blog.csdn.net/yyb19951015/article/details/79740869 //这个博客讲的挺不错的. http://www.newlifeclan.c ...