Qt 3D: Advanced Custom Material QML Example▲
Sélectionnez
#define FP highp
attribute FP vec3 vertexPosition;
attribute FP vec3 vertexNormal;
attribute FP vec2 vertexTexCoord;
attribute FP vec4 vertexTangent;
varying FP vec3 worldPosition;
varying FP vec3 worldNormal;
varying FP vec4 worldTangent;
varying FP vec2 texCoord;
varying FP vec2 movtexCoord;
varying FP vec2 multexCoord;
varying FP vec2 waveTexCoord;
varying FP vec2 skyTexCoord;
varying FP vec3 vpos;
uniform FP mat4 modelMatrix;
uniform FP mat3 modelNormalMatrix;
uniform FP mat4 mvp;
uniform FP float
offsetx;
uniform FP float
offsety;
uniform FP float
vertYpos;
uniform FP float
texCoordScale;
uniform FP float
waveheight;
uniform FP float
waveRandom;
void
main()
{
// Scale texture coordinates for for fragment shader
texCoord =
vertexTexCoord *
texCoordScale;
movtexCoord =
vertexTexCoord *
texCoordScale;
multexCoord =
vertexTexCoord *
(texCoordScale*
0.5
);
waveTexCoord =
vertexTexCoord *
(texCoordScale *
6.0
);
skyTexCoord =
vertexTexCoord *
(texCoordScale *
0.2
);
// Add Animated x and y Offset to SKY, MOV and MUL texCoords
movtexCoord =
vec2(texCoord.x+
offsetx,texCoord.y+
offsety);
multexCoord =
vec2(texCoord.x-
offsetx,texCoord.y+
offsety);
skyTexCoord =
vec2(texCoord.x-
(offsetx/
2.0
),texCoord.y-
(offsety/
2.0
));
// Transform position, normal, and tangent to world coords
worldPosition =
vec3(modelMatrix *
vec4(vertexPosition, 1.0
));
worldNormal =
normalize(modelNormalMatrix *
vertexNormal);
worldTangent.xyz =
normalize(vec3(modelMatrix *
vec4(vertexTangent.xyz, 0.0
)));
worldTangent.w =
vertexTangent.w;
// Calculate animated vertex positions
FP float
sinPos =
(vertexPosition.z)+
(vertexPosition.x);
FP float
sinPos2 =
(vertexPosition.y/
2.0
)+
(vertexPosition.z);
FP vec3 vertMod =
vec3(vertexPosition.x,vertexPosition.y,vertexPosition.z);
vertMod =
vec3(vertMod.x+=
sin(vertYpos*
2.2
-
sinPos2)*
waveheight,
vertMod.y=
sin(vertYpos*
2.2
+
sinPos)*
waveheight,
vertMod.z-=
sin(vertYpos*
2.2
-
cos(sinPos2))*
waveheight);
FP vec3 vertModCom =
vec3(vertMod.x+=
cos(vertYpos*
2.2
-
cos(sinPos2))*
waveheight,
vertMod.y=
sin(vertYpos*
2.2
+
cos(sinPos))*
waveheight,
vertMod.z-=
cos(vertYpos*
2.2
-
cos(sinPos))*
waveheight);
// Add wave animation only to vertices above world pos.y zero
if
(vertexPosition.y &
lt; 0.0
){
vertModCom =
vertexPosition;}
else
{
vertModCom =
vertModCom;}
vpos =
vertModCom;
// Calculate vertex position in clip coordinates
gl_Position =
mvp *
vec4(vertModCom, 1.0
);
}