一、Unity几何Shader的基本概念
Unity几何Shader可以通过对顶点进行变换和扭曲来改变物体的形状。在Shader中,我们可以使用一些内置的函数来实现这些效果,比如sin、cos、lerp等等。下面是一些常用的函数:
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
- sin(x):返回x的正弦值。
- cos(x):返回x的余弦值。
- lerp(a, b, t):返回a和b之间的插值,t的范围是0到1。
- smoothstep(a, b, t):返回a和b之间的插值,并在t接近0或1时产生平滑效果。
- pow(x, y):返回x的y次方。
二、Unity几何Shader的实现
下面我们来实现一个简单的Unity几何Shader,用来制作一个水波纹效果。首先,我们需要定义一个变量来控制水波的大小,然后在Shader中使用sin函数来实现水波的效果。代码如下:
Shader "Custom/Water" {
Properties {
_WaveSize ("Wave Size", Range(0.01, 2)) = 1
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 vertex : SV_POSITION;
};
float _WaveSize;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.vertex.y += sin(v.vertex.x * _WaveSize + _Time.y * 10) * 0.1;
o.vertex.y += sin(v.vertex.z * _WaveSize + _Time.y * 10) * 0.1;
return o;
}
fixed4 frag (v2f i) : SV_Target {
return fixed4(0, 0.5, 1, 1);
}
ENDCG
}
}
}
在上面的代码中,我们定义了一个_WaveSize变量来控制水波的大小。在vert函数中,我们使用sin函数来对顶点进行变换,实现水波的效果。在frag函数中,我们简单地返回一个固定的颜色。最后,我们将Shader保存为一个名为Water的文件。
三、Unity几何Shader的应用
我们可以将上面的Shader应用到一个平面上,然后在场景中添加一些灯光,就可以看到一个非常简单但效果不错的水波纹效果了。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Water : MonoBehaviour {
public Material waterMaterial;
// Use this for initialization
void Start () {
MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
meshRenderer.material = waterMaterial;
}
// Update is called once per frame
void Update () {
}
}
在上面的代码中,我们将Water脚本添加到一个平面上,并将waterMaterial变量设置为我们刚刚创建的Water Shader。然后,在Start函数中,我们获取MeshRenderer组件,并将其Material设置为我们刚刚创建的Material。最后,我们就可以在场景中看到一个简单的水波纹效果了。