ShaderLab学习小结通过Shader变换物体形状
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShaderLab学习小结通过Shader变换物体形状相关的知识,希望对你有一定的参考价值。
目的:在场景中建立plane平板,通过shader使平板在y坐标上有突起,且随y值定义不同的颜色
先看下效果:
Shader代码如下:
Shader "Custom/ChangeShapeY" {
Properties{ //定义变量,这些可在物体Inspector面板中进行调整
_R("R", range(0,5)) = 2 //半径
_Center("Center",range(-5,5)) = 0 //中心点
_Scale("Scale", range(1,5)) = 1 //缩放尺度
}
SubShader {
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float _R; //上面在Properties里定义的变量必须在这里声明,底下的程序才能用
float _Center;
float _Scale;
struct v2f {
float4 pos:POSITION;
float4 vpos:TEXCOORD0; //记录变化后的物体坐标(物体坐标系)
};
v2f vert(appdata_base v)
{
v2f o;
o.vpos = v.vertex;
//计算物体在xz平面上点与所定义的中心点 float2(_Center,_Center) 的距离
float dist = distance(o.vpos.xz, float2(_Center,_Center));
//用定义的半径减去上面求得的距离
float factor = _R - dist;
factor = factor < 0 ? 0 : factor;//判断如果小于0则等于0
o.vpos.y = factor*_Scale; //以这个值作为物体的y坐标
o.pos = mul(UNITY_MATRIX_MVP, o.vpos);//变换至投影空间
return o;
}
fixed4 frag(v2f IN):COLOR
{
//以物体y坐标来决定物体颜色的三个分量
float y = saturate(IN.vpos.y); //saturate取0到1之间的数
return fixed4(y, y, y, 1);
}
ENDCG
}
}
}
如图,定义了一个xz平面上的中心点float2(_Center,_Center)
,在中心点y坐标最高,距中心点为_R的地方y坐标降至0。且y为0时,颜色是黑,y从0到1之间为从黑到白的渐变,高于1则始终为纯白。
改变y坐标还是在物体坐标系下改变,改好后依然用UNITY_MATRIX_MVP变换到投影坐标系。
以上是关于ShaderLab学习小结通过Shader变换物体形状的主要内容,如果未能解决你的问题,请参考以下文章