Bläddra i källkod

Add alpha testing to the main GBuffer shader. Change the GBuffer layout by adding a smarter way to store emission

Panagiotis Christopoulos Charitos 3 år sedan
förälder
incheckning
d2721cf6c3
60 ändrade filer med 145 tillägg och 94 borttagningar
  1. 16 4
      AnKi/Importer/GltfImporterMaterial.cpp
  2. 2 2
      AnKi/Resource/ModelResource.cpp
  3. 27 14
      AnKi/Shaders/GBufferCommon.glsl
  4. 33 5
      AnKi/Shaders/GBufferGeneric.ankiprog
  5. 1 2
      AnKi/Shaders/GBufferGpuParticles.ankiprog
  6. 1 1
      AnKi/Shaders/LightShading.ankiprog
  7. 15 15
      AnKi/Shaders/PackFunctions.glsl
  8. 1 1
      AnKi/Shaders/TraditionalDeferredShading.ankiprog
  9. 4 4
      Samples/PhysicsPlayground/Assets/GpuSparks.ankimtl
  10. 1 1
      Samples/PhysicsPlayground/Assets/Scene.lua
  11. 1 0
      Samples/PhysicsPlayground/Assets/dynamic.ankimtl
  12. 1 0
      Samples/PhysicsPlayground/Assets/sky.ankimtl
  13. 1 0
      Samples/PhysicsPlayground/Assets/walls.001.ankimtl
  14. 1 0
      Samples/PhysicsPlayground/Assets/walls.ankimtl
  15. 1 1
      Samples/SimpleScene/Assets/Scene.lua
  16. 1 0
      Samples/SimpleScene/Assets/backWall.ankimtl
  17. 1 0
      Samples/SimpleScene/Assets/ceiling.ankimtl
  18. 1 0
      Samples/SimpleScene/Assets/floor.ankimtl
  19. 1 0
      Samples/SimpleScene/Assets/leftWall.ankimtl
  20. 1 0
      Samples/SimpleScene/Assets/light.ankimtl
  21. 1 0
      Samples/SimpleScene/Assets/rightWall.ankimtl
  22. 1 0
      Samples/SimpleScene/Assets/shortBox.ankimtl
  23. 1 0
      Samples/SimpleScene/Assets/tallBox.ankimtl
  24. 1 0
      Samples/SkeletalAnimation/Assets/Robot.001.ankimtl
  25. 1 1
      Samples/SkeletalAnimation/Assets/Scene.lua
  26. 1 0
      Samples/SkeletalAnimation/Assets/room.ankimtl
  27. 1 0
      Samples/SkeletalAnimation/Assets/room.blue.ankimtl
  28. 1 0
      Samples/SkeletalAnimation/Assets/room.green.ankimtl
  29. 1 0
      Samples/SkeletalAnimation/Assets/room.red.ankimtl
  30. 0 34
      Samples/Sponza/Assets/16___Default.ankimtl
  31. BIN
      Samples/Sponza/Assets/Cube.003.ankimesh
  32. 1 1
      Samples/Sponza/Assets/Scene.lua
  33. 1 0
      Samples/Sponza/Assets/arch.001.ankimtl
  34. 1 0
      Samples/Sponza/Assets/arch.ankimtl
  35. 1 0
      Samples/Sponza/Assets/bricks.ankimtl
  36. BIN
      Samples/Sponza/Assets/carpet.ankimesh
  37. BIN
      Samples/Sponza/Assets/carpet_lod1.ankimesh
  38. 1 0
      Samples/Sponza/Assets/ceiling.ankimtl
  39. 1 0
      Samples/Sponza/Assets/chain.ankimtl
  40. 1 0
      Samples/Sponza/Assets/column_a.ankimtl
  41. 1 0
      Samples/Sponza/Assets/column_b.ankimtl
  42. 1 0
      Samples/Sponza/Assets/column_c.ankimtl
  43. 1 0
      Samples/Sponza/Assets/details.ankimtl
  44. 1 0
      Samples/Sponza/Assets/fabric_a.ankimtl
  45. 1 0
      Samples/Sponza/Assets/fabric_c.ankimtl
  46. 1 0
      Samples/Sponza/Assets/fabric_d.ankimtl
  47. 1 0
      Samples/Sponza/Assets/fabric_e.ankimtl
  48. 1 0
      Samples/Sponza/Assets/fabric_f.ankimtl
  49. 1 0
      Samples/Sponza/Assets/flagpole.ankimtl
  50. 1 0
      Samples/Sponza/Assets/floor.ankimtl
  51. 1 0
      Samples/Sponza/Assets/leaf.ankimtl
  52. 1 0
      Samples/Sponza/Assets/lion.ankimtl
  53. 1 0
      Samples/Sponza/Assets/lion_stand.ankimtl
  54. 1 0
      Samples/Sponza/Assets/roof.ankimtl
  55. BIN
      Samples/Sponza/Assets/skybox.ankimesh
  56. 0 8
      Samples/Sponza/Assets/skybox_16___Default.ankimdl
  57. 1 0
      Samples/Sponza/Assets/vase.ankimtl
  58. 1 0
      Samples/Sponza/Assets/vase_fl.ankimtl
  59. 1 0
      Samples/Sponza/Assets/vase_hanging.ankimtl
  60. 1 0
      Samples/Sponza/Assets/vase_round.ankimtl

