Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上使用OpenGL ES显示透明纹理时出现问题_Android_Opengl Es_Transparency_Textures_Vbo - Fatal编程技术网

在Android上使用OpenGL ES显示透明纹理时出现问题

在Android上使用OpenGL ES显示透明纹理时出现问题,android,opengl-es,transparency,textures,vbo,Android,Opengl Es,Transparency,Textures,Vbo,我花了一天多的时间寻找一个解决方案,如何在Android上用OpenGL渲染透明纹理。显然,其他人比我运气好,但在尝试了各种解决方案(例如)后,我仍然无法完成 以下是我的基本设置: gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0.0f, 0.0f, 0.0f, 1); gl.glShadeModel(GL10.GL_FLAT); gl.gl

我花了一天多的时间寻找一个解决方案,如何在Android上用OpenGL渲染透明纹理。显然,其他人比我运气好,但在尝试了各种解决方案(例如)后,我仍然无法完成

以下是我的基本设置:

        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glDisable(GL10.GL_DITHER);
    gl.glDisable(GL10.GL_LIGHTING);

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, -ratio, ratio, -1, 1);
纹理是通过

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_NEAREST);
    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_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
。。。有迹象表明,这会导致预乘alpha导致的问题。但ReplicaIsland也使用了GLUtils功能,而且游戏在透明图像方面似乎没有问题

现在,如果我用alpha通道(PNG)绘制纹理,它们会显示为纯黑色。没有alpha的纹理将以各自的颜色正确绘制)。我在没有运气的情况下应用了各种glBlendFunc调用,即

    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
我也试了一下这个

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
结果总是纹理完全不可见(完全透明?)

用于测试的图像来自ReplicaIsland项目,这些是标准PNG。这也意味着所使用的纹理符合2次幂法则——这是在各种帖子中提供的另一种解决方案。我看到了一个区别,那就是ReplicaIsland似乎主要依赖于draw_纹理扩展,而我必须使用VBOs(以便能够应用旋转)

非常感谢您的帮助! 谢谢
Ben

好的,又过了一天的调试,我终于发现了我的错误。它与位图的配色方案,
glBlendFunc
或类似的内容无关

结果证明,我在两个纹理函数调用中草率地使用了
GL\u FIXED
GL\u FLOAT