I'm working on a new Galaxy S3 and found a problem that didn't occur on other phones like my old Galaxy S1 or the Galaxy S2 - which has almost the same GPU as the S3. When drawing my OpenGL models on top of my camera image like this:
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. It happens even if I use a simple call like:
I get more and more convinced that it is an "overflow" for the values but how can I change this? By the way - perhaps it helps - this effect gets stronger the lower the alpha value of the fragment (the gl rendered one) is. So somehow it looks like something is compensating/normalizing the "semi transparent" values.
Is there any way of "clamping" both values together since in the Shader I can only clamp the actual rendered fragment somehow without asking for the camera preview values. :-( Thank you very much! I hope it is not a severe problem,
> I'm working on a new Galaxy S3 and found a problem that didn't occur on
> other phones like my old Galaxy S1 or the Galaxy S2 - which has almost the
> same GPU as the S3.
> When drawing my OpenGL models on top of my camera image like this:
> 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. It happens even if I use a
> simple call like:
> I get more and more convinced that it is an "overflow" for the values but
> how can I change this? By the way - perhaps it helps - this effect gets
> stronger the lower the alpha value of the fragment (the gl rendered one)
> is. So somehow it looks like something is compensating/normalizing the
> "semi transparent" values.
> Is there any way of "clamping" both values together since in the Shader I
> can only clamp the actual rendered fragment somehow without asking for the
> camera preview values. :-(
> Thank you very much! I hope it is not a severe problem,
> Tobias Reich
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscribe@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
-- Romain Guy
Android framework engineer
romain...@android.com
Okay, I will try this but after all, it happens in OpenGL 1.0 as well and there is no chance to change the shader there. What could I do there? And why did it work on older phones/android versions like the S1 and the S2 with Android 2.x?
Am Dienstag, 7. August 2012 09:08:57 UTC+2 schrieb Romain Guy (Google):
> You should output your colors with premultiplied alpha. Your code should > look like this:
> vec3 color = clamp(textureColor.rgb * lightWeighting.xyz, 0.0, 1.0); > color *= 0.5; // premultiply by alpha
> gl_FragColor = vec4(color, 0.5);
> On Mon, Aug 6, 2012 at 4:21 PM, Tobias Reich <tobias...@gmail.com<javascript:> > > wrote:
>> I'm working on a new Galaxy S3 and found a problem that didn't occur on >> other phones like my old Galaxy S1 or the Galaxy S2 - which has almost the >> same GPU as the S3. >> When drawing my OpenGL models on top of my camera image like this:
>> 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. It happens even if I use a >> simple call like:
>> I get more and more convinced that it is an "overflow" for the values but >> how can I change this? By the way - perhaps it helps - this effect gets >> stronger the lower the alpha value of the fragment (the gl rendered one) >> is. So somehow it looks like something is compensating/normalizing the >> "semi transparent" values.
>> Is there any way of "clamping" both values together since in the Shader I >> can only clamp the actual rendered fragment somehow without asking for the >> camera preview values. :-( >> Thank you very much! I hope it is not a severe problem,
>> Tobias Reich
>> -- >> You received this message because you are subscribed to the Google >> Groups "Android Developers" group. >> To post to this group, send email to android-d...@googlegroups.com<javascript:> >> To unsubscribe from this group, send email to >> android-developers+unsubscribe@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/android-developers?hl=en
Alright. I got it. Now it works. I simply didn't multiply the values! Man, you helped me a lot! Really! How can I thank you for this??? I was working on that problem for... ages! It doesn't explain why it worked perfectly fine on older machines nor does it explain what to do in OpenGL 1.0 but at least it is a solution! Thank you very much! Tobias
Am Dienstag, 7. August 2012 09:08:57 UTC+2 schrieb Romain Guy (Google):
> Okay, I will try this but after all, it happens in OpenGL 1.0 as well and
> there is no chance to change the shader there.
> What could I do there? And why did it work on older phones/android
> versions like the S1 and the S2 with Android 2.x?
> Am Dienstag, 7. August 2012 09:08:57 UTC+2 schrieb Romain Guy (Google):
>> Hi,
>> You should output your colors with premultiplied alpha. Your code should
>> look like this:
>> vec3 color = clamp(textureColor.rgb * lightWeighting.xyz, 0.0, 1.0);
>> color *= 0.5; // premultiply by alpha
>> gl_FragColor = vec4(color, 0.5);
>> On Mon, Aug 6, 2012 at 4:21 PM, Tobias Reich <tobias...@gmail.com> wrote:
>>> I'm working on a new Galaxy S3 and found a problem that didn't occur on
>>> other phones like my old Galaxy S1 or the Galaxy S2 - which has almost the
>>> same GPU as the S3.
>>> When drawing my OpenGL models on top of my camera image like this:
>>> 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. It happens even if I use a
>>> simple call like:
>>> I get more and more convinced that it is an "overflow" for the values
>>> but how can I change this? By the way - perhaps it helps - this effect gets
>>> stronger the lower the alpha value of the fragment (the gl rendered one)
>>> is. So somehow it looks like something is compensating/normalizing the
>>> "semi transparent" values.
>>> Is there any way of "clamping" both values together since in the Shader
>>> I can only clamp the actual rendered fragment somehow without asking for
>>> the camera preview values. :-(
>>> Thank you very much! I hope it is not a severe problem,
>>> Tobias Reich
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Android Developers" group.
>>> To post to this group, send email to android-d...@**googlegroups.com
>>> To unsubscribe from this group, send email to
>>> android-developers+**unsubscribe@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/**group/android-developers?hl=en<http://groups.google.com/group/android-developers?hl=en>
>> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscribe@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
-- Romain Guy
Android framework engineer
romain...@android.com
So than it was just pure "luck" it worked fine with all the previous versions? What changed? Why can't it just be like it was before? I mean, its okay now and not really a big problem. - even though I don't know where I could have seen that information in the API. Thanks anyway!