Unity进阶之:Shader渲染

摘要:
版权声明:本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客"您可以自由转载,但必须加入完整的版权声明!shaderfinalPBR渲染VertexandFragmentShaderInstanceglassshader1.屏幕透明//计算每个顶点相关的属性(位置,纹理坐标)VertOutputv
版权声明:
  • 本文原创发布于博客园"优梦创客"的博客空间(网址: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
            }

Unity进阶之:Shader渲染第1张

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;
        }

Unity进阶之:Shader渲染第2张

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;
        }

Unity进阶之:Shader渲染第3张

screen shader and image effects

image effect

免责声明:文章转载自《Unity进阶之:Shader渲染》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++Vector使用方法WinForm 进程、线程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity面试题汇总(第一部分)

一、什么是渲染管道? 答:就是告诉GPU一些数据,经过一系列的操作,得到最终要显示的数据。渲染管道中的很多步骤,总的来说是将几何物体从一个坐标系变换到另一个坐标系中去。 主要步骤如下: 本地坐标系 -- 经过世界变换矩阵 --> 世界坐标系 -- 经过视图变换矩阵 --> 视图坐标系 -- 经过投影变换矩阵 --> 投影坐标系 -- 经过...

Unity3D研究之支持中文与本地文件的读取写入(转)

前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写。当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原来是他文件的路径写错了。开发中往往一道很难的问题解开的时候发现原来真的非常的简单,哇咔咔。 刚好在MOMO的书中也有涉及到文件的读取与写入,那么本节我将书中的部分...

【Unity优化】图形优化系列02:CPU优化

CPU在渲染管线中的工作 1)检测需要被绘制的对象 2)准备发送给GPU的指令 3)向GPU发送指令 多线程渲染 0)Unity 包含三种线程类型:主线程、渲染线程、工作线程 1)主线程:大部分的CPU工作,和部分渲染任务 2)渲染线程:专门用于CPU向GPU发送指令 3)工作线程:执行单独的任务(比如剔除、网格蒙皮) 4)不是所有平台都支持多线程渲染 多...

Unity添加视频的四种方式

两种 方式需要的前期准备时间较长,后两种 方式前期不需要准备只需要添加一个Unity内置的脚本,其中各有优劣前两种性能消耗较低后两种性能消耗较高前两种需要的时间较长后两种需要的时间较短(1).第一种方式:http://dl.pconline.com.cn/download/460355.html解压上面的文件,然后将要进行转换的 视频文件拖拽到打开的软件里面...

Unity 修改windows窗口的标题

修改windows窗口的标题名称,就是修改下图的东西:  第一种: using UnityEngine; using System; using System.Runtime.InteropServices; public class SetWindowText : MonoBehaviour { #region WIN32API del...

一、Vuforia_AR

一、AR概念: 增强现实(Augmented Reality,简称AR),是一种将虚拟信息与真实世界巧妙融合的技术,广泛运用了多媒体、三维建模、实时跟踪及注册、智能交互、传感等多种技术手段,将计算机生成的文字、图像、三维模型、音乐、视频等虚拟信息模拟仿真后,应用到真实世界中,两种信息互为补充,从而实现对真实世界的“增强”。 目前世界上主流的AR SDK提供...