// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #pragma anki mutator ANKI_TECHNIQUE 3 #pragma anki mutator ANIMATED_TEXTURE 0 1 #pragma anki mutator LIGHT 0 1 #include #pragma anki reflect AnKiLocalUniforms #pragma anki struct AnKiLocalUniforms #pragma anki member F32 m_animationPeriod if ANIMATED_TEXTURE is 1 #pragma anki member ANKI_RP Vec4 m_colorScale #pragma anki member ANKI_RP Vec4 m_colorBias #pragma anki struct end layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS) uniform b_ankiGlobalUniforms { MaterialGlobalUniforms u_ankiGlobals; }; layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_TRILINEAR_REPEAT_SAMPLER) uniform sampler u_globalSampler; layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, std430) buffer b_localUniforms { U32 u_localUniforms[]; }; layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW) uniform b_renderableGpuViews { RenderableGpuView u_renderableGpuViews[1]; }; #if ANIMATED_TEXTURE == 0 # pragma anki reflect u_diffuseMap layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL) uniform ANKI_RP texture2D u_diffuseMap; #endif #if ANIMATED_TEXTURE == 1 # pragma anki reflect u_diffuseMapArr layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL) uniform ANKI_RP texture2DArray u_diffuseMapArr; #endif #pragma anki start vert layout(location = VERTEX_ATTRIBUTE_ID_SCALE) in F32 in_scale; layout(location = VERTEX_ATTRIBUTE_ID_ALPHA) in F32 in_alpha; layout(location = 0) flat out ANKI_RP F32 out_alpha; layout(location = 1) out Vec2 out_uv; layout(location = 2) out Vec3 out_worldPos; void main() { out_uv = Vec2(gl_VertexID & 1, gl_VertexID >> 1); out_worldPos = u_ankiGlobals.m_cameraTransform * Vec4((out_uv - 0.5) * in_scale, 0.0, 0.0) + in_position; gl_Position = u_ankiGlobals.m_viewProjectionMatrix * Vec4(u_renderableGpuViews[0].m_worldTransform * Vec4(out_worldPos, 1.0), 1.0); out_alpha = in_alpha; } #pragma anki end #pragma anki start frag layout(location = 0) flat in ANKI_RP F32 in_alpha; layout(location = 1) in Vec2 in_uv; layout(location = 2) in Vec3 in_worldPos; void main() { const AnKiLocalUniforms localUniforms = loadAnKiLocalUniforms(u_localUniforms, 0u); #if ANIMATED_TEXTURE == 1 ANKI_RP Vec4 texCol = readAnimatedTextureRgba(u_diffuseMapArr, u_globalSampler, localUniforms.m_animationPeriod, in_uv, u_clusteredShading.m_time); #else ANKI_RP Vec4 texCol = texture(u_diffuseMap, u_globalSampler, in_uv); #endif #if LIGHT texCol.rgb = computeLightColorLow(texCol.rgb, in_worldPos); #endif ANKI_RP Vec4 colScale = localUniforms.m_colorScale; colScale.a *= in_alpha; particleAlpha(texCol, colScale, localUniforms.m_colorBias); } #pragma anki end