Bläddra i källkod

Add linear texture support for layer

David Catuhe 5 år sedan
förälder
incheckning
55b0e5748e
2 ändrade filer med 32 tillägg och 14 borttagningar
  1. 23 14
      src/Layers/layer.ts
  2. 9 0
      src/Shaders/layer.fragment.fx

+ 23 - 14
src/Layers/layer.ts

@@ -81,7 +81,7 @@ export class Layer {
     private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};
     private _indexBuffer: Nullable<DataBuffer>;
     private _effect: Effect;
-    private _alphaTestEffect: Effect;
+    private _previousDefines: string;
 
     /**
      * An event triggered when the layer is disposed.
@@ -179,17 +179,6 @@ export class Layer {
         this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;
 
         this._createIndexBuffer();
-
-        // Effects
-        this._effect = engine.createEffect("layer",
-            [VertexBuffer.PositionKind],
-            ["textureMatrix", "color", "scale", "offset"],
-            ["textureSampler"], "");
-
-        this._alphaTestEffect = engine.createEffect("layer",
-            [VertexBuffer.PositionKind],
-            ["textureMatrix", "color", "scale", "offset"],
-            ["textureSampler"], "#define ALPHATEST");
     }
 
     private _createIndexBuffer(): void {
@@ -223,10 +212,30 @@ export class Layer {
      * Renders the layer in the scene.
      */
     public render(): void {
-        var currentEffect = this.alphaTest ? this._alphaTestEffect : this._effect;
+
+        var engine = this._scene.getEngine();
+
+        var defines = "";
+
+        if (this.alphaTest) {
+            defines = "#define ALPHATEST";
+        }
+
+        if (this.texture && !this.texture.gammaSpace) {
+            defines += "\r\n#define LINEAR";
+        }
+
+        if (this._previousDefines !== defines) {
+            this._previousDefines = defines;
+            this._effect = engine.createEffect("layer",
+                [VertexBuffer.PositionKind],
+                ["textureMatrix", "color", "scale", "offset"],
+                ["textureSampler"], defines);
+        }
+        var currentEffect = this._effect;
 
         // Check
-        if (!currentEffect.isReady() || !this.texture || !this.texture.isReady()) {
+        if (!currentEffect || !currentEffect.isReady() || !this.texture || !this.texture.isReady()) {
             return;
         }
 

+ 9 - 0
src/Shaders/layer.fragment.fx

@@ -5,13 +5,22 @@ uniform sampler2D textureSampler;
 // Color
 uniform vec4 color;
 
+// Helper functions
+#include<helperFunctions>
+
 void main(void) {
 	vec4 baseColor = texture2D(textureSampler, vUV);
+	
+#ifdef LINEAR
+	baseColor.rgb = toGammaSpace(baseColor.rgb);
+#endif
 
 #ifdef ALPHATEST
 	if (baseColor.a < 0.4)
 		discard;
 #endif
 
+
+
 	gl_FragColor = baseColor * color;
 }