|
@@ -20,6 +20,7 @@ class ToneMapping extends ScreenShader {
|
|
|
@param var colorGradingLUT : Sampler2D;
|
|
|
@param var lutSize : Float;
|
|
|
|
|
|
+
|
|
|
@param var pixelSize : Vec2;
|
|
|
|
|
|
function fragment() {
|
|
@@ -49,19 +50,22 @@ class ToneMapping extends ScreenShader {
|
|
|
|
|
|
if( hasColorGrading ) {
|
|
|
var uv = min(color.rgb, vec3(1,1,1));
|
|
|
+ var innerWidth = lutSize - 1.0;
|
|
|
var sliceSize = 1.0 / lutSize;
|
|
|
var slicePixelSize = sliceSize / lutSize;
|
|
|
- var sliceInnerSize = slicePixelSize * (lutSize - 1.0);
|
|
|
- var blueSlice0 = min(floor(uv.b * lutSize), lutSize - 1.0);
|
|
|
- var blueSlice1 = min(blueSlice0 + 1.0, lutSize - 1.0);
|
|
|
+ var sliceInnerSize = slicePixelSize * innerWidth;
|
|
|
+ var blueSlice0 = min(floor(uv.b * innerWidth), innerWidth);
|
|
|
+ var blueSlice1 = min(blueSlice0 + 1.0, innerWidth);
|
|
|
var xOffset = slicePixelSize * 0.5 + uv.r * sliceInnerSize;
|
|
|
- var s0 = xOffset + (blueSlice0 * sliceSize);
|
|
|
- var s1 = xOffset + (blueSlice1 * sliceSize);
|
|
|
- var slice0Color = texture(colorGradingLUT, vec2(s0, uv.y)).rgb;
|
|
|
- var slice1Color = texture(colorGradingLUT, vec2(s1, uv.y)).rgb;
|
|
|
- var bOffset = mod(uv.b * lutSize, 1.0);
|
|
|
+ var yOffset = sliceSize * 0.5 + uv.g * (1.0 - sliceSize);
|
|
|
+ var s0 = vec2(xOffset + (blueSlice0 * sliceSize), yOffset);
|
|
|
+ var s1 = vec2(xOffset + (blueSlice1 * sliceSize), yOffset);
|
|
|
+ var slice0Color = texture(colorGradingLUT, s0).rgb;
|
|
|
+ var slice1Color = texture(colorGradingLUT, s1)).rgb;
|
|
|
+ var bOffset = frac(uv.b * innerWidth, 1.0);
|
|
|
var result = mix(slice0Color, slice1Color, bOffset);
|
|
|
color.rgb = result;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
pixelColor = color;
|