通常模式是一个摄像机的渲染结果输出到颜色缓冲内并显示到屏幕上,现代GPU允许我们把场景渲染到一个中间缓冲(渲染目标纹理RTT),与之相关的是多重渲染目标MRT允许我们把场景同时渲染到多个渲染目标中而不需要为每个渲染目标纹理单独渲染完成的场景。应用:延迟渲染。

使用渲染纹理:

①project视图下create-render texture,将某个摄像机的渲染目标设置为该纹理,这样该相机的渲染结果就会实时更新到渲染纹理中。

②在屏幕后处理中使用GrabPass或OnRenderImage获取当前屏幕图像。

镜子效果:

创建一个平面,为其附着带有镜子shader的材质,并将创建好的渲染纹理为其添加,此外创建一个摄像机模拟镜子看到的东西,将其target texture 设置为创建好的渲染纹理。

Unity 快速实现镜子效果_辛羊华的博客-CSDN博客_unity镜子

shader:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "Shaders/AdvTex/Mirror"{Properties {_MainTex("Main Tex",2D)="white"{}}SubShader {Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass { Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma multi_compile_fwdbase #pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.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;o.uv.x=1-o.uv.x;return o;}fixed4 frag(v2f i) : SV_Target {return tex2D(_MainTex, i.uv);}ENDCG}} FallBack Off
}

注意要对x分量纹理坐标进行反转,以模拟镜子的相反效果。

玻璃效果:

前面说到一种特殊的pass---GrabPass,在shader中定义了一个grabpass后,unity会将当前屏幕的图像绘制在一个纹理中在后续的pass中访问,实现玻璃等透明材质的模拟,grabpass相比透明度混合优势为除了实现透明效果,还可以进行如模拟折射等效果。注意该物体要被设置为透明队列(Queue=Transparent),才可以保证渲染该物体是不透明物体已被绘制。

distortion用于控制模拟折射时图像的扭曲程度,refractamount表示折射程度,为0时仅有反射,注意渲染队列要设置为transparent,使用GrabPass获取屏幕图像,并定义获取到的纹理与纹素大小的变量,用于对图像采样计算坐标偏移时使用。

v2f vert (a2v v) {v2f o;o.pos = mul(UNITY_MATRIX_MVP, 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(_Object2World, 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;}

顶点着色器中完成了顶点坐标变换,ComputeGrabScreenPos得到被抓去到屏幕图存储的纹理的采样坐标,为了在frag中能够将法线方向从切线空间变换到世界空间,需要计算该矩阵,每行分别存在TtoW0,1,2中,w分量表示世界空间下的顶点坐标。

在片元着色器中,先通过矩阵的w分量得到世界坐标与视角方向,对法线纹理采样得到切线空间下的法线方向,将得到的结果与扭曲程度以及得到的纹素大小得到偏移值,切线空间下的法线方向进行偏移可以反映顶点局部空间的法线方向,对scrPos透视除法后得到真正的屏幕坐标,用这个坐标再对grab到的纹理采样,得到模拟的折射颜色,此后再从切线空间换回世界空间,计算反射方向,折射方向,用反射方向对环境纹理采样得到颜色与主纹理本身的颜色相乘得到反射颜色,最终得到的颜色为反射与折射得到的颜色关于折射程度的插值。

fixed4 frag (v2f i) : SV_Target {        float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));// Get the normal in tangent spacefixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));  // Compute the offset in tangent spacefloat2 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;// Convert the normal to world spacebump = 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;fixed3 finalColor = reflCol * (1 - _RefractAmount) + refrCol * _RefractAmount;return fixed4(finalColor, 1);}

对比:

grabpass:代码简单

渲染纹理:性能优越

UnityShader入门精要-渲染纹理 镜子 玻璃 效果相关推荐

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

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

  2. [UnityShader入门精要读书笔记]37.水波效果

    在这里,使用一张立方体纹理(cubemap)作为环境纹理,模拟反射.为了模拟折射效果,我们使用GrabPass来获取当前屏幕的渲染纹理,并使用切线空间下的法线方向对像素的屏幕坐标进行偏移,再使用该坐标 ...

  3. UnityShader入门精要——立方体纹理

    在图形学中,立方体纹理(Cubemap)是环境映射(Environment Mapping)的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的 ...

  4. UnityShader入门精要——程序纹理

    程序纹理(Procedural Texture)指的是那些由计算机生成的图像,我们通常使用一些特定的算法来创建个性化图案或非常真实的自然元素,例如木头.石子等.使用程序纹理的好处在于我们可以使用各种参 ...

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

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

  6. UnityShader入门精要——卡通风格渲染

    卡通风格是游戏中常见的一种渲染风格.使用这种风格的游戏画面通常有一些共有的特点,例如物体都被黑色的线条描边,以及分明的明暗变化等. 轮廓线渲染 ●基于观察角度和表面法线的轮廓线渲染.这种方法使用视角方 ...

  7. UnityShader入门精要-9

    目录 1. Unity的渲染路径 前向渲染路径 Unity中的前向渲染 延迟渲染 Unity的光源类型 Unity的光照衰减 Unity的阴影 1. Unity的渲染路径 Unity 5.0之前,有3 ...

  8. 《UnityShader入门精要》总结(1)理论篇

    紫色:大类概念或简短有力的总结 蓝色:细分概念或重要部分 红色:重要的补充注释 第二章:渲染流程与流程分工 渲染的流程分三个阶段: 应用阶段(开发者控制阶段) 由开发者全权进行管理,控制场景内摄像机位 ...

  9. UnityShader---高级纹理(反射、折射、菲涅尔反射、镜子\玻璃效果)(内置渲染管线)---11

    反射:代码里有阴影和衰减计算 Shader "Unlit/17" {Properties{_Color("Color",Color)=(1,1,1,1)_Ref ...

最新文章

  1. 将页面多个下拉框的值以字符串拼接方式存放至数据库一个字段中
  2. java超市管理系统项目,HR的话扎心了
  3. 腾讯Android自动化测试实战3.3.2 ListView列表遍历
  4. SAP Spartacus服务器端渲染模式下的调试方法
  5. compress后的bytearray再decode变大_笔记本电脑风扇噪音变大的原因及其解决办法
  6. 东方文学网新进作品【2】
  7. 自己构建React项目
  8. 《深入理解Linux内核》 读书笔记
  9. hbase1.3版本启动流程及优化
  10. 一步一步解决“不能上网”
  11. python黑帽子怎么样_PYTHON 黑帽子第二章总结
  12. PeckShield旗下数字资产反洗钱系统CoinHolmes亮相北京网络安全大会!
  13. android仿百度新闻,【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端实现展示...
  14. 2020李宏毅学习笔记——16.Recurrent Netural Network 下
  15. go gorm获取数据库报错:goexit: BYTE $0x90 // NOP
  16. 风影总结NHibernate1
  17. 在VS中使用Wind数据终端API的经验(一)
  18. 如何给模型加入先验知识?
  19. day_02-个人博客系统
  20. 小程序反编译 g is not defined_纹身霸气英文小短句_经典句子

热门文章

  1. 江哥带你玩转C语言 | 09 - C语言进制和位运算
  2. 如何清空c盘只剩系统_教你如何删除C盘无用文件,确保系统畅快
  3. python不运行一段代码_Python:当满足某个条件而不使用“if”语句时跳过一段代码(计算)...
  4. UI sigment的属性和方法及案例
  5. 加入百度移动联盟广告SSP美图android安卓源码 详情有演示apk
  6. 安全健康的使用计算机就要注意,家庭用电安全知识有哪些?了解一下?
  7. 机器中的灵魂会是量子比特么?
  8. 权威发布:社交电商成为下一个风口?
  9. 知乎文章收藏-发展经验
  10. ggplot2画各种误差线和森林图