anal alfa do OpenGL ES 2.0 PNG
Estou apenas aprendendo a trabalhar com o OpenGL ES 2.0 para Android. Estou tentando simplesmente exibir uma textura no meio da tela, o que foi bastante fácil, mas não consigo fazer com que o PNG alfa funcione corretamente. A imagem será exibida com um plano de fundo preto ou a imagem inteira será mesclada levemente na cor de fundo, dependendo das configurações que eu usar.
Os tutoriais reais que eu segui para chegar a esse ponto nunca funcionaram com transparência, então tentei trabalhar no código que encontrei pesquisando e provavelmente acabei de perder uma etapa importante. Pesquisei bastante para descobrir esse problema e não vi respostas que tivessem algo que minha instalação não possui. Eu tentei todas as combinações de glBlendFunc e que não, sem sort
Eu imaginei que se eu tentasse colar todo o código que possa estar relacionado a isso, a pergunta pareceria muito inchada, então terei o maior prazer em postar qualquer pedaço de código que vocês solicitarem. Aprecio muito todas as idéias para o que devo tentar a seguir.
EDIT :: Aqui está o meu shader de fragmento, que é o que eu acredito ser a causa. Esta é a única parte em que nunca encontrei um exemplo decente para trabalhar com transparência, e tudo o mais corresponde ao que vi em outros lugare
final String fragmentShader =
"precision mediump float; \n"
+ "varying vec2 v_Color; \n"
+ "uniform sampler2D s_baseMap; \n"
+ "void main() \n"
+ "{ \n"
+ " vec4 baseColor; \n"
+ " baseColor = texture2D( s_baseMap, v_Color ); \n"
+ " gl_FragColor = baseColor; \n"
+ "} \n";
Nunca faz nada explicitamente com o alfa, é de um exemplo que não o usa, afinal, mas ainda não sei muito sobre shaders de fragmentos e porque parecia "meio que" funcionar quando mistura a imagem em segundo plano, achei que estava trabalhando com o alfa de alguma forma e acabei de ter algo errad
EDIT :: Aqui está o método "loadTexture". É mais ou menos o mesmo exemplo do livro do openGL ES 2.0 que estou tentando aprender, com algumas alterações que parecem fazer com que a imagem se aproxime mais do funcionamento corret
private int loadTexture ( InputStream is )
{
int[] textureId = new int[1];
Bitmap bitmap;
bitmap = BitmapFactory.decodeStream(is);
byte[] buffer = new byte[bitmap.getWidth() * bitmap.getHeight() * 4];
for ( int y = 0; y < bitmap.getHeight(); y++ )
for ( int x = 0; x < bitmap.getWidth(); x++ )
{
int pixel = bitmap.getPixel(x, y);
buffer[(y * bitmap.getWidth() + x) * 4 + 0] = (byte)((pixel >> 16) & 0xFF);
buffer[(y * bitmap.getWidth() + x) * 4 + 1] = (byte)((pixel >> 8) & 0xFF);
buffer[(y * bitmap.getWidth() + x) * 4 + 2] = (byte)((pixel >> 0) & 0xFF);
}
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bitmap.getWidth() * bitmap.getHeight() * 4);
byteBuffer.put(buffer).position(0);
GLES20.glGenTextures ( 1, textureId, 0 );
GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, textureId[0] );
GLES20.glTexImage2D ( GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap.getWidth(), bitmap.getHeight(), 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer );
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 );
return textureId[0];
}
Eu entendo o que o código está fazendo, mas é certo que ainda me confunde um pouco, por isso posso estar perdendo algo óbvio devido à minha falta de conheciment
Eu não vejo nenhuma outra parte do meu código que pareça que possa causar o tipo de problema que estou tendo, mas a programação está sempre cheia de inesperados (principalmente no mundo do OpenGL, ao que parece), então se você pensa em outra coisa é a causa, também não deixarei de postar isso para você. Desculpe o transtorno