本部分给出通过使用顶点着色器实时改变 3D 模型中顶点的位置,以实现物体吹气膨胀、萎缩、爆炸效果的案例。
一、特效基本原理
介绍本案例的具体开发之前,首先需要了解本节案例实现吹气膨胀特效的基本原理,如下图所示:
从图中可以看出,实现膨胀特效时,由顶点着色器根据收到的参数将当前处理的顶点位置沿当前顶点的法向量方向移动一定的距离。每次处理时移动距离的大小由传入的参数控制,这样就可以非常方便地实现膨胀的效果了。
二、实现
了解了本案例的运行效果后,接下来简单介绍本案例的具体开发过程。由于本案例中的大部分代码与前面的很多案例非常类似,因此这里仅给出本案例中有代表性的部分,具体内容如下。
(1)首先介绍用于在程序运行过程中不断修改膨胀程度系数(fatFacror 变量);
( 2)接着介绍接收膨胀系数,并根据系数将顶点位置沿法向量方向移动一定距离的顶点着色器,其具体顶点着色器代码如下:
#version 450
layout (location = 0) in vec4 inPos;
layout (location = 2) in vec3 inColor;
layout (location = 3) in vec3 inNormal;
layout (binding = 0) uniform UBO
{
mat4 projection;
mat4 view;
mat4 model;
vec4 lightPos;
float uFatFactor; //膨胀系数
} ubo;
layout (location = 0) out vec3 outNormal;
layout (location = 1) out vec3 outColor;
layout (location = 2) out vec3 outEyePos;
layout (location = 3) out vec3 outLightVec;
void main()
{
outNormal = inNormal;
outColor = inColor;
outEyePos = vec3(ubo.view * ubo.model * inPos);
outLightVec = normalize(ubo.lightPos.xyz - outEyePos);
//根据膨胀系数计算顶点最终位置
gl_Position = ubo.projection * ubo.view * ubo.model * vec4(inPos.xyz+inNormal*ubo.uFatFactor,1);
}
当然你也可以更精细化计算膨胀后的法线及各类光强度,具体可参照《OpenGL ES 3.x游戏开发》。
三、爆炸
如果想实现爆照效果,那么这个模型必须是使用一个面法向量的模型,我们这加载一个面法向量的模型,可见效果: