如何在Android OpenGL中实现亮度与对比度联合滤镜
合并亮度与对比度滤镜的实现方案
没问题,要实现同时调节亮度和对比度且参数互不干扰的滤镜,只需要把两个效果的逻辑整合到同一个片段着色器中,同时在Java类里独立维护两个参数的状态即可。下面是完整的实现代码和关键说明:
完整代码实现
public class GlBrightnessContrastFilter extends GlFilter { // 整合了亮度和对比度逻辑的片段着色器 private static final String BRIGHTNESS_CONTRAST_FRAGMENT_SHADER = "precision mediump float;\n" + "varying vec2 vTextureCoord;\n" + "uniform lowp sampler2D sTexture;\n" + "uniform lowp float brightness;\n" + "uniform lowp float contrast;\n" + "\n" + "void main()\n" + "{\n" + " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + " // 先处理对比度,再叠加亮度,确保效果互不干扰\n" + " lowp vec3 processedColor = ((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5));\n" + " processedColor += vec3(brightness);\n" + " gl_FragColor = vec4(processedColor, textureColor.w);\n" + "}"; private float brightness = 0f; private float contrast = 1f; // 对比度默认值为1,即无效果 public GlBrightnessContrastFilter() { super(DEFAULT_VERTEX_SHADER, BRIGHTNESS_CONTRAST_FRAGMENT_SHADER); } public void setBrightness(float brightness) { this.brightness = brightness; } public void setContrast(float contrast) { this.contrast = contrast; } @Override public void onDraw() { // 同时传递亮度和对比度参数给着色器 GLES20.glUniform1f(getHandle("brightness"), this.brightness); GLES20.glUniform1f(getHandle("contrast"), this.contrast); } }
关键要点说明
- 着色器逻辑整合:在片段着色器中同时声明
brightness和contrast两个uniform变量,颜色计算时先处理对比度(基于0.5灰度值调整),再叠加亮度,这样两个效果的叠加顺序合理,不会互相影响。 - 参数独立维护:Java类中分别维护
brightness和contrast两个成员变量,各自的set方法仅修改对应参数,不会重置另一个参数的值。 - 绘制时传递所有参数:在
onDraw方法中同时设置两个uniform的值,确保每次绘制都会应用当前的亮度和对比度状态,避免修改一个参数时另一个参数的设置失效。
内容的提问来源于stack exchange,提问作者Aadi
相关产品推荐
相关产品推荐

