GrabPass截屏

可以用来截屏,截屏后把纹理传给下一个通道使用。

1:使用抓屏通道, GrabPass {} 或 GrabPass { “ 纹理名称”}; 使用GrabPass {}后,可以用_GrabTexture访问截屏的纹理
2: 后续的Pass通道使用这个抓屏;
3: 编写案例
(1): 创建一个顶点片元着色器;
(2): 将这个着色器放到Overlay队列
(3): 使用GrabPass通道截屏,并定义好变量来接收
(3): 设置顶点的UV坐标;
(4): 着色使用截图的纹理

GrabPass截屏案例

1.创建好Unity工程目录

2.创建一个平面plane和一个立方体cube,给cube一个材质red,把red拖进cube的材质属性中

3.再创建一个平面show,竖起来放在旁边,等下用来显示截屏纹理

4.在resources文件夹下面创建shaders文件夹

5.打开shaders文件夹,创建一个用于顶点片元着色的shader,create---->shader---->unlit shader,重命名为GrabShader

6.打开GrabShader

第一步:先把第一行改成Shader "Custom/GrabShader",这样才能在编辑器里面显示这个shader

第二步:把渲染队列拉到最高overlay

Tags { "RenderType"="Opaque" "Queue"="Overlay" }

第三步:使用截屏通道

Shader "Custom/GrabShader"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" "Queue"="Overlay" }//把渲染队列拉到最高overlayLOD 100//
        GrabPass {} // 截图通道, 后面使用_GrabTexture访问截屏纹理// end
        Pass{name "ONE"CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _GrabTexture;//使用前重新声明一下
            float4 _GrabTexture_ST;v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.uv, _GrabTexture);//使用return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed4 col = tex2D(_GrabTexture, i.uv);//使用return col;}ENDCG}}
}

7.创建一个材质GrabShader,shader属性设置为Custom/GrabShader

8.show平面关联材质球GrabShader

9.运行起来,Game视图里面的plane视图上面显示出截屏纹理

常用的gcinc

系统自带的类似于语言里面的.h文件,是库函数,在Unity-->Edit-->Data-->CGIncludes;查看

1:cginc文件: 宏,帮助函数等,放在CGIncludes下面,开发人员可以开发自己的cginclude文件
2:常用的cginc文件:
HLSL.Support.cginc 协助多平台开发的一些宏等,自动包含
UnityShaderVarirables.cginc 全局变量,自动包含;
UnityCG.cginc 常用的帮助函数;
AutoLight.cginc 光照和阴影功能;
Lighting.cginc 表面着色器的光照模型;
TerrainEngine.cginc 地形植被的光照着色函数;

UnityCG.gcinc常用函数

1:UnityWorldSpaceViewDir: 给定对象空间的顶点位置朝向摄像机方向的世界坐标空间方向;
2: ObjSpaceViewDir: 给定对象空间的顶点位置朝向摄像机方向的对象空间方向;
3: ParallaxOffset: 计算用于视差法线贴图的UV偏移量;
4: Luminance: 将颜色转为亮度;
5: DecodeLightmap: 从光照贴图中解码颜色;
6: float EncodeFloatRGBA(float4 rgba): 将RGBA颜色编码为[0,1)的浮点数;
7: float4 DecodeFloatRGBA(float v): 将一个浮点数解码为RGBA的颜色;
8: UnityWorldSpaceLightDir 给定对象空间的顶点位置到光源的世界坐标空间方向;
9: ObjSpaceLightDir: 给定对象空间的顶点位置到光源的对象空间方向;

UsePass 复用

1:编写过的pass可以重复使用,借助UsePass “ShaderPath/PASS_NAME”
2:PASS名字要大写;
3: Pass {
name “ONE” //不要写到cgprogram里面
}
4: UsePass “Custom/ShaderName/ONE”

multi_compile多版本控制

1: 通过multi_compile编译多个版本的shader;
2: #pragma multi_compile MY_multi_1 MY_multi_2;
3: #ifdef MY_multi_1 #endif
4: Shader.EnableKeyword(“ MY_multi_1”);
5: Shader.DisableKeyword(“MY_multi_2”); 控制shader编译出不同的版本;

multi_compile多版本控制实例

1.打开shaders文件夹,创建一个用于顶点片元着色的shader,create---->shader---->unlit shader,重命名为MultiShader

2.打开MultiShader

第一步:先把第一行改成Shader "Custom/MultiShader",这样才能在编辑器里面显示这个shader

第二步:

Shader "Custom/MultiShader"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// 定义这个的两个开关,告诉有两个版本的shader#pragma multi_compile MY_multi_1  MY_multi_2#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col;// sample the texture#ifdef MY_multi_1//版本1col = fixed4(1.0, 0.0, 0.0, 1.0);#endif#ifdef MY_multi_2//版本2col = fixed4(0.0, 0.0, 1.0, 1.0);#endifreturn col;}ENDCG}}
}

3.创建一个材质MultiShader,设置它的shader属性为Custom/MultiShader

4.创建一个立方体cube,把材质MultiShader拖进cube

5.创建一个脚本MultiShader,挂载在立方体cube下面

打开MultiShader.cs

using UnityEngine;
using System.Collections;public class MulShader : MonoBehaviour {// Use this for initializationvoid Start () {Shader.EnableKeyword("MY_multi_2");//打开版本2Shader.DisableKeyword("MY_multi_1");//关闭版本1
    }// Update is called once per framevoid Update () {}
}

移动平台优化