+ 16 - 4
AnKi/Importer/GltfImporterMaterial.cpp

@@ -5,6 +5,7 @@
 
 
 #include <AnKi/Importer/GltfImporter.h>
 #include <AnKi/Importer/GltfImporter.h>
 #include <AnKi/Resource/ImageLoader.h>
 #include <AnKi/Resource/ImageLoader.h>
+#include <AnKi/Util/WeakArray.h>
 
 
 namespace anki {
 namespace anki {
 
 
@@ -18,6 +19,7 @@ const char* MATERIAL_TEMPLATE = R"(<!-- This file is auto generated by ImporterM
 		<mutator name="NORMAL_TEX" value="%normalTexMutator%"/>
 		<mutator name="NORMAL_TEX" value="%normalTexMutator%"/>
 		<mutator name="PARALLAX" value="%parallaxMutator%"/>
 		<mutator name="PARALLAX" value="%parallaxMutator%"/>
 		<mutator name="EMISSIVE_TEX" value="%emissiveTexMutator%"/>
 		<mutator name="EMISSIVE_TEX" value="%emissiveTexMutator%"/>
+		<mutator name="ALPHA_TEST" value="%alphaTestMutator%"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>
@@ -61,13 +63,14 @@ static Error findConstantColorsInImage(CString fname, Vec4& constantColor, Gener
 	ANKI_ASSERT(iloader.getCompression() == ImageBinaryDataCompression::RAW);
 	ANKI_ASSERT(iloader.getCompression() == ImageBinaryDataCompression::RAW);
 
 
 	const U8Vec4* data = reinterpret_cast<const U8Vec4*>(&iloader.getSurface(0, 0, 0).m_data[0]);
 	const U8Vec4* data = reinterpret_cast<const U8Vec4*>(&iloader.getSurface(0, 0, 0).m_data[0]);
+	ConstWeakArray<U8Vec4> pixels(data, iloader.getWidth() * iloader.getHeight());
 
 
 	const F32 epsilon = 1.0f / 255.0f;
 	const F32 epsilon = 1.0f / 255.0f;
-	for(U32 y = 0; y < iloader.getWidth(); ++y)
+	for(U32 y = 0; y < iloader.getHeight(); ++y)
 	{
 	{
-		for(U32 x = 0; x < iloader.getHeight(); ++x)
+		for(U32 x = 0; x < iloader.getWidth(); ++x)
 		{
 		{
-			const U8Vec4& pixel = *(data + y * iloader.getWidth() + x);
+			const U8Vec4& pixel = pixels[y * iloader.getWidth() + x];
 			const Vec4 pixelf = Vec4(pixel) / 255.0f;
 			const Vec4 pixelf = Vec4(pixel) / 255.0f;
 
 
 			if(x == 0 && y == 0)
 			if(x == 0 && y == 0)
@@ -119,12 +122,20 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, RayTypeBit usedRayT
 	// Diffuse
 	// Diffuse
 	if(mtl.pbr_metallic_roughness.base_color_texture.texture)
 	if(mtl.pbr_metallic_roughness.base_color_texture.texture)
 	{
 	{
+		const CString fname = getTextureUri(mtl.pbr_metallic_roughness.base_color_texture);
+
 		StringAuto uri(m_alloc);
 		StringAuto uri(m_alloc);
-		uri.sprintf("%s%s", m_texrpath.cstr(), getTextureUri(mtl.pbr_metallic_roughness.base_color_texture).cstr());
+		uri.sprintf("%s%s", m_texrpath.cstr(), fname.cstr());
 
 
 		xml.replaceAll("%diff%",
 		xml.replaceAll("%diff%",
 					   StringAuto(m_alloc).sprintf("<input shaderVar=\"u_diffTex\" value=\"%s\"/>", uri.cstr()));
 					   StringAuto(m_alloc).sprintf("<input shaderVar=\"u_diffTex\" value=\"%s\"/>", uri.cstr()));
 		xml.replaceAll("%diffTexMutator%", "1");
 		xml.replaceAll("%diffTexMutator%", "1");
+
+		Vec4 constantColor;
+		ANKI_CHECK(findConstantColorsInImage(fname, constantColor, m_alloc));
+
+		const Bool constantAlpha = constantColor.w() >= 0.0f;
+		xml.replaceAll("%alphaTestMutator%", (constantAlpha) ? "0" : "1");
 	}
 	}
 	else
 	else
 	{
 	{
@@ -134,6 +145,7 @@ Error GltfImporter::writeMaterial(const cgltf_material& mtl, RayTypeBit usedRayT
 															 diffCol[0], diffCol[1], diffCol[2]));
 															 diffCol[0], diffCol[1], diffCol[2]));
 
 
 		xml.replaceAll("%diffTexMutator%", "0");
 		xml.replaceAll("%diffTexMutator%", "0");
+		xml.replaceAll("%alphaTestMutator%", "0");
 	}
 	}
 
 
 	// Specular color (freshnel)
 	// Specular color (freshnel)

+ 2 - 2
AnKi/Resource/ModelResource.cpp

@@ -19,12 +19,12 @@ static Bool attributeIsRequired(VertexAttributeId loc, Pass pass, Bool hasSkin)
 	}
 	}
 	else if(!hasSkin)
 	else if(!hasSkin)
 	{
 	{
-		return loc == VertexAttributeId::POSITION;
+		return loc == VertexAttributeId::POSITION || loc == VertexAttributeId::UV0;
 	}
 	}
 	else
 	else
 	{
 	{
 		return loc == VertexAttributeId::POSITION || loc == VertexAttributeId::BONE_INDICES
 		return loc == VertexAttributeId::POSITION || loc == VertexAttributeId::BONE_INDICES
-			   || loc == VertexAttributeId::BONE_WEIGHTS;
+			   || loc == VertexAttributeId::BONE_WEIGHTS || loc == VertexAttributeId::UV0;
 	}
 	}
 }
 }
 
 

+ 27 - 14
AnKi/Shaders/GBufferCommon.glsl

@@ -14,30 +14,35 @@
 // Vert input
 // Vert input
 //
 //
 #if defined(ANKI_VERTEX_SHADER)
 #if defined(ANKI_VERTEX_SHADER)
+
 layout(location = VERTEX_ATTRIBUTE_ID_POSITION) in Vec3 in_position;
 layout(location = VERTEX_ATTRIBUTE_ID_POSITION) in Vec3 in_position;
+
 #	if ANKI_PASS == PASS_GB
 #	if ANKI_PASS == PASS_GB
-layout(location = VERTEX_ATTRIBUTE_ID_UV0) in Vec2 in_uv;
 layout(location = VERTEX_ATTRIBUTE_ID_NORMAL) in Vec3 in_normal;
 layout(location = VERTEX_ATTRIBUTE_ID_NORMAL) in Vec3 in_normal;
 layout(location = VERTEX_ATTRIBUTE_ID_TANGENT) in Vec4 in_tangent;
 layout(location = VERTEX_ATTRIBUTE_ID_TANGENT) in Vec4 in_tangent;
 #	endif
 #	endif
 
 
+#	if ANKI_PASS == PASS_GB || ALPHA_TEST
+layout(location = VERTEX_ATTRIBUTE_ID_UV0) in Vec2 in_uv;
+#	endif
+
 #	if ANKI_BONES
 #	if ANKI_BONES
 layout(location = VERTEX_ATTRIBUTE_ID_BONE_WEIGHTS) in Vec4 in_boneWeights;
 layout(location = VERTEX_ATTRIBUTE_ID_BONE_WEIGHTS) in Vec4 in_boneWeights;
 layout(location = VERTEX_ATTRIBUTE_ID_BONE_INDICES) in UVec4 in_boneIndices;
 layout(location = VERTEX_ATTRIBUTE_ID_BONE_INDICES) in UVec4 in_boneIndices;
 #	endif
 #	endif
-#endif
+
+#endif // defined(ANKI_VERTEX_SHADER)
 
 
 //
 //
 // Vert out
 // Vert out
 //
 //
 #if defined(ANKI_VERTEX_SHADER)
 #if defined(ANKI_VERTEX_SHADER)
-out gl_PerVertex
-{
-	Vec4 gl_Position;
-};
 
 
-#	if ANKI_PASS == PASS_GB
+#	if ANKI_PASS == PASS_GB || ALPHA_TEST
 layout(location = 0) out Vec2 out_uv;
 layout(location = 0) out Vec2 out_uv;
+#	endif
+
+#	if ANKI_PASS == PASS_GB
 layout(location = 1) out ANKI_RP Vec3 out_normal;
 layout(location = 1) out ANKI_RP Vec3 out_normal;
 layout(location = 2) out ANKI_RP Vec3 out_tangent;
 layout(location = 2) out ANKI_RP Vec3 out_tangent;
 layout(location = 3) out Vec3 out_bitangent;
 layout(location = 3) out Vec3 out_bitangent;
@@ -52,27 +57,35 @@ layout(location = 6) out Vec3 out_normalTangentSpace;
 layout(location = 7) out Vec2 out_velocity;
 layout(location = 7) out Vec2 out_velocity;
 #		endif
 #		endif
 #	endif // ANKI_PASS == PASS_GB
 #	endif // ANKI_PASS == PASS_GB
+
 #endif // defined(ANKI_VERTEX_SHADER)
 #endif // defined(ANKI_VERTEX_SHADER)
 
 
 //
 //
 // Frag input
 // Frag input
 //
 //
-#if defined(ANKI_FRAGMENT_SHADER) && ANKI_PASS == PASS_GB
+#if defined(ANKI_FRAGMENT_SHADER)
+
+#	if ANKI_PASS == PASS_GB || ALPHA_TEST
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;
+#	endif
+
+#	if ANKI_PASS == PASS_GB
 layout(location = 1) in ANKI_RP Vec3 in_normal;
 layout(location = 1) in ANKI_RP Vec3 in_normal;
 layout(location = 2) in ANKI_RP Vec3 in_tangent;
 layout(location = 2) in ANKI_RP Vec3 in_tangent;
 layout(location = 3) in Vec3 in_bitangent;
 layout(location = 3) in Vec3 in_bitangent;
 
 
