diff --git a/src/avatar-selector.js b/src/avatar-selector.js
index 0b0aead55d1eaa6e6cd179365b1dcebec028544f..1ded01b457cd2a0d05cdd9a0ed9535b4fdd36a45 100644
--- a/src/avatar-selector.js
+++ b/src/avatar-selector.js
@@ -15,6 +15,7 @@ import "three/examples/js/loaders/GLTFLoader";
 import "./components/animation-mixer";
 import "./components/audio-feedback";
 import "./components/loop-animation";
+import "./components/gamma-factor";
 import "./gltf-component-mappings";
 import { avatars } from "./assets/avatars/avatars";
 
diff --git a/src/components/gamma-factor.js b/src/components/gamma-factor.js
new file mode 100644
index 0000000000000000000000000000000000000000..c3ffa4fce15ff11ad58cb27b1d140f1ed2e3e6e7
--- /dev/null
+++ b/src/components/gamma-factor.js
@@ -0,0 +1,43 @@
+AFRAME.registerComponent("gamma-factor", {
+  schema: {
+    gammaFactor: { type: "number", default: 2.2 }
+  },
+
+  init() {
+    const el = this.el;
+
+    if (!el.isScene) {
+      console.warn("gamma-factor component can only be applied to <a-scene>");
+    }
+  },
+
+  update(prevData) {
+    const data = this.data;
+    const sceneEl = this.el;
+    const renderer = sceneEl.renderer;
+    let needsShaderUpdate = false;
+
+    if (data.gammaFactor !== prevData.gammaFactor) {
+      renderer.gammaFactor = data.gammaFactor;
+      needsShaderUpdate = true;
+    }
+
+    if (!needsShaderUpdate || sceneEl.time === 0) {
+      return;
+    }
+
+    sceneEl.object3D.traverse(function(node) {
+      if (!node.isMesh) {
+        return;
+      }
+
+      if (Array.isArray(node.material)) {
+        node.material.forEach(function(material) {
+          material.needsUpdate = true;
+        });
+      } else {
+        node.material.needsUpdate = true;
+      }
+    });
+  }
+});
diff --git a/src/hub.html b/src/hub.html
index 601c0d52b558e0cc62cda525bd60fe7210783d51..aa2b0b31e479c8f1a8e33def1721ac15a1fd64a8 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -25,6 +25,7 @@
 
     <a-scene
         renderer="antialias: true; gammaOutput: true; sortObjects: true; physicallyCorrectLights: true;"
+        gamma-factor
         networked-scene="adapter: janus; audio: true; debug: true; connectOnLoad: false;"
         physics="gravity: -6; debug: false;"
         mute-mic="eventSrc: a-scene; toggleEvents: action_mute"
diff --git a/src/hub.js b/src/hub.js
index 592b30b01290f4cf2333adf4d69830eb478f4be6..68798e67164b8f700c74b803ca787014869e314c 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -73,6 +73,7 @@ import "./components/position-at-box-shape-border";
 import "./components/remove-networked-object-button";
 import "./components/destroy-at-extreme-distances";
 import "./components/media-loader";
+import "./components/gamma-factor";
 
 import ReactDOM from "react-dom";
 import React from "react";