Что-то вроде того. Затем включите смешивание, используйте режим смешивания 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), так что если вы думаете, что-то еще потому что я обязательно опубликую это и для вас. Прошу прощения за все неприятности!

Ответы на вопрос(3)

Ваш ответ на вопрос