-#	if REALLY_USING_PARALLAX
+#		if REALLY_USING_PARALLAX
 layout(location = 4) in F32 in_distFromTheCamera;
 layout(location = 4) in F32 in_distFromTheCamera;
 layout(location = 5) in Vec3 in_eyeTangentSpace;
 layout(location = 5) in Vec3 in_eyeTangentSpace;
 layout(location = 6) in Vec3 in_normalTangentSpace;
 layout(location = 6) in Vec3 in_normalTangentSpace;
-#	endif
+#		endif
 
 
-#	if ANKI_VELOCITY || ANKI_BONES
+#		if ANKI_VELOCITY || ANKI_BONES
 layout(location = 7) in Vec2 in_velocity;
 layout(location = 7) in Vec2 in_velocity;
-#	endif
-#endif
+#		endif
+#	endif // ANKI_PASS == PASS_GB
+
+#endif // defined(ANKI_FRAGMENT_SHADER)
 
 
 //
 //
 // Frag out
 // Frag out
@@ -99,7 +112,7 @@ void packGBuffer(ANKI_RP Vec3 diffColor, ANKI_RP Vec3 normal, ANKI_RP Vec3 specu
 	g.m_f0 = specularColor;
 	g.m_f0 = specularColor;
 	g.m_roughness = roughness;
 	g.m_roughness = roughness;
 	g.m_subsurface = subsurface;
 	g.m_subsurface = subsurface;
-	g.m_emission = (emission.r + emission.g + emission.b) / 3.0;
+	g.m_emission = emission;
 	g.m_metallic = metallic;
 	g.m_metallic = metallic;
 	g.m_velocity = velocity;
 	g.m_velocity = velocity;
 	packGBuffer(g, out_gbuffer0, out_gbuffer1, out_gbuffer2, out_gbuffer3);
 	packGBuffer(g, out_gbuffer0, out_gbuffer1, out_gbuffer2, out_gbuffer3);

+ 33 - 5
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -15,9 +15,10 @@
 #pragma anki mutator NORMAL_TEX 0 1
 #pragma anki mutator NORMAL_TEX 0 1
 #pragma anki mutator PARALLAX 0 1
 #pragma anki mutator PARALLAX 0 1
 #pragma anki mutator EMISSIVE_TEX 0 1
 #pragma anki mutator EMISSIVE_TEX 0 1
+#pragma anki mutator ALPHA_TEST 0 1
 
 
-#pragma anki rewrite_mutation ANKI_PASS 2 DIFFUSE_TEX 1 to ANKI_PASS 2 DIFFUSE_TEX 0
-#pragma anki rewrite_mutation ANKI_PASS 3 DIFFUSE_TEX 1 to ANKI_PASS 3 DIFFUSE_TEX 0
+#pragma anki rewrite_mutation ANKI_PASS 2 DIFFUSE_TEX 1 ALPHA_TEST 0 to ANKI_PASS 2 DIFFUSE_TEX 0 ALPHA_TEST 0
+#pragma anki rewrite_mutation ANKI_PASS 3 DIFFUSE_TEX 1 ALPHA_TEST 0 to ANKI_PASS 3 DIFFUSE_TEX 0 ALPHA_TEST 0
 
 
 #pragma anki rewrite_mutation ANKI_PASS 2 SPECULAR_TEX 1 to ANKI_PASS 2 SPECULAR_TEX 0
 #pragma anki rewrite_mutation ANKI_PASS 2 SPECULAR_TEX 1 to ANKI_PASS 2 SPECULAR_TEX 0
 #pragma anki rewrite_mutation ANKI_PASS 3 SPECULAR_TEX 1 to ANKI_PASS 3 SPECULAR_TEX 0
 #pragma anki rewrite_mutation ANKI_PASS 3 SPECULAR_TEX 1 to ANKI_PASS 3 SPECULAR_TEX 0
@@ -37,13 +38,15 @@
 #pragma anki rewrite_mutation ANKI_PASS 2 PARALLAX 1 to ANKI_PASS 2 PARALLAX 0
 #pragma anki rewrite_mutation ANKI_PASS 2 PARALLAX 1 to ANKI_PASS 2 PARALLAX 0
 #pragma anki rewrite_mutation ANKI_PASS 3 PARALLAX 1 to ANKI_PASS 3 PARALLAX 0
 #pragma anki rewrite_mutation ANKI_PASS 3 PARALLAX 1 to ANKI_PASS 3 PARALLAX 0
 
 
-#define REALLY_USING_PARALLAX (PARALLAX == 1 && ANKI_PASS == 0 && ANKI_LOD == 0)
+#pragma anki rewrite_mutation ALPHA_TEST 1 DIFFUSE_TEX 0 to ALPHA_TEST 0 DIFFUSE_TEX 0
+
+#define REALLY_USING_PARALLAX (PARALLAX == 1 && ANKI_PASS == 0 && ANKI_LOD == 0 && ALPHA_TEST == 0)
 
 
 #include <AnKi/Shaders/GBufferCommon.glsl>
 #include <AnKi/Shaders/GBufferCommon.glsl>
 
 
 #pragma anki reflect u_ankiGlobalSampler
 #pragma anki reflect u_ankiGlobalSampler
 layout(set = 0, binding = 2) uniform sampler u_ankiGlobalSampler;
 layout(set = 0, binding = 2) uniform sampler u_ankiGlobalSampler;
-#if DIFFUSE_TEX == 1 && ANKI_PASS == PASS_GB
+#if DIFFUSE_TEX == 1 && (ANKI_PASS == PASS_GB || ALPHA_TEST)
 #	pragma anki reflect u_diffTex
 #	pragma anki reflect u_diffTex
 layout(set = 0, binding = 3) uniform ANKI_RP texture2D u_diffTex;
 layout(set = 0, binding = 3) uniform ANKI_RP texture2D u_diffTex;
 #	define USING_DIFF_TEX 1
 #	define USING_DIFF_TEX 1
@@ -159,11 +162,14 @@ layout(set = 0, binding = 11, row_major, std140) readonly buffer b_ankiPrevFrame
 Vec3 g_position = in_position;
 Vec3 g_position = in_position;
 #if ANKI_PASS == PASS_GB
 #if ANKI_PASS == PASS_GB
 Vec3 g_prevPosition = in_position;
 Vec3 g_prevPosition = in_position;
-Vec2 g_uv = in_uv;
 ANKI_RP Vec3 g_normal = in_normal;
 ANKI_RP Vec3 g_normal = in_normal;
 ANKI_RP Vec4 g_tangent = in_tangent;
 ANKI_RP Vec4 g_tangent = in_tangent;
 #endif
 #endif
 
 
+#if ANKI_PASS == PASS_GB || ALPHA_TEST
+Vec2 g_uv = in_uv;
+#endif
+
 // Perform skinning
 // Perform skinning
 #if ANKI_BONES
 #if ANKI_BONES
 void skinning()
 void skinning()
@@ -257,6 +263,10 @@ void main()
 #	endif
 #	endif
 #else
 #else
 	gl_Position = u_ankiPerInstance[INSTANCE_ID].m_ankiMvp * Vec4(g_position, 1.0);
 	gl_Position = u_ankiPerInstance[INSTANCE_ID].m_ankiMvp * Vec4(g_position, 1.0);
+
+#	if ALPHA_TEST
+	out_uv = g_uv;
+#	endif
 #endif
 #endif
 }
 }
 #pragma anki end
 #pragma anki end
