您的位置:首页 > 新闻 > 热点要闻 > Unity | Shader基础知识(第二十一集:应用-怪兽膨胀、顶点着色器和表面着色器合并)

Unity | Shader基础知识(第二十一集:应用-怪兽膨胀、顶点着色器和表面着色器合并)

2025/3/12 20:09:59 来源:https://blog.csdn.net/weixin_49427945/article/details/140792552  浏览:    关键词:Unity | Shader基础知识(第二十一集:应用-怪兽膨胀、顶点着色器和表面着色器合并)

目录

一、前言

二、资源介绍 

三、顶点着色器和表面着色器一起使用基础

1.使用表面着色器代码

2.光照选择 

3.加入顶点着色器 

4.补充表面着色器 

四、在顶点着色器中完成怪兽膨胀功能

1.膨胀原理解释

2.完成膨胀代码

1).写出需要的结构体

2).为了能控制膨胀,我们加一个参数

3).修改顶点坐标 

五、纯净代码

六、收尾


一、前言

本集主要的知识点是两个:

1.顶点着色器和表面着色器一起使用

2.做出怪兽气球膨胀效果

气球膨胀效果预览(如图1所示)

图1 气球膨胀效果

二、资源介绍 

日常操作,在讲之前介绍一下资源来源。

在unity商店中,免费资源里可以下载。(如图2所示)

图2 模型资源

导入之后,用下图的预制体就行了。(如图3所示) 

图3 怪兽预制体

我们看一下现在的模型和材质。(如图4所示) 

图4 模型和材质

我们再去仔细看一下它用的材质,发现他是标准着色器,然后有个贴图Albedo和金属贴图Metallic,没别的了。(如图5所示)

图5 模型的材质

结论:我们只需要写一个能接收光线的,带贴图的shader。

我们为了方便,待会写的shader只用他的贴图,不用金属贴图,小伙伴感兴趣可以自己加。 

三、顶点着色器和表面着色器一起使用基础

之前我们学了表面着色器,也学了顶点着色器和片元着色器,我们可以发现,顶点着色器要更自由一点,自由到什么程度,如果你仔细观察我们之前做的内容,连光照,阴影等都需要自己写

相比起来,表面着色器很多就出生自带,写起来比较容易,但不自由,你发现,我们从来没有在表面着色器里面控制过顶点

如果你又想用表面着色器写好的东西,又想去控制细节,合在一起用就行了。

1.使用表面着色器代码

首先我们先把表面着色器放进来。

//引用    //表面着色器
#pragma surface surf//名称//表面着色器常用的结构体
struct Input
{};//引入的方法
void surf(Input IN,inout SurfaceOutput o)
{}
2.光照选择 

我们使用常规的Lambert光照,所以加入Lambert。

#pragma surface surf Lambert
3.加入顶点着色器 

因为这个气球巨大化,需要更改顶点才能使用,所以我们需要加入顶点着色器vertex,起名叫vert

#pragma surface surf Lambert vertex:vert
4.补充表面着色器 

我们暂时不去管顶点着色器,我们先用表面着色器把贴图显示出来,这都是以前讲过的,就不细讲了。

Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{CGPROGRAM#pragma surface surf Lambert vertex:vertstruct Input{float2 uv_MainTex;};sampler2D _MainTex;void surf(Input IN,inout SurfaceOutput o){o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;}ENDCG}

到这里,一个显示贴图的,普通的表面着色器就完成了。 

四、在顶点着色器中完成怪兽膨胀功能

1.膨胀原理解释

常规怪兽的线框线条(如图6所示)

图6 怪兽线框

它每一个交点都是顶点,我们只要把这些点,沿着法线方向往外移动,就会出现怪兽膨胀的效果。 

2.完成膨胀代码
1).写出需要的结构体

那我们需要顶点信息vertex,需要法线normal,这里有一个没用到但是必须要写的texcoord。

我们完成这个结构体:

            struct appdata{float4 vertex : POSITION;float3 normal:NORMAL;float2 texcoord : TEXCOORD0;};
2).为了能控制膨胀,我们加一个参数

别忘了subShader中也要声明一下。

    Properties{_MainTex ("Texture", 2D) = "white" {}//控制膨胀_Amount("Extrude",Range(0,1))=0}
3).修改顶点坐标 

就是之前说的,顶点坐标加上法线坐标,但为了能控制膨胀的大小,我们乘上系数。

            void vert (inout appdata v){v.vertex.xyz +=v.normal * _Amount;}

关键步骤就都完成了~

五、纯净代码

Shader "Unlit/018"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Amount("Extrude",Range(0,1))=0}SubShader{CGPROGRAM#pragma surface surf Lambert vertex:vertstruct Input{float2 uv_MainTex;};struct appdata{float4 vertex : POSITION;float3 normal:NORMAL;float2 texcoord : TEXCOORD0;};sampler2D _MainTex;float _Amount;void vert (inout appdata v){v.vertex.xyz +=v.normal * _Amount;}void surf(Input IN,inout SurfaceOutput o){o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;}ENDCG}
}

六、收尾

最后我们创建材质,把贴图放上去,就结束啦。(如图7所示)

图7 收尾步骤

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com