diff --git a/Game.cpp b/Game.cpp
index 85226a3..04b19dd 100644
--- a/Game.cpp
+++ b/Game.cpp
@@ -99,22 +99,41 @@ void Game::LoadTextures()
 	sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
 	device->CreateSamplerState(&sampDesc, sampler.GetAddressOf());
 
+	demoCubemap = CreateCubemap(
+		device,
+		context,
+		L"Assets/Textures/Skies/planets/right.png",
+		L"Assets/Textures/Skies/planets/left.png",
+		L"Assets/Textures/Skies/planets/up.png",
+		L"Assets/Textures/Skies/planets/down.png",
+		L"Assets/Textures/Skies/planets/front.png",
+		L"Assets/Textures/Skies/planets/back.png"
+	);
+
 	materials[0]->PushSampler("BasicSampler", sampler);
+	materials[0]->PushTexture(TEXTYPE_REFLECTION, demoCubemap);
+	materials[0]->hasReflectionMap = true;
 	materials[0]->LoadTexture(L"Assets/Textures/HQGame/structure-endgame-deepfloor_albedo.png", TEXTYPE_ALBEDO, device.Get(), context.Get());
 	materials[0]->LoadTexture(L"Assets/Textures/HQGame/structure-endgame-deepfloor_specular.png", TEXTYPE_SPECULAR, device.Get(), context.Get());
 	materials[0]->LoadTexture(L"Assets/Textures/HQGame/structure-endgame-deepfloor_emissive.png", TEXTYPE_EMISSIVE, device.Get(), context.Get());
 
 	materials[1]->PushSampler("BasicSampler", sampler);
+	materials[1]->PushTexture(TEXTYPE_REFLECTION, demoCubemap);
+	materials[1]->hasReflectionMap = true;
 	materials[1]->LoadTexture(L"Assets/Textures/WithNormals/cobblestone.png", TEXTYPE_ALBEDO, device.Get(), context.Get());
 	materials[1]->LoadTexture(L"Assets/Textures/WithNormals/cobblestone_specular.png", TEXTYPE_SPECULAR, device.Get(), context.Get());
 	materials[1]->LoadTexture(L"Assets/Textures/WithNormals/cobblestone_normals.png", TEXTYPE_NORMAL, device.Get(), context.Get());
 
 	materials[2]->PushSampler("BasicSampler", sampler);
+	materials[2]->PushTexture(TEXTYPE_REFLECTION, demoCubemap);
+	materials[2]->hasReflectionMap = true;
 	materials[2]->LoadTexture(L"Assets/Textures/WithNormals/rock.png", TEXTYPE_ALBEDO, device.Get(), context.Get());
 	materials[2]->LoadTexture(L"Assets/Textures/WithNormals/rock_specular.png", TEXTYPE_SPECULAR, device.Get(), context.Get());
 	materials[2]->LoadTexture(L"Assets/Textures/WithNormals/rock_normals.png", TEXTYPE_NORMAL, device.Get(), context.Get());
 
 	materials[3]->PushSampler("BasicSampler", sampler);
+	materials[3]->PushTexture(TEXTYPE_REFLECTION, demoCubemap);
+	materials[3]->hasReflectionMap = true;
 	materials[3]->LoadTexture(L"Assets/Textures/WithNormals/cushion.png", TEXTYPE_ALBEDO, device.Get(), context.Get());
 	materials[3]->LoadTexture(L"Assets/Textures/WithNormals/cushion_specular.png", TEXTYPE_SPECULAR, device.Get(), context.Get());
 	materials[3]->LoadTexture(L"Assets/Textures/WithNormals/cushion_normals.png", TEXTYPE_NORMAL, device.Get(), context.Get());
@@ -189,16 +208,7 @@ void Game::CreateBasicGeometry()
 			shapes[0],
 			std::make_shared<SimpleVertexShader>(device, context, GetFullPathTo_Wide(L"SkyboxVertexShader.cso").c_str()),
 			std::make_shared<SimplePixelShader>(device, context, GetFullPathTo_Wide(L"SkyboxPixelShader.cso").c_str()),
-			CreateCubemap(
-				device,
-				context,
-				L"Assets/Textures/Skies/planets/right.png",
-				L"Assets/Textures/Skies/planets/left.png",
-				L"Assets/Textures/Skies/planets/up.png",
-				L"Assets/Textures/Skies/planets/down.png",
-				L"Assets/Textures/Skies/planets/front.png",
-				L"Assets/Textures/Skies/planets/back.png"
-			),
+			demoCubemap,
 			sampler,
 			device
 		);
diff --git a/Game.h b/Game.h
index 583e3fa..ceed40c 100644
--- a/Game.h
+++ b/Game.h
@@ -62,6 +62,7 @@ private:
 	// A9 Normalmaps & Cubemaps
 	std::shared_ptr<Sky> skybox;
 	Microsoft::WRL::ComPtr<ID3D11SamplerState> sampler;
+	Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> demoCubemap;
 
 	Microsoft::WRL::ComPtr<ID3D11Buffer> constantBufferVS;
 };
diff --git a/Helpers.hlsli b/Helpers.hlsli
index f674ce4..4e9a634 100644
--- a/Helpers.hlsli
+++ b/Helpers.hlsli
@@ -1,6 +1,9 @@
 #ifndef __SHADER_HELPERS__
 #define __SHADER_HELPERS__
 
+// from environment map demo
+static const float F0_NON_METAL = 0.04f;
+
 // gets view vector, needed once per shader
 float3 getView(float3 cameraPosition, float3 pixelWorldPosition)
 {
@@ -44,4 +47,11 @@ float getAttenuation(float3 pointPosition, float3 worldPosition, float3 range)
 	return attn * attn;
 }
 
+// from environment map demo
+// gets fresnel (Schlick approx.): f0 + (1-f0)(1 - (n dot v))^5
+float getFresnel(float3 normal, float3 view, float specularValue)
+{
+	return specularValue + (1 - specularValue) * pow(1 - saturate(dot(normal, view)), 5);
+}
+
 #endif
diff --git a/Material.h b/Material.h
index 1448932..3375880 100644
--- a/Material.h
+++ b/Material.h
@@ -51,11 +51,11 @@ public:
 	void									PushSampler(std::string _name, Microsoft::WRL::ComPtr<ID3D11SamplerState> _sampler);
 	void									PushTexture(std::string _name, Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> _texture);
 
-private:
 	bool									hasEmissiveMap;
 	bool									hasSpecularMap;
 	bool									hasNormalMap;
 	bool									hasReflectionMap;
+private:
 	DirectX::XMFLOAT3						tint;
 	float									roughness;
 	float									emitAmount;
diff --git a/SimplePixelShader.hlsl b/SimplePixelShader.hlsl
index 97e9b6c..7c986d6 100644
--- a/SimplePixelShader.hlsl
+++ b/SimplePixelShader.hlsl
@@ -74,5 +74,14 @@ float4 main(VertexToPixel input) : SV_TARGET
 		}
 	}
 
-	return float4(light + (emit * emitAmount), albedo.a);
+	float3 final = float3(light + (emit * emitAmount));
+
+	if (hasReflectionMap > 0)
+	{
+		float3 reflVec = getReflection(view, input.normal);
+		float3 reflCol = Reflection.Sample(BasicSampler, reflVec).rgba;
+		final = lerp(final, reflCol, getFresnel(input.normal, view, F0_NON_METAL));
+	}
+
+	return float4(final, albedo.a);
 }