@@ -350,6 +360,14 @@ ANKI_RP Vec3 readNormalFromTexture(ANKI_RP texture2D map, sampler sampl, highp V
 }
 }
 #endif
 #endif
 
 
+void doAlphaText(F32 alpha)
+{
+	if(alpha == 0.0)
+	{
+		discard;
+	}
+}
+
 void main()
 void main()
 {
 {
 #if ANKI_PASS == PASS_GB
 #if ANKI_PASS == PASS_GB
@@ -361,7 +379,13 @@ void main()
 #	endif
 #	endif
 
 
 #	if defined(USING_DIFF_TEX)
 #	if defined(USING_DIFF_TEX)
+#		if ALPHA_TEST
+	const ANKI_RP Vec4 diffColorA = texture(u_diffTex, u_ankiGlobalSampler, uv);
+	doAlphaText(diffColorA.a);
+	const ANKI_RP Vec3 diffColor = diffColorA.rgb;
+#		else
 	const ANKI_RP Vec3 diffColor = texture(u_diffTex, u_ankiGlobalSampler, uv).rgb;
 	const ANKI_RP Vec3 diffColor = texture(u_diffTex, u_ankiGlobalSampler, uv).rgb;
+#		endif
 #	else
 #	else
 	const ANKI_RP Vec3 diffColor = u_ankiPerDraw.m_diffColor;
 	const ANKI_RP Vec3 diffColor = u_ankiPerDraw.m_diffColor;
 #	endif
 #	endif
@@ -409,6 +433,10 @@ void main()
 	out_gbuffer2 = Vec4(0.0);
 	out_gbuffer2 = Vec4(0.0);
 	out_gbuffer3 = Vec2(0.0);
 	out_gbuffer3 = Vec2(0.0);
 #endif
 #endif
+
+#if ANKI_PASS != PASS_GB && ALPHA_TEST
+	doAlphaText(texture(u_diffTex, u_ankiGlobalSampler, in_uv).a);
+#endif
 }
 }
 
 
 #pragma anki end
 #pragma anki end

+ 1 - 2
AnKi/Shaders/GBufferGpuParticles.ankiprog

@@ -81,8 +81,7 @@ void main()
 	g.m_f0 = u_ankiPerDraw.m_specColor;
 	g.m_f0 = u_ankiPerDraw.m_specColor;
 	g.m_roughness = u_ankiPerDraw.m_roughness;
 	g.m_roughness = u_ankiPerDraw.m_roughness;
 	g.m_subsurface = 0.0;
 	g.m_subsurface = 0.0;
