Unity渲染(四):Shader着色器基础入门之获取当前屏幕贴图
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;
}
代码说明
- #if UNITY_UV_STARTS_AT_TOP 因为在DX平台和OpenGl平台,坐标轴不一样,DX定义(0,0)为左上角,而OpenGl的定义(0,0)在左下角。防止图像翻转加上这个代码
- 我们首先要了解如何将坐标从裁剪空间转换到屏幕空间。中间过程有两步,先进行透视除法,将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着色器基础入门之获取当前屏幕贴图相关推荐
- Unity渲染(二):Shader着色器基础入门之渲染Image图片
Unity渲染(二):图片渲染 通过这里,你会学习到怎么将一张图片渲染到UI的Image组件或者SpriteRenderer上,以及透明物体的渲染. 上一章:Unity渲染(一):着色器基础入门之纯色 ...
- Unity Shader着色器优化
对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...
- Unity3d基础知识之Texture纹理、Shader着色器、Material材质、Rendering Mode
Unity3d基础知识之Texture纹理.Shader着色器.Material材质.Rendering Mode 一.纹理.着色器与材质 Texture(纹理):应用于网格表面上的标准位图图像.Un ...
- HLSL着色器原理:(一)着色器基础
小光!小光!小光!小光!小光! 本文所总结视频为或许是小光从油管搬运到B站的视频:传送门 本篇主要汇总HLSL着色器的知识原理部分,并涉及少量必要的代码知识点,主要为知识点总结,实践部分建议参照其他S ...
- JAVA瑞波币_关于Shader着色器的使用(这个是GL通用的,用什么开发设置都一样) | Java与Ripple怎么玩?...
什么是Shader呢?简单的说,Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序.通过这些程序,程序员就能够获得绝大部分想要的3D图形效果.在一个3D场景中,一般包含多个S ...
- OpenGL 着色器基础
Instagram,Snapchat,Photoshop. 所有这些应用都是用来做图像处理的.图像处理可以简单到把一张照片转换为灰度图,也可以复杂到是分析一个视频,并在人群中找到某个特定的人.尽管这些 ...
- Unity初学Shadergraph创建着色器学习教程
MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:51节课(4h 44m) |大小解压后:2.55 G ...
- (一)unity自带的着色器源码剖析之——————UnityShaderVariables.cginc文件
unityShaderVariables.cginc文件中包含大量的工具宏和函数,如变换操作用的矩阵.与摄像机相关的函数.与光照和阴影相关的函数,以及与雾效果相关的函数等.下面依次分析这些工具函数和宏 ...
- Three.js着色器基础【含源码】
着色器(Shader)是在 GPU 上运行的程序.它们被称为着色器的原因是,最初它们只处理3D对象的着色,但后来扩展到了3D对象之外.它们需要与传统编程不同的思维方式,因为程序是针对每个顶点或像素并行 ...
- OpenGL着色器基础
前言: 本文翻译自LearnOpengl经典教程,OpenGL着色器基础介绍的比较通俗易懂,特总结分享一下! 为什么要使用着色器? 我们知道,OpenGL一般使用经典的固定渲染管线来渲染对象,但是随着 ...
最新文章
- 深度学习中的优化算法之BGD
- 这两天被木马程序搞得好烦
- C++new和delete运算符
- 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化
- mysql获取后一天_MySQL根据某一Date值获取相关时间(前一天,后一天等)
- 使用php递归计算目录大小
- 集合论——二元关系的定义组成及性质
- java图片颜色取反色,照片底片模式
- vscode 设置中文语言包
- html标签logo怎么去掉,镜片上的logo怎么去掉
- 肯德尔秩相关系数matlab,常用的特征选择方法之 Kendall 秩相关系数
- 获取安卓模拟器的型号(品牌)
- 回望来时的路:构建之法东北师大站 2016春季学期
- 泰克示波器如何和pc连接
- 广义表的定义,特性,及表头和表尾怎么看?
- 如何快速查看Linux系统上的Shell类型
- 刘强东的代码水平到底有多牛?
- 计算机音乐谱水手,Aloha Heja He简谱-Achim Reichel-抖音神曲,一首德国水手老歌再次燃爆整个少年青春...
- 详解如何使用ArcGIS计算水库库容量
- TimeLine 角色播放动画会回到原点的解决
热门文章
- 转 最强烈推荐-内有国内最好的java论坛
- 加拿大卡尔加里市推出本地数字货币
- 云计算与大数据应用技术————21大数据2021142247537刘新敏
- Photoshop设置图片的背景色为透明
- 使用GoldWave制作“淡入/淡出”效果
- 探秘Google新搜索引擎算法
- 地图,GPS位置地图坐标系:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图),OpenGIS
- 常用单片机和开发板的引脚功能图
- python导入包总是失败
- 程序设计基本结构———顺序、选择与循环