Что-то вроде того. Затем включите смешивание, используйте режим смешивания src + invsrc, если не было предварительно умножено, и выполните рендеринг, вы должны получить желаемый результат.
ько учусь работать с OpenGL ES 2.0 для Android. Я пытался просто отобразить текстуру в середине экрана, что было достаточно легко, но я не могу заставить работать альфа-версию PNG. Изображение будет отображаться с черным фоном, или все изображение будет слегка смешано с цветом фона, в зависимости от настроек, которые я использую.
Реальные учебные пособия, которым я следовал, чтобы достичь этой точки, никогда не работали с прозрачностью, поэтому я попытался поработать с кодом, который я нашел путем поиска, и, вероятно, просто пропустил один важный шаг. Я искал довольно много, чтобы понять эту проблему, хотя, и я не видел ни одного ответа, который имел что-то, чего нет в моих настройках. Я попробовал каждую комбинацию glBlendFunc и что не без удачи.
Я подумал, что если я попытаюсь вставить весь код, который может быть связан с этим, вопрос будет казаться очень раздутым, поэтому я буду рад выложить любые фрагменты кода, которые вы, ребята, просите. Я был бы очень признателен за любые идеи о том, что я должен попробовать дальше.
РЕДАКТИРОВАТЬ :: Вот мой фрагментный шейдер, причина которого я считаю. Это единственная часть, которую я никогда не нашел достойного примера для работы с прозрачностью, а все остальное соответствует тому, что я видел в других местах.
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";
Он никогда ничего не делает с альфой явно, это из примера, который не использует его в конце концов, но я все еще не знаю много о фрагментных шейдерах и потому, что он, казалось, "вроде" работает, когда он смешивает изображение в на фоне я понял, что он работает с альфа-версией в какой-то форме, и у меня просто что-то не так.
РЕДАКТИРОВАТЬ :: Вот метод "loadTexture". Это примерно то же самое, что и пример из книги openGL ES 2.0, из которого я пытаюсь извлечь уроки, с некоторыми изменениями, которые, кажется, приближают изображение к правильной работе.
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];
}
Я понимаю, что делает код, но по общему признанию это все еще немного смущает меня, поэтому я могу просто упустить что-то очевидное из-за недостатка знаний.
Я не вижу каких-либо других частей моего кода, которые могут вызвать у меня проблемы, но программирование всегда полно неожиданностей (особенно в мире OpenGL), так что если вы думаете, что-то еще потому что я обязательно опубликую это и для вас. Прошу прощения за все неприятности!