-	const ANKI_RP Vec3 emission = mix(u_ankiPerDraw.m_initialEmission, u_ankiPerDraw.m_finalEmission, in_lifeFactor);
-	g.m_emission = (emission.r + emission.g + emission.b) / 3.0;
+	g.m_emission = mix(u_ankiPerDraw.m_initialEmission, u_ankiPerDraw.m_finalEmission, in_lifeFactor);
 	g.m_metallic = u_ankiPerDraw.m_metallic;
 	g.m_metallic = u_ankiPerDraw.m_metallic;
 	g.m_velocity = in_velocity;
 	g.m_velocity = in_velocity;
 	packGBuffer(g, out_gbuffer0, out_gbuffer1, out_gbuffer2, out_gbuffer3);
 	packGBuffer(g, out_gbuffer0, out_gbuffer1, out_gbuffer2, out_gbuffer3);

+ 1 - 1
AnKi/Shaders/LightShading.ankiprog

@@ -88,7 +88,7 @@ void main()
 #endif
 #endif
 
 
 	// Ambient and emissive color
 	// Ambient and emissive color
-	out_color = gbuffer.m_diffuse * gbuffer.m_emission;
+	out_color = gbuffer.m_emission;
 
 
 	// Dir light
 	// Dir light
 	const ANKI_RP Vec3 viewDir = normalize(u_clusteredShading.m_cameraPosition - worldPos);
 	const ANKI_RP Vec3 viewDir = normalize(u_clusteredShading.m_cameraPosition - worldPos);

+ 15 - 15
AnKi/Shaders/PackFunctions.glsl

@@ -6,6 +6,7 @@
 #pragma once
 #pragma once
 
 
 #include <AnKi/Shaders/Common.glsl>
 #include <AnKi/Shaders/Common.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 
 
 /// Pack 3D normal to 2D vector
 /// Pack 3D normal to 2D vector
 /// See the clean code in comments in revision < r467
 /// See the clean code in comments in revision < r467
@@ -141,18 +142,22 @@ struct GbufferInfo
 	ANKI_RP F32 m_roughness;
 	ANKI_RP F32 m_roughness;
 	ANKI_RP F32 m_metallic;
 	ANKI_RP F32 m_metallic;
 	ANKI_RP F32 m_subsurface;
 	ANKI_RP F32 m_subsurface;
-	ANKI_RP F32 m_emission;
+	ANKI_RP Vec3 m_emission;
 	Vec2 m_velocity;
 	Vec2 m_velocity;
 };
 };
 
 
 // Populate the G buffer
 // Populate the G buffer
 void packGBuffer(GbufferInfo g, out Vec4 rt0, out Vec4 rt1, out Vec4 rt2, out Vec2 rt3)
 void packGBuffer(GbufferInfo g, out Vec4 rt0, out Vec4 rt1, out Vec4 rt2, out Vec2 rt3)
 {
 {
-	rt0 = Vec4(g.m_diffuse, g.m_subsurface);
-	rt1 = Vec4(g.m_roughness, g.m_metallic, g.m_f0.x, FIXED_MAX_EMISSION / ABSOLUTE_MAX_EMISSION);
+	const F32 packedSubsurfaceMetallic = packUnorm2ToUnorm1(Vec2(g.m_subsurface, g.m_metallic));
+
+	const Vec3 tonemappedEmission = invertibleTonemap(g.m_emission);
+
+	rt0 = Vec4(g.m_diffuse, packedSubsurfaceMetallic);
+	rt1 = Vec4(g.m_roughness, g.m_f0.x, tonemappedEmission.rb);
 
 
 	const Vec3 encNorm = signedOctEncode(g.m_normal);
 	const Vec3 encNorm = signedOctEncode(g.m_normal);
-	rt2 = Vec4(g.m_emission / FIXED_MAX_EMISSION, encNorm);
+	rt2 = Vec4(tonemappedEmission.g, encNorm);
 
 
 	rt3 = g.m_velocity;
 	rt3 = g.m_velocity;
 }
 }
@@ -164,7 +169,7 @@ ANKI_RP Vec3 unpackDiffuseFromGBuffer(ANKI_RP Vec4 rt0, ANKI_RP F32 metallic)
 
 
 ANKI_RP Vec3 unpackNormalFromGBuffer(ANKI_RP Vec4 rt2)
 ANKI_RP Vec3 unpackNormalFromGBuffer(ANKI_RP Vec4 rt2)
 {
 {
-	return signedOctDecode(rt2.gba);
+	return signedOctDecode(rt2.yzw);
 }
 }
 
 
 ANKI_RP F32 unpackRoughnessFromGBuffer(ANKI_RP Vec4 rt1)
 ANKI_RP F32 unpackRoughnessFromGBuffer(ANKI_RP Vec4 rt1)
@@ -174,24 +179,19 @@ ANKI_RP F32 unpackRoughnessFromGBuffer(ANKI_RP Vec4 rt1)
 	return r;
 	return r;
 }
 }
 
 
