Unity进阶之:Shader渲染
版权声明:
- 本文原创发布于博客园"优梦创客"的博客空间(网址:
http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客" - 您可以自由转载,但必须加入完整的版权声明!
shader final
PBR渲染
Vertex and Fragment Shader Instance
glass shader
1.屏幕透明
// 计算每个顶点相关的属性(位置,纹理坐标)
VertOutput vert(VertInput v)
{
VertOutput o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uvgrab = ComputeGrabScreenPos(o.vertex);
// 传入一个投影空间中的顶点坐标,此方法会计算出该顶点坐标在整个摄像机
// 此方法会以摄像机可视范围的左下角为纹理坐标0,0点,右上角为1,1点,计算出
// 当前顶点位置对应的纹理坐标
// 有了贴图的uv坐标之后就把贴图贴上去
return o;
}
half4 frag(VertOutput i) : COLOR
{
// 将Unity光栅化阶段经过顶点插值得到的片元(像素)的属性进行计算,得到每个片元的颜色值
return tex2Dproj(_GrabTexture,i.uvgrab) * 0.5;
// tex2Dproj
}

2.屏幕扭曲
bump map rgb当做xyz坐标来用的
computeGrabScreenPos
tex2dproj
struct VertInput
{
float4 vertex:POSITION;
float4 color:COLOR;
float2 texcoord:TEXCOORD;
// 一个是自身的纹理坐标,还有一个是grab贴图的坐标
};
struct VertOutput
{
float4 vertex:POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0; // _Maintex的纹理坐标
float4 uvgrab:TEXCOORD1; // BumpMap的纹理坐标
};
// 计算每个顶点相关的属性(位置,纹理坐标)
VertOutput vert(VertInput v)
{
VertOutput o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uvgrab = ComputeGrabScreenPos(o.vertex);
// 传入一个投影空间中的顶点坐标,此方法会计算出该顶点坐标在整个摄像机
// 此方法会以摄像机可视范围的左下角为纹理坐标0,0点,右上角为1,1点,计算出
// 当前顶点位置对应的纹理坐标
// 有了贴图的uv坐标之后就把贴图贴上去
o.color = v.color;
o.texcoord = v.texcoord;
return o;
}
half4 frag(VertOutput i) : COLOR
{
// 将Unity光栅化阶段经过顶点插值得到的片元(像素)的属性进行计算,得到每个片元的颜色值
half4 mainColor = tex2D(_MainTex, i.texcoord); //本身纹理采样
half4 bump = tex2D(_BumpMap, i.texcoord); // 法线贴图采样扰动值
half2 distortion = UnpackNormal(bump).rg;// 纹理值转换为法线值
i.uvgrab.xy += distortion * distortion * _Magnitude; // 对uvgrab进行扰动
fixed4 grabColor = tex2Dproj(_GrabTexture, i.uvgrab);// 玻璃背景后面的颜色
return mainColor * grabColor;
}

water shader
利用这种效果,可以对流动的水使用,也可以对火焰产生的空气流的冲击波进行模拟
Animated materials动画材质
_grabTexture // 抓取背景
_NoiseTex // 随机波纹
_CausticTex // 刻蚀纹理
float2 sinusoid(float2 x, float2 m, float2 M, float2 periodo)
{
float2 excursions = M - m;
float2 coefficiente = 3.1415 * 2.0 / periodo;
return excursions / 2.0 * (1.0 + sin(x * coefficiente)) + m;
}
half4 frag(VertOutput i) : COLOR
{
fixed4 noise = tex2D(_BumpMap,i.texcoord);
fixed4 mainColor = tex2D(_MainTex, i.texcoord);
float time = _Time[1] * 0.5; // Time.time
float2 waterDisplacement = sinusoid
(
float2(time , time) + noise.xy,
float2(-_WaterMagnitude, -_WaterMagnitude),
float2(_WaterMagnitude,_WaterMagnitude),
float2(_WaterPeriod,_WaterPeriod)
);//当前值,最小值,最大值,周期
i.uvgrab.xy += waterDisplacement;
fixed4 grabColor = tex2Dproj(_GrabTexture,i.uvgrab);
fixed4 causticColor = tex2D(_CausticTex, i.texcoord.xy*0.25 + waterDisplacement * 5);
return grabColor * mainColor * causticColor * _WaterColor;
}

screen shader and image effects
image effect
Unity进阶之:Shader渲染的更多相关文章
- unity之初识shader
自己做个总结先.当然文中很多内容都是从各位大神的文档当中看的.我只是站在巨人的肩膀上. 首先什么是shader?其实就是一个在显示屏当中的显示程序,俗称着色器.它可以定义物体在硬件显示屏当 ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- 【Unity Shaders】Shader学习资源和Surface Shader概述
写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...
- unity 内置shader
几个有用的Unity 内置shader: (一)Standard RenderingMode:Opaque为实体渲染,更改Color的透明通道不会有影响:Cutout会把图片的透明通道显示出来,非严格 ...
- CSharpGL(14)用geometry shader渲染模型的法线(normal)
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(14)用geometry shader渲染模型的法线(normal) +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 ...
- 使用替换shader渲染
相关函数: Camera.RenderWithShader(shader: Shader, replacementTag: string) 使用指定shader渲染,只影响一帧 Camera.SetR ...
- Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)
Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...
- Unity内置shader 下载
Unity内置shader 4.3.1 版本的 其他版本可以自己修改名称 下载地址 http://download.unity3d.com/download_unity/builtin_shade ...
随机推荐
- gePlugin封装成winform控件,一行代码即可加载。
将插件直接封装为控件,大大简化了GEPlugin的使用.多数常用功能也已经封装完毕,其他功能全部开放接口,直接调用即可. 1. GepluginControl控件传送门: 链接:https://pan ...
- Oracle数据库----查询
--笛卡尔集select empno,ename, 员工表.deptno, 部门表.deptno, dname from 部门表, 员工表; --添加合适的条件,可以避免笛卡尔集,从而得到正确的多表查 ...
- Hash的应用
思路:此题比较简单,直接贴代码 #include <stdio.h> int main(){ int N; ){ ]={}; ;i<N;i++){ int x; scanf(&quo ...
- EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式
目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...
- .net持续集成cake篇之cake介绍及简单示例
cake介绍 Cake 是.net平台下的一款自动化构建工具,可以完成对.net项目的编译,打包,运行单元测试,集成测试甚至发布项目等等.如果有些特征Cake没有实现,我们还可以很容易地通过扩展Cak ...
- 从动态代理到Spring AOP(上)
一.前言 虽然平时日常开发很少用到动态代理,但是动态代理在底层框架等有着非常重要的意义.比如Spring AOP使用cglib和JDK动态代理,Hibernate底层使用了javassit和cglib ...
- vue+element项目中使用el-dialog弹出Tree控件报错问题
1. 按正常的点击按钮,显示dialog弹出的Tree控件,然后把该条数据下的已经选中的checkbox , 用setCheckedNodes或者setCheckedKeys方法选择上 , 报下面这个 ...
- 最好的导航分割栏,分割线,实现底部透明,纯css
<div class="Ui_Ct_Line padding_5"> <div>为您推荐</div> </div> .Ui_Ct_L ...
- python函数知识二 动态参数、函数的注释、名称空间、函数的嵌套、global,nonlocal
6.函数的动态参数 *args,**kwargs:能接受动态的位置参数和动态的关键字参数 *args -- tuple *kwargs -- dict 动态参数优先级:位置参数 > 动态位置参数 ...
- MsgWaitForMultipleObjects
Use caution when calling the wait functions and code that directly or indirectly creates windows. If ...