您的位置:首页 > 移动开发 > Unity3D

UnityShader之纹理贴图滚动实现(修改UV坐标)

2017-03-26 21:30 816 查看
刚打了一把彩虹6,被情景模式虐了 /(ㄒoㄒ)/

OK,物体的表面实现滚动纹理,这个技术可以用来做瀑布,河流,当然配合其他的复杂计算可以实现复杂的效果,这里只说简单的

其实思路很简单

1.不改光照,就一个主纹理,通过_Time方法,实现实时运行

2.获取UV坐标

3.UV坐标与实时变换叠加,最后apply输出

Shader "CookbookShaders/Chapter02/ScrollingUVs"
{
Properties
{
_MainTint ("Diffuse Tint", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
//控制纹理滚动的速度,初始值设为
_ScrollXSpeed ("X Scroll Speed", Range(0, 10)) = 2
_ScrollYSpeed ("Y Scroll Speed", Range(0, 10)) = 2
}

SubShader
{
//指定shader渲染非透明物体,为什么就不说了,前几篇提到了
Tags { "RenderType"="Opaque" }
LOD 200

//CG代码块
CGPROGRAM
//编译指令,定义表面着色器,和将要使用的光照模型Lambert(漫反射)
#pragma surface surf Lambert

//声明属性关联
fixed4 _MainTint;
fixed _ScrollXSpeed;
fixed _ScrollYSpeed;
sampler2D _MainTex;

//表面着色器输入结构体
struct Input
{
//主纹理的UV坐标值
//当获取到uv坐标值后,便可以通过修改在纹理上的uv坐标实现纹理滚动
float2 uv_MainTex;
};

//表面着色器 使用了标准输出结构
void surf (Input IN, inout SurfaceOutput o)
{
//创建单独的变量储存uv坐标
//最后我们会将新的变量传递给tex2D函数
fixed2 scrolledUV = IN.uv_MainTex;

//创建变量,单独储存x,y方向上的滚动速度
//也就是说单位时间内,uv在x方向上的偏移量为_ScrollXSpeed * _Time
//y同理
fixed xScrollValue = _ScrollXSpeed * _Time;
fixed yScrollValue = _ScrollYSpeed * _Time;

//应用最终的uv坐标偏移量
scrolledUV += fixed2(xScrollValue, yScrollValue);

//将变换后的uv坐标应用到纹理中
half4 c = tex2D (_MainTex, scrolledUV);

//为什么乘以_MainTint呢?大家写出来,调下_MainTint的颜色就知道了
o.Albedo = c.rgb * _MainTint;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}




这个还是挺简单的,还不知道怎么上传GIF,今天也不想弄了,有没有大哥带我玩彩虹6呢/(ㄒoㄒ)/~~(心里苦)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: