在 Android 上使用 OpenGL ES 显示透明纹理的问题
Posted
技术标签:
【中文标题】在 Android 上使用 OpenGL ES 显示透明纹理的问题【英文标题】:Problems displaying transparent textures with OpenGL ES on Android 【发布时间】:2010-12-29 21:23:19 【问题描述】:我已经投入了一天多的时间来寻找有关如何在 android 上使用 OpenGL 渲染透明纹理的解决方案。显然其他人比我运气好,但在尝试了各种解决方案(例如Transparent texture in OpenGL ES for Android)后,我仍然无法完成。
这是我的基本设置:
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_texture 扩展,而我必须使用 VBO(以便能够应用旋转)。
我们将不胜感激! 谢谢 本
【问题讨论】:
【参考方案1】:好的,又经过了一天的调试,终于找到了我的错误。它与位图的配色方案无关,glBlendFunc
或类似的东西。
原来我在两个纹理函数调用中草率地使用了GL_FIXED
和GL_FLOAT
。
【讨论】:
以上是关于在 Android 上使用 OpenGL ES 显示透明纹理的问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上使用 OpenGL ES 显示透明纹理的问题
在 Android 上使用 FBO 进行慢速 OpenGL ES 渲染到纹理乒乓球