实现方法:

  • 通过cubemap实现反射效果
  • 通过GrabPass获取到渲染纹理,配合上法线纹理的偏移,实现玻璃的折射效果。

实现效果:

提前准备:

求得立方体所在位置的cubemap

代码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/Chapter10-GlassRefraction"
{Properties{//玻璃的材质纹理_MainTex("Main Tex",2D)="while"{}//玻璃的法线纹理_BumpMap("Normal Map",2D)="bump"{}//用于模拟立方体反射的环境纹理_CubeMap("Environment Cubemap",Cube)="_Skybox"{}//控制玻璃折射时候图像的扭曲程度,对GtabPass的扭曲处理程度_Distortion("Distortion",Range(0,100))=10//用于控制折射的占比_RefractAmount("Refract Amount",Range(0.0,1.0))=1.0}SubShader{Tags { "Queue"="Transparent" "RenderType"="Opaque" }//用GrabPass来获得当前屏幕纹理存放在_RefractionTex中,作为立方体的折射纹理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);//获取到纹理坐标存储在uv的四个float值里o.uv.xy=TRANSFORM_TEX(v.texcoord,_MainTex);o.uv.zw=TRANSFORM_TEX(v.texcoord,_BumpMap);float3 worldPos =mul(unity_ObjectToWorld,v.vertex);//世界空间下的法线,切线和副切线,用来求从切线空间到世界空间的变换矩阵fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);fixed3 worldTangent =UnityObjectToWorldDir(v.tangent.xyz);//副切线由法线和切线叉乘获得方向fixed3 worldBinormal =cross(worldNormal,worldTangent)*v.tangent.w;//变换矩阵存储,并且将世界坐标存储在w变量中,节约空间o.TtoW0=float4(worldTangent.x,worldBinormal.x,worldNormal.x,worldPos.x);o.TtoW1=float4(worldTangent.y,worldBinormal.y,worldNormal.x,worldPos.y);o.TtoW2=float4(worldTangent.z,worldBinormal.z,worldNormal.x,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;i.scrPos.xy+=offset;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;//最终的颜色是反射与折射乘以各自的权重再加在一起fixed3 finalColor =reflDir*(1-_RefractAmount)+RefrCol*_RefractAmount;return fixed4(finalColor,1.0);}ENDCG}}FallBack "Diffuse"
}

unity shader利用渲染纹理实现玻璃效果相关推荐

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

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

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

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

  3. UnityShader入门精要-渲染纹理 镜子 玻璃 效果

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

  4. [Unity]Shader利用Geometry处理实现描边效果

    1.原理 利用几何着色器,生成新的顶点,用新生成的顶点,构建描边,在用模板测试剔除原模型,如下图 灰色三角形是模型原来的一个三角面,用几何着色器,延顶点法线向外,创建出新的顶点A,B,C.已知一个面的 ...

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

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

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

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

  7. Unity Shader卡通渲染 · 高清渲染管线·HDRP

    Unity Shader卡通渲染 · 高清渲染管线·HDRP 前言 最近在研究HDRP管线中的卡通渲染,就想着能不能把官方的UCTS移植到HDRP管线里面去,说干就干,到昨天晚上上传了github,今 ...

  8. Unity Shader 卡通渲染 实时模型动画描边的研究

    前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...

  9. Unity Shader 布料渲染(丝袜)

    Unity Shader 布料渲染(丝袜) 现实中的丝袜效果 丹尼尔值 纤维的特性 分析 效果截图: Weak: Normal: Strong: 属性值定义: 丹尼尔值与拉伸程度 边缘度的计算 完整S ...

最新文章

  1. C++ 自己重写Vector
  2. linux centos7 报错: “Repository base is listed more than once in the configuration“和“没有可用软件包 xxx“ 解决方法
  3. python下载后如何使用-如何使用Python通过HTTP下载文件
  4. VTK:可视化算法之SpikeFran
  5. 动手学无人驾驶(1):交通标志识别
  6. 初级第一旬05— 蓝字观试题
  7. [有限元]利用虚位移和虚力的定义、对称性推导弹性力学公式
  8. 农行运营合规管理心得体会_农行滨州分行:夯实合规管理支撑体系的几点思考...
  9. 森林病虫防治系统 (七)
  10. 面试小能手速成,接口测试脚本如何编写?其实很简单
  11. Android:最新基于adt-bundle-windows-x86的android开发环境搭建
  12. wordpress文章发布时区时间延迟8小时解决方法
  13. 记录SpringSecurity jwt问题
  14. 【系统架构】ER图的画图规范和优化点
  15. listview 分页加载
  16. 如何0代码快速搭建教育平台,实现线上直播教学【内附源码/Demo】
  17. 分享经济的巨大潜力,加速改变新生活方式
  18. Aras Innovator-学-习-之-旅-
  19. javaweb项目实现连续3次输错密码后禁止登录
  20. 金蝶新建生产领料单,单据编号不能自动填写

热门文章

  1. layui对开关按钮回显
  2. 暑假集训第一天 枚举+模拟+前缀和+差分
  3. 序列操作神器:Seqkit
  4. 斐讯智能体脂秤S7,实时告诉你为什么胖?胖在哪里?
  5. 计算机兴趣画图活动记录,电脑绘画兴趣小组活动记录.doc
  6. 25万美金奖励章鱼未来之星 | 章鱼加速器首期 Web3.0 创业营圆满落幕
  7. html 组织结构 图表,OrgChart-简单实用的组织结构图表jQuery插件
  8. 为华生物马来酰亚胺-聚乙二醇-聚(D,L-丙交酯-co-乙交酯)PLGA-PEG-Maleimide试剂材料的作用
  9. 图表转图片——《超级处理器》应用
  10. Python编程基础(快速入门必看)