-ANKI_RP Vec3 unpackF0FromGBuffer(ANKI_RP Vec4 rt1)
-{
-	return Vec3(rt1.z);
-}
-
 // Read part of the G-buffer
 // Read part of the G-buffer
 void unpackGBufferNoVelocity(ANKI_RP Vec4 rt0, ANKI_RP Vec4 rt1, ANKI_RP Vec4 rt2, out GbufferInfo g)
 void unpackGBufferNoVelocity(ANKI_RP Vec4 rt0, ANKI_RP Vec4 rt1, ANKI_RP Vec4 rt2, out GbufferInfo g)
 {
 {
 	g.m_diffuse = rt0.xyz;
 	g.m_diffuse = rt0.xyz;
-	g.m_subsurface = rt0.w;
+	const Vec2 unpackedSubsurfaceMetallic = unpackUnorm1ToUnorm2(rt0.w);
+	g.m_subsurface = unpackedSubsurfaceMetallic.x;
+	g.m_metallic = unpackedSubsurfaceMetallic.y;
 
 
 	g.m_roughness = unpackRoughnessFromGBuffer(rt1);
 	g.m_roughness = unpackRoughnessFromGBuffer(rt1);
-	g.m_metallic = rt1.y;
-	g.m_f0 = unpackF0FromGBuffer(rt1);
-	const ANKI_RP F32 maxEmission = rt1.w * ABSOLUTE_MAX_EMISSION;
+	g.m_f0 = Vec3(rt1.y);
+	g.m_emission = invertInvertibleTonemap(Vec3(rt1.z, rt2.x, rt1.w));
 
 
 	g.m_normal = signedOctDecode(rt2.yzw);
 	g.m_normal = signedOctDecode(rt2.yzw);
-	g.m_emission = rt2.x * maxEmission;
 
 
 	g.m_velocity = Vec2(MAX_F32); // Put something random
 	g.m_velocity = Vec2(MAX_F32); // Put something random
 
 

+ 1 - 1
AnKi/Shaders/TraditionalDeferredShading.ankiprog

@@ -148,7 +148,7 @@ void main()
 	const F32 factor = shadowFactor * max(gbuffer.m_subsurface, lambert);
 	const F32 factor = shadowFactor * max(gbuffer.m_subsurface, lambert);
 #endif
 #endif
 
 
-	out_color = gbuffer.m_diffuse * gbuffer.m_emission;
+	out_color = gbuffer.m_emission;
 	out_color += (specC + diffC) * u_unis.m_diffuseColor * factor;
 	out_color += (specC + diffC) * u_unis.m_diffuseColor * factor;
 }
 }
 
 

+ 4 - 4
Samples/PhysicsPlayground/Assets/GpuSparks.ankimtl

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <?xml version="1.0" encoding="UTF-8" ?>
 <material shaderProgram="Anki/Shaders/GBufferGpuParticles.ankiprog" shadow="0">
 <material shaderProgram="Anki/Shaders/GBufferGpuParticles.ankiprog" shadow="0">
 	<inputs>
 	<inputs>
-		<input shaderVar="m_diffColor" value="1.0 0.1 0.1"/>
+		<input shaderVar="m_diffColor" value="0.0 0.0 0.0"/>
 		<input shaderVar="m_specColor" value="0.04 0.04 0.04"/>
 		<input shaderVar="m_specColor" value="0.04 0.04 0.04"/>
-		<input shaderVar="m_roughness" value="9.0"/>
+		<input shaderVar="m_roughness" value="1.0"/>
 		<input shaderVar="m_metallic" value="0.0"/>
 		<input shaderVar="m_metallic" value="0.0"/>
-		<input shaderVar="m_initialEmission" value="1024 1024 1024"/>
-		<input shaderVar="m_finalEmission" value="10 10 10"/>
+		<input shaderVar="m_initialEmission" value="200 0 0"/>
+		<input shaderVar="m_finalEmission" value="1 0 0"/>
 	</inputs>
 	</inputs>
 </material>
 </material>
 
 

+ 1 - 1
Samples/PhysicsPlayground/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: /home/godlike/src/anki/buildd/Bin/GltfImporter PhysicsPlayground.gltf ../../ -rpath Assets -texrpath Assets
+-- Generated by: /home/godlike/src/anki/buildr/Bin/GltfImporter PhysicsPlayground.gltf ../../ -rpath Assets -texrpath Assets
 local scene = getSceneGraph()
 local scene = getSceneGraph()
 local events = getEventManager()
 local events = getEventManager()
 
 

+ 1 - 0
Samples/PhysicsPlayground/Assets/dynamic.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/PhysicsPlayground/Assets/sky.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/PhysicsPlayground/Assets/walls.001.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/PhysicsPlayground/Assets/walls.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 1
Samples/SimpleScene/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: ../../../buildr/Bin/GltfImporter CornellBox.gltf /home/godlike/src/anki/Samples/SimpleScene/Assets -rpath Assets -texrpath Assets -lod-count 1
+-- Generated by: /home/godlike/src/anki/buildr/Bin/GltfImporter CornellBox.gltf . -rpath Assets -texrpath Assets
 local scene = getSceneGraph()
 local scene = getSceneGraph()
 local events = getEventManager()
 local events = getEventManager()
 
 

