shader篇-渲染纹理


  • shader篇-渲染纹理

    • 背景
    • 镜子效果
    • 玻璃效果
    • 渲染纹理对比GrabPass

背景

Unity为渲染目标纹理定义了一种专门的纹理类型————渲染纹理。
渲染纹理有2种方式:
1.Project目录下创建渲染纹理,把摄像机渲染目标设置成该渲染纹理。这样摄像头的渲染结果就会实时更新到渲染纹理中,而不会显示在屏幕上。
2.在屏幕后处理时使用GrabPass命令或OnRenderImage函数来获取当前屏幕图像,unity会把这个屏幕图像放到一张和屏幕分辨率等同的渲染纹理中。

镜子效果

使用第一种方法
完整代码

Properties {_MainTex ("Main Tex", 2D) = "white" {}}SubShader {Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;struct a2v {float4 vertex : POSITION;float3 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float2 uv : TEXCOORD0;};v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;//翻转了x分量的纹理坐标o.uv.x = 1 - o.uv.x;return o;}fixed4 frag(v2f i) : SV_Target {return tex2D(_MainTex, i.uv);}ENDCG}} FallBack Off

玻璃效果

使用第二种方法

创建立方体纹理后对纹理进行修改
属性

Properties {_MainTex ("Main Tex", 2D) = "white" {}//玻璃的法线纹理_BumpMap ("Normal Map", 2D) = "bump" {}_Cubemap ("Environment Cubemap", Cube) = "_Skybox" {}//控制模拟折射时图像的扭曲程度_Distortion ("Distortion", Range(0, 100)) = 10//控制折射程度_RefractAmount ("Refract Amount", Range(0.0, 1.0)) = 1.0
}

配置
RenderType设置成queue,确保物体渲染时,其他不透明物体已经渲染到屏幕上

GrabPass定义一个抓取屏幕图像的pass

SubShader {Tags { "Queue"="Transparent" "RenderType"="Opaque" }GrabPass { "_RefractionTex" }Pass {      CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpMap;float4 _BumpMap_ST;samplerCUBE _Cubemap;float _Distortion;fixed _RefractAmount;sampler2D _RefractionTex;//纹理纹素大小float4 _RefractionTex_TexelSize;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT; float2 texcoord: TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float4 scrPos : TEXCOORD0;float4 uv : TEXCOORD1;float4 TtoW0 : TEXCOORD2;  float4 TtoW1 : TEXCOORD3;  float4 TtoW2 : TEXCOORD4; };

顶点着色器

v2f vert (a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);//得到应被抓取的屏幕图像的采样坐标o.scrPos = ComputeGrabScreenPos(o.pos);o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);o.uv.zw = TRANSFORM_TEX(v.texcoord, _BumpMap);float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;  fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);  fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w; o.TtoW0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);  o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);  o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);  return o;
}

片元着色器

fixed4 frag (v2f i) : SV_Target {       float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));fixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));   //对屏幕图像采样坐标进行偏移,模拟折射效果float2 offset = bump.xy * _Distortion * _RefractionTex_TexelSize.xy;i.scrPos.xy = offset * i.scrPos.z + i.scrPos.xy;fixed3 refrCol = tex2D(_RefractionTex, i.scrPos.xy/i.scrPos.w).rgb;//从切线空间变换到世界空间bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));fixed3 reflDir = reflect(-worldViewDir, bump);fixed4 texColor = tex2D(_MainTex, i.uv.xy);fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb * texColor.rgb;//利用_RefractAmount属性对反射和折射颜色进行混合,作为最后的输出fixed3 finalColor = reflCol * (1 - _RefractAmount) + refrCol * _RefractAmount;return fixed4(finalColor, 1);
}

渲染纹理对比GrabPass

GrabPass实现简单,渲染纹理效率高,在移动设备支持好
GrabPass不会重新渲染场景,需要从CPU读取后备缓存数据,在移动设备上比较耗时

