效果图

ShaderJoy —— “Gamma校正”的实现 【GLSL】_2d


GLSL代码

算法比较简单,不再赘述,直接看源码和注释。

uniform sampler2D srcTex;
uniform vec3 levels;

/// Gamma 校正
vec3 gammaCorrect(vec3 color, float gamma){
return pow(color, vec3(1.0/gamma));
}

/// 对 color 进行重新映射到 min, max 之间
vec3 levelRange(vec3 color, float minInput, float maxInput){
return min(
max(color - vec3(minInput), vec3(0.0)) / (vec3(maxInput) - vec3(minInput)),
vec3(1.0));
}

vec3 finalLevels(vec3 color, float minInput, float gamma, float maxInput){
return gammaCorrect(levelRange(color, minInput, maxInput), gamma);
}

void main(){
vec2 uv = gl_FragCoord.xy / vec2(512., 512.);

vec4 texture = texture2D(srcTex, uv) ;

// 注意 minInput 和 maxInput 的取值范围为[0, 255]
vec3 adjustedLevels = finalLevels(texture.rgb, levels.x/255.0, levels.y, levels.z/255.0);

gl_FragColor = vec4(adjustedLevels,1.0);

}