+ 1 - 0
Samples/SimpleScene/Assets/backWall.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/ceiling.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/floor.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/leftWall.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/light.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/rightWall.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/shortBox.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SimpleScene/Assets/tallBox.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SkeletalAnimation/Assets/Robot.001.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 1
Samples/SkeletalAnimation/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: /home/godlike/src/anki/buildd/Bin/GltfImporter droid.gltf /home/godlike/src/anki/Samples/SkeletalAnimation/Assets/ -rpath Assets -texrpath Assets
+-- Generated by: /home/godlike/src/anki/buildr/Bin/GltfImporter droid.gltf /home/godlike/src/anki/Samples/SkeletalAnimation/Assets/ -rpath Assets -texrpath Assets
 local scene = getSceneGraph()
 local scene = getSceneGraph()
 local events = getEventManager()
 local events = getEventManager()
 
 

+ 1 - 0
Samples/SkeletalAnimation/Assets/room.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SkeletalAnimation/Assets/room.blue.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SkeletalAnimation/Assets/room.green.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/SkeletalAnimation/Assets/room.red.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 0 - 34
Samples/Sponza/Assets/16___Default.ankimtl

@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!-- This file is auto generated by ImporterMaterial.cpp -->
-<material shaderProgram="AnKi/Shaders/GBufferGeneric.ankiprog">
-	<mutation>
-		<mutator name="DIFFUSE_TEX" value="0"/>
-		<mutator name="SPECULAR_TEX" value="0"/>
-		<mutator name="ROUGHNESS_TEX" value="0"/>
-		<mutator name="METAL_TEX" value="0"/>
-		<mutator name="NORMAL_TEX" value="0"/>
-		<mutator name="PARALLAX" value="0"/>
-		<mutator name="EMISSIVE_TEX" value="0"/>
-	</mutation>
-
-	<inputs>
-		
-
-		<input shaderVar="m_diffColor" value="0.588000 0.588000 0.588000"/>
-		<input shaderVar="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input shaderVar="m_roughness" value="0.500000"/>
-		<input shaderVar="m_metallic" value="0.000000"/>
-		
-		<input shaderVar="m_emission" value="0.000000 0.000000 0.000000"/>
-		<input shaderVar="m_subsurface" value="0.000000"/>
-		
-	</inputs>
-</material>
-
-<rtMaterial>
-	<rayType type="shadows" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
-		<mutation>
-			<mutator name="ALPHA_TEXTURE" value="0"/>
-		</mutation>
-	</rayType>
-</rtMaterial>

BIN
Samples/Sponza/Assets/Cube.003.ankimesh


+ 1 - 1
Samples/Sponza/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: /home/godlike/src/anki/buildd/Bin/GltfImporter sponza_crytek_7_pbr_3.0.gltf /home/godlike/src/anki/Samples/Sponza/Assets/ -rpath Assets -texrpath Assets -lod-count 2 -light-scale 0.01
+-- Generated by: /home/godlike/src/anki/buildr/Bin/GltfImporter sponza_crytek_7_pbr_3.0.gltf /home/godlike/src/anki/Samples/Sponza/Assets/ -rpath Assets -texrpath Assets -lod-count 2 -light-scale 0.01
 local scene = getSceneGraph()
 local scene = getSceneGraph()
 local events = getEventManager()
 local events = getEventManager()
 
 

+ 1 - 0
Samples/Sponza/Assets/arch.001.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/arch.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/bricks.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

BIN
Samples/Sponza/Assets/carpet.ankimesh


BIN
Samples/Sponza/Assets/carpet_lod1.ankimesh


+ 1 - 0
Samples/Sponza/Assets/ceiling.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/chain.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="NORMAL_TEX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/column_a.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/column_b.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/column_c.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/details.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/fabric_a.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/fabric_c.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/fabric_d.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/fabric_e.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/fabric_f.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/flagpole.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/floor.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/leaf.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="1"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/lion.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/lion_stand.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/roof.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

BIN
Samples/Sponza/Assets/skybox.ankimesh


+ 0 - 8
Samples/Sponza/Assets/skybox_16___Default.ankimdl

@@ -1,8 +0,0 @@
-<model>
-	<modelPatches>
-		<modelPatch>
-			<mesh>Assets/skybox.ankimesh</mesh>
-			<material>Assets/16___Default.ankimtl</material>
-		</modelPatch>
-	</modelPatches>
-</model>

+ 1 - 0
Samples/Sponza/Assets/vase.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/vase_fl.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="1"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/vase_hanging.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>

+ 1 - 0
Samples/Sponza/Assets/vase_round.ankimtl

@@ -9,6 +9,7 @@
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="NORMAL_TEX" value="1"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="PARALLAX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
 		<mutator name="EMISSIVE_TEX" value="0"/>
+		<mutator name="ALPHA_TEST" value="0"/>
 	</mutation>
 	</mutation>
 
 
 	<inputs>
 	<inputs>