shader篇-渲染纹理相关推荐

  1. 【Unity Shader】渲染纹理实现镜子效果

    1 基本概念 1.1 什么是渲染到纹理? 全称是Render To Texture,<入门精要>好像又把渲染目标纹理,即Render Target Texture也叫做RTT,但我认为&l ...

  2. 【Unity Shader】渲染纹理(镜子与玻璃)

    一般来说,一个摄像机的渲染结果会输出到颜色缓冲之中,并显示到我们的屏幕上.现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(RTT),而不是传统的帧缓冲或者后备缓冲.与之相关的是 ...

  3. unity shader利用渲染纹理实现玻璃效果

    实现方法: 通过cubemap实现反射效果 通过GrabPass获取到渲染纹理,配合上法线纹理的偏移,实现玻璃的折射效果. 实现效果: 提前准备: 求得立方体所在位置的cubemap 代码: // U ...

  4. shader入门精要读书笔记23 高级纹理-渲染纹理-镜子效果、玻璃效果

    一.前言 现代GPU允许我们把整个三维场景目标渲染到一个中间缓冲中,即渲染目标纹理(RTT). 多重渲染目标(MRT),这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中,而不再需要为每个 ...

  5. Unity3D学习笔记12——渲染纹理

    文章目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实 ...

  6. (十六)unity shader之——————高级纹理之渲染纹理(镜子、玻璃效果)

    在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上.现在的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render Target Texture,RTT ...

  7. 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果

    学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...

  8. Unity Shader 卡通渲染 (五):仿日式赛璐珞风格 Shader(顶点外扩描边)

    上一篇传送门: https://blog.csdn.net/qq_27534999/article/details/101080649 一.赛璐璐风格简介 有些人可能会问,什么是赛璐珞风格? 赛璐珞是 ...

  9. 如何利用Shader来渲染游戏中的3D角色

    杨航最近在学Unity3D 本文主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader. 一.从Shader开始 ...

  10. UnityShader19.1:渲染纹理(下)之GrabPass

    接上文 :渲染纹理(上)之截屏功能实现 四.GrabPass 抓取图象 GrabPass 是 UnityShader 中的一个特殊 Pass,它的目的很简单:立刻获取当前的屏幕图象 代码也非常简单: ...

最新文章

  1. Matlab | Matlab从入门到放弃(12)——基于Matlab的特征值与奇异值分解
  2. iphone5登陆不了微信,提示“登录失败,连接失败,请检查网络设置”
  3. IPv6 相关的工作简介
  4. 糖豆人显示此服务器正在进行游戏,糖豆人服务器频繁崩溃,west滚石教技巧,蓝哥踢球做内鬼...
  5. 摘抄一篇:图的存储结构
  6. android连接airprint打印机,AirPrint:iOS的打印机
  7. [ABAP] Debug心得
  8. 字符串按照ASCII排序
  9. Elasticsearch构建全文搜索系统
  10. 预定义 宏 #define 详解
  11. 法拉克机器人自动怎么调_FANUC机器人:参考位置功能介绍与设定方法
  12. java 消息队列_JAVA-消息队列
  13. 理财入门-读《小狗钱钱》有感
  14. 【iOS】—— 懒加载
  15. 工作无聊?程序员上班没事做该怎么办!
  16. 微信版“花呗”全面开放,人人都可以申请!
  17. IDEA如何使用Drop Frame退回上一步Debug
  18. excel设置行高_手把手教你用wps表格excel制作田字格书法练习字帖
  19. 解决服务器80端口占用问题
  20. 笔记本wifi模块消失问题解决方法(win10,当你使用校园网客户端时)

热门文章

  1. ADC0804工作原理及过程
  2. c# excel插入图表
  3. 《雍正皇帝》文化专有词翻译策略的研究现状(Baker)
  4. 粉刷匠计算机音乐,音乐《粉刷匠》
  5. 计算机个性化桌面后总是恢复,Win7切换主题导致个性化桌面图标失效恢复初始的解决方法...
  6. 独木舟上的旅行(贪心算法)
  7. js控制表格实时编辑
  8. 手机号码归属地最新数据库2015年3月(附带采集更新程序)
  9. 浅谈Windows API编程 (这个经典)
  10. Unity3d将资源打包成AssetBundle 读取后材质球丢失的问题