Unity3D ShaderLab 模拟纹理运动

这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果。算是创建纹理动画的基础技术之一。

所以 准备一个新的着色器文件和一个新的材质。

这次我们首先在Properties中添加一些代码:

Properties {

_MainTint("Diffuse Tint",Color)=(1,1,1,1)

_MainTex ("Base (RGB)", 2D) = "white" {}

_ScrollXOff("X Offset",Range(0,10))=2.3

_ScrollYOff("Y Offset",Range(0,10))=2.5

}

其中的_MainTex是默认就有的哦。

接下来就要同时添加位于SubShader中CGPROGRAM的变量了。

float4 _MainTint;

sampler2D _MainTex;

float _ScrollXOff;

float _ScrollYOff;

再往下,就是修改surf函数了,通过tex2D()函数来改变uv坐标。通过内置的_Time来实现动态uv。

void surf (Input IN, inout SurfaceOutput o) {

fixed2 scrollUV = IN.uv_MainTex;

fixed xOff = _ScrollXOff*_Time;

fixed yOff = _ScrollYOff*_Time;

scrollUV += fixed2(xOff,yOff);

half4 c = tex2D (_MainTex, scrollUV);

o.Albedo = c.rgb;

o.Alpha = c.a;

}

Finish 接下来就可以用刚写好的Shader在编辑器中运行观察了。

通过上面的过程看来,我们使用XY方向的参数来控制纹理2个方向的滚动速度。

在程序的开始,我们将uv的值存储在scrollUV 中,这是一个float2或者fixed2类型的变量,因为uv值是通过input结构体传入的。

当访问网格的uv时候,我们就可以使用滚动速度变量和内置的_Time变量进行纹理偏移。

说到_Time它是一个Unity游戏时钟的递增浮点值。

所以,我们可以使用它在uv方向上计算新的uv值,再把新的偏移值传递给原有的uv值,累加计算出来后传递给tex2D()作为新的uv纹理。

通过这些步骤,简单的模拟了纹理的运动效果。

code start------------------------------------------------------------

Shader "91YGame/BasicOffset" {
    Properties {
        _MainTint("Diffuse Tint",Color)=(1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _ScrollXOff("X Offset",Range(0,10))=2.3
        _ScrollYOff("Y Offset",Range(0,10))=2.5
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert

float4 _MainTint;
        sampler2D _MainTex;
        float _ScrollXOff;
        float _ScrollYOff;

struct Input {
            float2 uv_MainTex;
        };

void surf (Input IN, inout SurfaceOutput o) {
            fixed2 scrollUV = IN.uv_MainTex;
            fixed xOff = _ScrollXOff*_Time;
            fixed yOff = _ScrollYOff*_Time;
            scrollUV += fixed2(xOff,yOff);

half4 c = tex2D (_MainTex, scrollUV);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

code end--------------------------------------------------------------

时间: 01-06

Unity3D ShaderLab 模拟纹理运动的相关文章

Unity3D ShaderLab 模拟精灵动画

在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高一级的控制.但是有钱就是任性,码代码的也可以码任性啊,我们就来试试做精灵的运动动画,遍历播放每一帧. 首先呢,准备一个精灵的动画序列帧,没有的找度娘要.然后创建一个新的材质球和新的着色器.然后把准备好的序列帧图拖动到材质的纹理上. 不用多说,_MainTex ("Base (RGB)", 2D) = "white" {

Unity3D ShaderLab 使用渐变纹理着色

Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片.再把我们之前的Hlf Lambert的代码稍加修改. 1:Properties添加GUI上的图片纹理属性>_RampTex ("Ramp Texture", 2D) = "" 2:在SubShader中申明图片纹理>sampler2D _RampTex;

Unity3D ShaderLab 简单的立方体图反射

Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将他们反射到材质表面来模拟外部环境,所以我们会使用立方图[CubeMap]的6张纹理来模拟环境的色彩情况. 首先,创建Shader,创建材质球,准备立方图,双击Shader,进入代码编辑器. 从Properties 到CGPROGRAM,再到surf,本次功能较为简单,先看代码. code start

Unity3D ShaderLab 立方体图的反射遮罩

Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张问题对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的shader代码,新建一个材质球,本次修改也是数行代码而已,所以 直接看完成代码. code start -------------------------------------------------------------------- Shader "91YGame/CubeMask" 

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的方式,我们可以在同一个着色器上实现垫型表面和光亮表面,也可以使用贴图来控制镜面高光的范围或者高光强度, 以实现一个表面是广泛的镜面高光而另一面确是细小的高光. 新建一个shader,一个材质球.老规矩双击shader脚本,在编辑器中编写代码吧. 1.Properties: Properties {

Unity3D ShaderLab 各向异性高光

Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. 首先创建Shader,再创建材质球.然后双击Shader 打开编辑器. 1:修改Properties Properties { //添加属性; _MainTint("Diffuse Tint",Color)=(1,1,1,1) _MainTex ("Base (RGB)"

Unity3D ShaderLab法线贴图

Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的多边形数.法线贴图通常存储在一个普通的rgb图片,他的rgb分量分别对应了曲面法线的xyz坐标. 在Unity中,会通过UnpackNormals()函数来使用法线贴图,这使得在表面着色范围内为我们的着色器添加使用法线的过程变得更容易. 首先,创建一个shader和材质球.我们开始修改shader代

Unity3D ShaderLab 透明裁剪着色器

Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪透明. 这种透明使用一个值来简单的控制某些特定的像素无需渲染到屏幕上,所以我们也可以通过他实现一个要么完全透明或完全不透的着色器. 我们即将利用灰度的值来控制材质的透明度. 准备工作还是新建Shader Material,一张灰度变化图.同样是分分钟完成的代码,请看完成: Shader "91YGa

Unity3D ShaderLab 立方体图的菲涅尔反射

Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情况,我们接下来就来实现这种反射效果过. 还是先创建Shader和 Material,沿用上一节的立方体图.代码变动较少,直接看下面的完成代码: code start -------------------------------------------------------------------