Прозрачность для PNG текстур в OpenGL 1.0 Androi - PullRequest
2 голосов
/ 06 января 2020

Несколько лет go Я программировал OpenGL 1.0 ES для Android и смог получать текстуры с прозрачностью.

Я работаю над 2D-слоем, который будет иметь квадратные спрайты (состоящие из 2 треугольников), но мне нужна прозрачность.

Когда я пытаюсь включить код, который мне показался предположим, что для этого я получаю ошибки OpenGL.

        gl.glEnable(GL10.GL_ALPHA_TEST);
        gl.glAlphaFunc(GL10.GL_GREATER,0.0f);

Вот полная функция drawFrame (GL10 gl) ...

    public void drawFrame(GL10 gl)
    {
        super.drawFrame(gl);

        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);


        gl.glEnable(GL10.GL_ALPHA_TEST);
        gl.glAlphaFunc(GL10.GL_GREATER,0.0f);

        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glTexCoordPointer(2,GL10.GL_FLOAT,0, textureBuffer);
        gl.glBindTexture(GL10.GL_TEXTURE_2D,textureID);



        //Prep the Vertices
        gl.glFrontFace(GL10.GL_CCW);        //Set the CULL direction
        gl.glEnable(GL10.GL_CULL_FACE);     //Enable culling
        gl.glCullFace(GL10.GL_BACK);        //Set which side to CULL

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glColor4f(1f,1f,1f,0f);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);


        gl.glDrawArrays(GL10.GL_TRIANGLES,0,vertexBuffer.capacity()/3);


        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisable(GL10.GL_CULL_FACE);
        gl.glDisable(GL10.GL_ALPHA_TEST);
        gl.glDisable(GL10.GL_TEXTURE_2D);
        gl.glDisable(GL10.GL_BLEND);
    }

А вот функция, которую я использую для загрузить изображение

public void LoadTexture(int resourceId, Context context, GL10 gl)
    {
        int[] textures = new int[1];

        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inScaled = false;

        Bitmap bm = BitmapFactory.decodeResource(context.getResources(),resourceId, opts);


        gl.glGenTextures(1,textures,0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D,textures[0]);

        textureID = textures[0];

        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0, bm, 0);
        bm.recycle();
    }

1 Ответ

1 голос
/ 06 января 2020

OpenGL ES 1.x различает профиль Common и Common-Lite. См. Спецификация OpenGL ES 1.0.02 - Приложение A .
Хотя Alpha-Test поддерживается в общем профиле, его нет в профиле Common-Lite. См. OpenGL ES 1.0.02 Спецификация - 4.1 Операции с фрагментами

Если вы хотите рисовать частично прозрачные текстуры, то достаточно использовать Смешивание . Вам вообще не нужен альфа-тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...