Unity渲染(四):Shader着色器基础入门之获取当前屏幕贴图

通过这里,你会学习到怎么获取当前屏幕的贴图以及UV,通常用于屏幕的后处理。

上一章:Shader着色器基础入门之模糊(Blur)

开发环境:Unity5.0或者更高


通过获取屏幕贴图和uv,让屏幕的某个区域变亮


概述

1. 获取屏幕贴图
2. 获取屏幕UV
3. 完整代码

1.1 获取屏幕贴图

Unity 内置GrabPass 来获取屏幕贴图,语法如下,代码写在SubShader里面。

Unity-GrabPass官方说明

GrabPass{"自定义贴图名称"}

此Pass的作用是获取当前帧缓冲的内容。我们可以打开FrameDebugger看到


1.2 获取屏幕UV

Unity提供了一个接口用于获取物体在屏幕上的uv坐标
ComputeGrabScreenPos (float4 clipPos) ComputeGrabScreenPos 官方说明

他需要传入一个float4的坐标,这个坐标是裁剪空间的坐标,在shader可以通过UnityObjectToClipPos()接口获取
该函数定义在UnityCG.cginc, 使用之前需要引入这个文件

#include "UnityCG.cginc"

他的函数原型是这样


inline float4 ComputeGrabScreenPos (float4 pos) {#if UNITY_UV_STARTS_AT_TOPfloat scale = -1.0;#elsefloat scale = 1.0;#endiffloat4 o = pos * 0.5f;o.xy = float2(o.x, o.y*scale) + o.w;
#ifdef UNITY_SINGLE_PASS_STEREOo.xy = TransformStereoScreenSpaceTex(o.xy, pos.w);
#endifo.zw = pos.zw;return o;
}

代码说明

  1. #if UNITY_UV_STARTS_AT_TOP 因为在DX平台和OpenGl平台,坐标轴不一样,DX定义(0,0)为左上角,而OpenGl的定义(0,0)在左下角。防止图像翻转加上这个代码
  2. 我们首先要了解如何将坐标从裁剪空间转换到屏幕空间。中间过程有两步,先进行透视除法,将xyz值都除以w分量,让x,y,z的范围都处于[-1,1]之间,所谓透视除法主要是针对透视投影,对于正交投影这个w=1。之后将这个[-1,1]的坐标转换到屏幕空间,x坐标由[-1,1]->[0,屏幕宽度] ,y坐标由[-1,1]->[0,屏幕高度],这两步可以归结为以下公式

裁剪空间转为屏幕空间公式

但我们需要的是UV坐标,只需要转换到[0,1]即可,相当于上述公式的pixelWidth = 1,pixelHeight = 1,
当相机为正交投影时:上述公式clipw = 1 则带入可得到Unity源码中的float4 o = pos * 0.5f; o.xy = float2(o.x, o.y*scale) + o.w;,
当相机为透视投影时 源码使用TransformStereoScreenSpaceTex(o.xy, pos.w);进行处理,里面的代码是

float2 TransformStereoScreenSpaceTex(float2 uv, float w)
{float4 scaleOffset = unity_StereoScaleOffset[unity_StereoEyeIndex];return uv.xy * scaleOffset.xy + scaleOffset.zw * w;
}

原理是将透视投影的相机平头截体向中间缩放挤压,变成和正交投影一样,在和正交投影一样处理。

最后我们需要再采样的时候将uv.xy / uv.w 因为我们再上面假设clipw =1了


1.3 完整代码

