For the benefit of anyone else finding themselves here.

The solution outlined here worked for me:

http://gamedev.stackexchange.com/questions/53638/android-loading-bitmaps-without-premultiplied-alpha-opengl-es-2-0

My actual implementation differs slightly from the description on gamedev 
because I was already multiplying the texture color by two different 
variable color vectors (one for the *sprite* and another global color).

Because of this I ended up passing separate *alpha* value to the shader(s) 
and forcing the alpha value on the variable colors to 1.0f.

In the end, my fragment shader looks like this:

varying float v_Alpha; // Independent alpha value to account for 
premultiplied alpha values in PNG files
...
gl_FragColor = texture2D(u_Texture, v_TexCoordinate) * u_Color * v_Color * 
v_Alpha;

u_Color is a uniform color, v_Color is variable (for the sprite) and 
v_Alpha is the single float value for alpha.

This means I can use:

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

Which accounts for the premultiplied alpha values in the PNG.

The upshot is I can continue to use the BitmapFactory to load the textures.

I can't be sure, but I suspect the artifacts I was seeing were as result of 
NOT using pre-multiplied alpha textures.

Still not sure what the blur on the textures was caused by when using 
GL_CLAMP_TO_EDGE :/

Peace out.

On Monday, September 2, 2013 6:45:23 PM UTC-7, Jason wrote:
>
> P.S.  It turns out the *blur* is from using GL_CLAMP_TO_EDGE.  Changing 
> to GL_REPEAT removes the blur even though it doesn't really make sense to 
> repeat the texture as I'm just rendering sprites as quads (triangle pairs).
>
> On Monday, September 2, 2013 6:29:17 PM UTC-7, Jason wrote:
>>
>>
>> On Monday, September 2, 2013 6:23:43 PM UTC-7, Jason wrote:
>>>
>>> I realize this is an old thread, but I'm having the same issue and the 
>>> above solutions haven't worked for me.
>>>
>>> Firstly the link to the PNGDecoder from libgdx is old and no longer 
>>> exists (libgdx appear to have re-vamped the way they load images and 
>>> tracking down where exactly the PNG decoding happens is a bit of a 
>>> nightmare)
>>>
>>> I tried directly calling GLES20.glTexImage2D using the pixels extracted 
>>> from the Bitmap (as described above), but I still get gray artifacts on the 
>>> edges of the texture.
>>>
>>> For example:
>>>
>>> The top image is the original PNG, the bottom is after rendering (taken 
>>> from screenshot)
>>>
>>>
>>> <https://lh6.googleusercontent.com/-Dyf568n0gD4/UiU4vJP80wI/AAAAAAAACsY/ygEOOrLYBao/s1600/cloud_text_problem.png>
>>>
>>> The bottom image has gray pixel artifacts around the edge.  It's also 
>>> sort of *blurry* which I can't work out either.
>>>
>>> I tried manually decoding the PNG using this:
>>>
>>> http://wiki.l33tlabs.org/bin/view/TWL/Using+the+TWL+PNGDecoder
>>>
>>> But got the same result.
>>>
>>> I'm creating the texture with:
>>>
>>> GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
>>> GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
>>> GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
>>> GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
>>> GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
>>> GLES20.GL_CLAMP_TO_EDGE);
>>> GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
>>> GLES20.GL_CLAMP_TO_EDGE);
>>>
>>> My fragment shader is pretty basic, just multiplies the texture color by 
>>> a couple of other color values I pass in:
>>>
>>> gl_FragColor = texture2D(u_Texture, v_TexCoordinate) * u_Color * v_Color;
>>>
>>> Does anyone have a clue as to:
>>>
>>> 1) How I can render/create the texture without the artifacts
>>> 2) Why the texture is kind of blurry once it's rendered.
>>>
>>> Thanks!
>>>
>>>
>>> On Sunday, September 2, 2012 11:43:59 AM UTC-7, arberg wrote:
>>>>
>>>> Hi,
>>>>
>>>> I think it would make sense that either Bitmap could be without 
>>>> premultiplied alpha, or GLUtils.texImage2D method could take as parameter 
>>>> whether to load with or without premultiplied alpha. Since you say Bitmaps 
>>>> will never be without premultiplied alpa, I suggest the latter, plus as 
>>>> you 
>>>> suggest a convenience method on the Bitmap, which returns its content in 
>>>> an 
>>>> array without premultiplied alpha.
>>>>
>>>> It makes sense to me to add the option to GLUtils.texImage2D since the 
>>>> very purpose of the GLUtils class is '... to help bridging OpenGL ES and 
>>>> Android APIs.' (javadoc class reference).
>>>>
>>>> Cheers Alex
>>>>
>>>> On Friday, 29 June 2012 21:18:59 UTC+2, Romain Guy (Google) wrote:
>>>>>
>>>>> Another big issue similar to alpha-premultiply is that 32Bit ARGB 
>>>>>> Images are changed
>>>>>> to 16Bit after scaling (especially if all alpha values are 255), 
>>>>>> without some dirty tricks.
>>>>>> This is a big issue to, it's far away from the precission needed for 
>>>>>> good normal mapping.
>>>>>>
>>>>>
>>>>> There was a bug in the scaling code that I fixed. a 32 bits image will 
>>>>> now always be scaled to another 32 bits image.
>>>>>  
>>>>>
>>>>>>
>>>>>> -- 
>>>>> Romain Guy
>>>>> Android framework engineer
>>>>> [email protected]
>>>>>
>>>>>  

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to