|
@@ -4,12 +4,7 @@ const LUTShader = {
|
|
|
|
|
|
name: 'LUTShader',
|
|
name: 'LUTShader',
|
|
|
|
|
|
- defines: {
|
|
|
|
- USE_3DTEXTURE: 1,
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
uniforms: {
|
|
uniforms: {
|
|
- lut3d: { value: null },
|
|
|
|
|
|
|
|
lut: { value: null },
|
|
lut: { value: null },
|
|
lutSize: { value: 0 },
|
|
lutSize: { value: 0 },
|
|
@@ -34,45 +29,9 @@ const LUTShader = {
|
|
fragmentShader: /* glsl */`
|
|
fragmentShader: /* glsl */`
|
|
|
|
|
|
uniform float lutSize;
|
|
uniform float lutSize;
|
|
- #if USE_3DTEXTURE
|
|
|
|
- precision highp sampler3D;
|
|
|
|
- uniform sampler3D lut3d;
|
|
|
|
- #else
|
|
|
|
- uniform sampler2D lut;
|
|
|
|
-
|
|
|
|
- vec3 lutLookup( sampler2D tex, float size, vec3 rgb ) {
|
|
|
|
-
|
|
|
|
- float sliceHeight = 1.0 / size;
|
|
|
|
- float yPixelHeight = 1.0 / ( size * size );
|
|
|
|
-
|
|
|
|
- // Get the slices on either side of the sample
|
|
|
|
- float slice = rgb.b * size;
|
|
|
|
- float interp = fract( slice );
|
|
|
|
- float slice0 = slice - interp;
|
|
|
|
- float centeredInterp = interp - 0.5;
|
|
|
|
|
|
|
|
- float slice1 = slice0 + sign( centeredInterp );
|
|
|
|
-
|
|
|
|
- // Pull y sample in by half a pixel in each direction to avoid color
|
|
|
|
- // bleeding from adjacent slices.
|
|
|
|
- float greenOffset = clamp( rgb.g * sliceHeight, yPixelHeight * 0.5, sliceHeight - yPixelHeight * 0.5 );
|
|
|
|
-
|
|
|
|
- vec2 uv0 = vec2(
|
|
|
|
- rgb.r,
|
|
|
|
- slice0 * sliceHeight + greenOffset
|
|
|
|
- );
|
|
|
|
- vec2 uv1 = vec2(
|
|
|
|
- rgb.r,
|
|
|
|
- slice1 * sliceHeight + greenOffset
|
|
|
|
- );
|
|
|
|
-
|
|
|
|
- vec3 sample0 = texture2D( tex, uv0 ).rgb;
|
|
|
|
- vec3 sample1 = texture2D( tex, uv1 ).rgb;
|
|
|
|
-
|
|
|
|
- return mix( sample0, sample1, abs( centeredInterp ) );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- #endif
|
|
|
|
|
|
+ precision highp sampler3D;
|
|
|
|
+ uniform sampler3D lut;
|
|
|
|
|
|
varying vec2 vUv;
|
|
varying vec2 vUv;
|
|
uniform float intensity;
|
|
uniform float intensity;
|
|
@@ -88,15 +47,8 @@ const LUTShader = {
|
|
float halfPixelWidth = 0.5 / lutSize;
|
|
float halfPixelWidth = 0.5 / lutSize;
|
|
vec3 uvw = vec3( halfPixelWidth ) + val.rgb * ( 1.0 - pixelWidth );
|
|
vec3 uvw = vec3( halfPixelWidth ) + val.rgb * ( 1.0 - pixelWidth );
|
|
|
|
|
|
- #if USE_3DTEXTURE
|
|
|
|
-
|
|
|
|
- lutVal = vec4( texture( lut3d, uvw ).rgb, val.a );
|
|
|
|
-
|
|
|
|
- #else
|
|
|
|
|
|
|
|
- lutVal = vec4( lutLookup( lut, lutSize, uvw ), val.a );
|
|
|
|
-
|
|
|
|
- #endif
|
|
|
|
|
|
+ lutVal = vec4( texture( lut, uvw ).rgb, val.a );
|
|
|
|
|
|
gl_FragColor = vec4( mix( val, lutVal, intensity ) );
|
|
gl_FragColor = vec4( mix( val, lutVal, intensity ) );
|
|
|
|
|
|
@@ -111,31 +63,15 @@ class LUTPass extends ShaderPass {
|
|
set lut( v ) {
|
|
set lut( v ) {
|
|
|
|
|
|
const material = this.material;
|
|
const material = this.material;
|
|
|
|
+
|
|
if ( v !== this.lut ) {
|
|
if ( v !== this.lut ) {
|
|
|
|
|
|
- material.uniforms.lut3d.value = null;
|
|
|
|
material.uniforms.lut.value = null;
|
|
material.uniforms.lut.value = null;
|
|
|
|
|
|
if ( v ) {
|
|
if ( v ) {
|
|
|
|
|
|
- const is3dTextureDefine = v.isData3DTexture ? 1 : 0;
|
|
|
|
- if ( is3dTextureDefine !== material.defines.USE_3DTEXTURE ) {
|
|
|
|
-
|
|
|
|
- material.defines.USE_3DTEXTURE = is3dTextureDefine;
|
|
|
|
- material.needsUpdate = true;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
material.uniforms.lutSize.value = v.image.width;
|
|
material.uniforms.lutSize.value = v.image.width;
|
|
- if ( v.isData3DTexture ) {
|
|
|
|
-
|
|
|
|
- material.uniforms.lut3d.value = v;
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- material.uniforms.lut.value = v;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+ material.uniforms.lut.value = v;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -145,7 +81,7 @@ class LUTPass extends ShaderPass {
|
|
|
|
|
|
get lut() {
|
|
get lut() {
|
|
|
|
|
|
- return this.material.uniforms.lut.value || this.material.uniforms.lut3d.value;
|
|
|
|
|
|
+ return this.material.uniforms.lut.value;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|