Shader "Toturial/ScreenGrab"
{Properties{_MainTex("MainTex",2D) = "white"{}}SubShader{GrabPass{"_bTexture"}Tags{"Queue"="Transparent"}Pass{CGPROGRAM#include "UnityCG.cginc"#pragma vertex vert#pragma fragment fragsampler2D _MainTex;sampler2D _bTexture;struct a2v{float4 vertex : POSITION;};struct v2f{float4 pos   : SV_POSITION;float4 grabPos : TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.grabPos = ComputeScreenPos(o.pos);return o;}fixed4 frag(v2f i) : SV_TARGET{fixed4 screenColor = tex2D(_bTexture, i.grabPos.xy / i.grabPos.w);return screenColor * 2;}ENDCG}}
}

最终得到效果

最终效果

Unity渲染(四):Shader着色器基础入门之获取当前屏幕贴图相关推荐

  1. Unity渲染(二):Shader着色器基础入门之渲染Image图片

    Unity渲染(二):图片渲染 通过这里,你会学习到怎么将一张图片渲染到UI的Image组件或者SpriteRenderer上,以及透明物体的渲染. 上一章:Unity渲染(一):着色器基础入门之纯色 ...

  2. Unity Shader着色器优化

    对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...

  3. Unity3d基础知识之Texture纹理、Shader着色器、Material材质、Rendering Mode

    Unity3d基础知识之Texture纹理.Shader着色器.Material材质.Rendering Mode 一.纹理.着色器与材质 Texture(纹理):应用于网格表面上的标准位图图像.Un ...

  4. HLSL着色器原理:(一)着色器基础

    小光!小光!小光!小光!小光! 本文所总结视频为或许是小光从油管搬运到B站的视频:传送门 本篇主要汇总HLSL着色器的知识原理部分,并涉及少量必要的代码知识点,主要为知识点总结,实践部分建议参照其他S ...

  5. JAVA瑞波币_关于Shader着色器的使用(这个是GL通用的,用什么开发设置都一样) | Java与Ripple怎么玩?...

    什么是Shader呢?简单的说,Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序.通过这些程序,程序员就能够获得绝大部分想要的3D图形效果.在一个3D场景中,一般包含多个S ...

  6. OpenGL 着色器基础

    Instagram,Snapchat,Photoshop. 所有这些应用都是用来做图像处理的.图像处理可以简单到把一张照片转换为灰度图,也可以复杂到是分析一个视频,并在人群中找到某个特定的人.尽管这些 ...

  7. Unity初学Shadergraph创建着色器学习教程

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:51节课(4h 44m) |大小解压后:2.55 G ...

  8. (一)unity自带的着色器源码剖析之——————UnityShaderVariables.cginc文件

    unityShaderVariables.cginc文件中包含大量的工具宏和函数,如变换操作用的矩阵.与摄像机相关的函数.与光照和阴影相关的函数,以及与雾效果相关的函数等.下面依次分析这些工具函数和宏 ...

  9. Three.js着色器基础【含源码】

    着色器(Shader)是在 GPU 上运行的程序.它们被称为着色器的原因是,最初它们只处理3D对象的着色,但后来扩展到了3D对象之外.它们需要与传统编程不同的思维方式,因为程序是针对每个顶点或像素并行 ...

  10. OpenGL着色器基础

    前言: 本文翻译自LearnOpengl经典教程,OpenGL着色器基础介绍的比较通俗易懂,特总结分享一下! 为什么要使用着色器? 我们知道,OpenGL一般使用经典的固定渲染管线来渲染对象,但是随着 ...

最新文章

  1. 深度学习中的优化算法之BGD
  2. 这两天被木马程序搞得好烦
  3. C++new和delete运算符
  4. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化
  5. mysql获取后一天_MySQL根据某一Date值获取相关时间(前一天,后一天等)
  6. 使用php递归计算目录大小
  7. 集合论——二元关系的定义组成及性质
  8. java图片颜色取反色,照片底片模式
  9. vscode 设置中文语言包
  10. html标签logo怎么去掉,镜片上的logo怎么去掉
  11. 肯德尔秩相关系数matlab,常用的特征选择方法之 Kendall 秩相关系数
  12. 获取安卓模拟器的型号(品牌)
  13. 回望来时的路:构建之法东北师大站 2016春季学期
  14. 泰克示波器如何和pc连接
  15. 广义表的定义,特性,及表头和表尾怎么看?
  16. 如何快速查看Linux系统上的Shell类型
  17. 刘强东的代码水平到底有多牛?
  18. 计算机音乐谱水手,Aloha Heja He简谱-Achim Reichel-抖音神曲,一首德国水手老歌再次燃爆整个少年青春...
  19. 详解如何使用ArcGIS计算水库库容量
  20. TimeLine 角色播放动画会回到原点的解决

热门文章

  1. 转 最强烈推荐-内有国内最好的java论坛
  2. 加拿大卡尔加里市推出本地数字货币
  3. 云计算与大数据应用技术————21大数据2021142247537刘新敏
  4. Photoshop设置图片的背景色为透明
  5. 使用GoldWave制作“淡入/淡出”效果
  6. 探秘Google新搜索引擎算法
  7. 地图,GPS位置地图坐标系:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图),OpenGIS
  8. 常用单片机和开发板的引脚功能图
  9. python导入包总是失败
  10. 程序设计基本结构———顺序、选择与循环