1: 代码优化:
预先计算好对应的值 sqrt(2) --> 根号2 --> 1.414..;
放心的使用向量相关操作,叉积,点击,基本都是硬件实现,很高效;
尽量减少函数调用减少开销;
2: 尽可能的计算放在顶点着色器中,顶点着色器的调用频率远低于片着色器;
3: 几何复杂度考量:在IOS平台视口内的顶点数不要超过100K个,IOS默认的缓冲区就是就是这么大,超过这个数字,底层会做一些操作消耗更多的资源;
4: 纹理大小为 2^n次方大小, 16, 64, 128, 256, 512, 1024;
5: 使用适当的数据类型float < half < fixed; 性能
6: 尽量慎用透明效果,透明效果GPU要逐像素渲染,而且没有了遮挡剔除的效果,会用到Blend SrcAlpha OneMinusSrcAlpha//SrcAlpha是源因子,OneMinusSrcAlpha是目标因子,产生的各个颜色和各个因子相乘,然后两个颜色相加

转载于:https://www.cnblogs.com/HangZhe/p/7233065.html

关于Unity中GrabPass截屏的使用和Shader的组织优化相关推荐

  1. Unity中Oculus分屏相机和普通相机一键切换

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50462157 作者:car ...

  2. 直播平台开发,防止直播过程中被截屏或录屏

    直播平台开发,防止直播过程中被截屏或录屏 Activity创建时设置WindowManager.LayoutParams.FLAG_SECURE属性,该属性能防止屏幕被截图和录制.以下为修复代码示例: ...

  3. android禁止录屏功能,react-native(安卓)项目中禁止截屏与录屏

    一.整个项目中禁止截屏与录屏 在android/app/src/main/java/com/your-app-name/MainActivity.java文件中的onCreate方法中添加如下代码即可 ...

  4. iOS中的截屏(屏幕截屏及scrollView或tableView的全部截屏)

    iOS中的截屏(屏幕截屏及scrollView或tableView的全部截屏) 2017.03.16 12:18* 字数 52 阅读 563评论 4喜欢 2 1. 截取屏幕尺寸大小的图片并保存至相册 ...

  5. Android: How to Capture Screen in Gingerbread(2.3中实现截屏)

    示例代码在: frameworks\base\services\surfaceflinger\tests\screencap\screencap.cpp /** Copyright (C) 2010 ...

  6. Android: How to Capture Screen in Gingerbread(2.3中实现截屏)(续)

    在这里首先很感谢博主zmyde2010发表的这篇http://blog.csdn.net/zmyde2010/article/details/6925498#reply文章,我最开始也是看了他的文章才 ...

  7. unity中如何多屏显示

    多屏显示分两种情况: 第一种情况:unity中可以为单独的摄像机设置显示屏,例如camera1的图像显示在屏幕1,camera2的图像显示在屏幕2等等.这方面内容可以根据unity官方文档中的mult ...

  8. Android中的截屏、录屏、投屏等常用命令和工具

    1:截屏命令screencap adb shell screencap -p /sdcard/screen.png 详细使用可以使用命令adb shell screencap –v查看帮助 对应的编译 ...

  9. Unity中使用Occlusion Culling进行遮罩剔除来实现场景优化

    在Unity3D中,包含两种裁剪方式,分别是视锥体裁剪和遮挡裁剪.视锥体裁剪Unity中已经自动实现,我们可以暂时不考虑.遮挡裁剪在Unity中已经集成,只需要设置其中的部分内容即可. 要使用遮挡裁剪 ...

最新文章

  1. Ember 3.9 发布,3.8 升级为 LTS
  2. 160个Crackme030之一元一次方程
  3. 处理unsigned相减错误(BIGINT UNSIGNED value is out of range)
  4. css3 上线圆角效果
  5. Mysql---之Mysqladmin修改账号密码方式
  6. 2019第三届中国通信业物联网大会邀请函
  7. PostgreSQL备份之omniPITR
  8. l#039;oracle 酒,2011 Stellenbosch Vineyards Oracle of the Sun Shiraz, Stellenbosch, South Africa
  9. 情报使能 合作共赢 | TI INSIDE计划发布会即将开始
  10. 财务有必要学python吗-一个来自35岁职场高管的忠告:Python为什么不得不学?
  11. SPI操作flash MX25L64读写数据
  12. 通信原理笔记(樊昌信第七版)
  13. Go语言URL编码方案
  14. PS更换照片底色的方法(红底变白底为例)
  15. html网页如何限制ip访问量,Nginx 限制IP访问频率
  16. sam格式的结构和意义_SAMtools: SAM格式的处理利器
  17. 什么是遥控灯开关:工作及其应用解析
  18. C语言之用循环来打印各种各样的图案
  19. 经常“上火”者的食疗方
  20. 【艾琪出品】《计算机应用基础》【试题汇总1】

热门文章

  1. GitHub 公开 B 站寄来的 DMCA 删除通知
  2. oracle中execute函数,Oracle 动态SQL execute immediate写法 zt
  3. C#的Navigate的异常处理
  4. Angualr8 ViewChild报错
  5. span标签的鼠标滑入提示_彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽...
  6. 24秒篮球计时器mulisim12.0_奥尼尔力量有多恐怖?325磅体重把整个篮球架子拦腰折断...
  7. 关于使用layer弹出框展现echarts不显示的问题
  8. android源码使用方法,android源码中使用到的设计模式(创建型)
  9. .net mysql 序号_MYSQL如何自动为查询数据的结果编上序号详解
  10. mysql怎么避免联合查询_mysql-联合查询,连接查询