浏览代码

add true sRGB support for texture.encodings.

Ben Houston 9 年之前
父节点
当前提交
15311e6b8f

+ 2 - 1
src/Three.js

@@ -309,9 +309,10 @@ THREE.TriangleFanDrawMode = 2;
 // Texture Encodings
 // Texture Encodings
 
 
 THREE.LinearEncoding = 3000; // No encoding at all.
 THREE.LinearEncoding = 3000; // No encoding at all.
-THREE.sRGBEncoding = 3001; // AKA gamma 2.2.
+THREE.sRGBEncoding = 3001;
 THREE.RGBEEncoding = 3002; // AKA Radiance
 THREE.RGBEEncoding = 3002; // AKA Radiance
 THREE.LogLuvEncoding = 3003;
 THREE.LogLuvEncoding = 3003;
 THREE.RGBM7Encoding = 3004;
 THREE.RGBM7Encoding = 3004;
 THREE.RGBM16Encoding = 3005;
 THREE.RGBM16Encoding = 3005;
 THREE.RGBDEncoding = 3006; // MaxRange is 256
 THREE.RGBDEncoding = 3006; // MaxRange is 256
+THREE.GammaEncoding = 3007; // uses GAMMA_FACTOR

+ 4 - 0
src/renderers/shaders/ShaderChunk/encoding_template.glsl

@@ -17,6 +17,8 @@
     return RGBMToLinear( value, 16.0 );
     return RGBMToLinear( value, 16.0 );
   #elif ( MACRO_DECODE == ENCODING_RGBD )
   #elif ( MACRO_DECODE == ENCODING_RGBD )
     return RGBDToLinear( value, 256.0 );
     return RGBDToLinear( value, 256.0 );
+  #elif ( MACRO_DECODE == ENCODING_Gamma )
+      return GammaToLinear( value, float( GAMMA_FACTOR ) );
   #else
   #else
     return vec4( 1.0, 0.0, 0.0, 1.0 );
     return vec4( 1.0, 0.0, 0.0, 1.0 );
   #endif
   #endif
@@ -37,6 +39,8 @@
     return LinearToRGBM( value, 16.0 );
     return LinearToRGBM( value, 16.0 );
   #elif ( MACRO_ENCODE == ENCODING_RGBD )
   #elif ( MACRO_ENCODE == ENCODING_RGBD )
     return LinearToRGBD( value, 256.0 );
     return LinearToRGBD( value, 256.0 );
+  #elif ( MACRO_ENCODE == ENCODING_Gamma )
+    return LinearToGamma( value, float( GAMMA_FACTOR ) );
   #else
   #else
     return vec4( 1.0, 0.0, 0.0, 1.0 );
     return vec4( 1.0, 0.0, 0.0, 1.0 );
   #endif
   #endif

+ 17 - 2
src/renderers/shaders/ShaderChunk/encodings.glsl

@@ -8,16 +8,31 @@
 #define ENCODING_RGBM7  3004
 #define ENCODING_RGBM7  3004
 #define ENCODING_RGBM16 3005
 #define ENCODING_RGBM16 3005
 #define ENCODING_RGBD   3006
 #define ENCODING_RGBD   3006
+#define ENCODING_Gamma  3007
 
 
 vec4 LinearToLinear( in vec4 value ) {
 vec4 LinearToLinear( in vec4 value ) {
   return value;
   return value;
 }
 }
 
 
+vec4 GammaToLinear( in vec4 value, in float gammaFactor ) {
+  return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );
+}
+vec4 LinearTosGamma( in vec4 value, in float gammaFactor ) {
+  return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );
+}
+
+float sRGBToLinear_Component( float c ) {
+    return ( c <= 0.04045 ) ? ( c * 0.0773993808 ) : pow( c * 0.9478672986 + 0.0521327014, 2.4 );
+}
+float LinearTosRGB_Component( float c ) {
+    return ( c <= 0.0031308 ) ? ( c * 12.92 ) : ( pow( c, 0.41666 ) - 0.055 );
+}
+
 vec4 sRGBToLinear( in vec4 value ) {
 vec4 sRGBToLinear( in vec4 value ) {
-  return vec4( pow( value.xyz, vec3( float( GAMMA_FACTOR ) ) ), value.w );
+  return vec4( sRGBToLinear_Component( value.r ), sRGBToLinear_Component( value.g ), sRGBToLinear_Component( value.b ), value.w );
 }
 }
 vec4 LinearTosRGB( in vec4 value ) {
 vec4 LinearTosRGB( in vec4 value ) {
-  return vec4( pow( value.xyz, vec3( 1.0 / float( GAMMA_FACTOR ) ) ), value.w );
+  return vec4( LinearTosRGB_Component( value.r ), LinearTosRGB_Component( value.g ), LinearTosRGB_Component( value.b ), value.w );
 }
 }
 
 
 vec4 RGBEToLinear( in vec4 value ) {
 vec4 RGBEToLinear( in vec4 value ) {