Log in or register to post comments

OpenGL and Camera Preview - blending together gets “over saturated” color - Android

August 6, 2012 - 3:33pm #1

Hello everyone,

I hope someone here may help me with this problem because nobody else seems to have an idea.
I'm working on a new Galaxy S3 and found a problem that didn't occur on other phones.
My problem is strange. When drawing my OpenGL models on top of my camera image like that:

  

    mGLView = new GLSurfaceView(this);
    mGLView.setOnClickListener(InputManager.getInstance());
    GameRenderer renderer = new GameRenderer(kamera, this);
    InputManager.getInstance().currentActivity = renderer;
                
    mGLView.setEGLContextClientVersion(2);
    mGLView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
    
    setPreserveEGLContextOnPause
    mGLView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
    mGLView.setZOrderOnTop(true);
       
    mGLView.setRenderer(renderer);
    setContentView(new CameraView(this), new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    addContentView(mGLView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));


So the GLRenderer should be transparent. It actually is. It works fine for all the objects that are opaque as well as the background (where I see the image of the camera)

My problem is, when I make the pixels semi-transparent in the fragment Shader I get a weird result. The brightest pixels seem overexpose when "blending together". And it looks like they got clamped after so the value that brighter than white - loosing probably the first bit - got dark again.
So only the brightest pixels are affected.
I use a simple call like:

gl_FragColor = vec4(clamp(textureColor.rgb * lightWeighting.xyz, 0.01.0), 0.5); 

So the actual GL-Fragment is clamped and I'm pretty sure it comes from the camera preview itself.
Here is an image that describes my problem:

GL Problem

https://dl.dropbox.com/u/13527005/glProblem.jpg

I hope someone here has seen that problem before. Is there any way of "clamping" both values together since in the Shader I can only clamp the actual rendered fragment somehow. :-(
By the way: it works perfectly fine on my old Galaxy S1 and on the S2 as well.

Thank you for your help,

Tobias

Solved - partly

August 8, 2012 - 5:40am #3

Alright, I got an answer for that.
The problem was the premultiplication for the alpha values.
So in the easiest way it is enough to write:

vec3 color = clamp(textureColor.rgb * lightWeighting.xyz, 0.0, 1.0);

 

color *= 0.5; // premultiply by alpha
gl_FragColor = vec4(color, 0.5);

Even though I don't see why it worked perfectly fine on older systems and it I'm still not sure how to manage this on Gl1.0 where I can't write my own shader code.
So hope this helps to anyone who has the same problem!
Thanks,
 Tobias

Could someone test this?

August 7, 2012 - 5:32am #2

Okay, looks like nobody knows that problem. Maybe there is someone with a Galaxy S3 who might want to help me.
I made a very small test program to show this.
You may download the code here:

https://dl.dropbox.com/u/13527005/CameraGLTest.zip

or if you only want to test it you will find the .apk here:

https://dl.dropbox.com/u/13527005/CameraGLTest.apk

I would be very, very glad for any information about this. Even if you tell me it works perfectly fine on your S3. After all than I would know I have a problem with my phone!
Thank you very much for your help!

  Tobias

Log in or register to post comments