OpenGL 1.0 Android 中 PNG 纹理的透明度
Transparency for PNG textures in OpenGL 1.0 Androi
几年前,我正在为 Android 编写 OpenGL 1.0 ES,并且能够获得具有透明度的纹理。
我正在处理一个 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();
}
OpenGL ES 1.x 区分 Common 和 Common-Lite 配置文件。参见 OpenGL ES 1.0.02 Specification - Appendix A。
虽然 Common 配置文件支持 Alpha-Test,但 Common-Lite 配置文件不支持 Alpha-Test。参见 OpenGL ES 1.0.02 Specification - 4.1 Per-Fragment Operations
如果你想绘制部分透明的纹理,那么使用Blending就足够了。您根本不需要 Alpha 测试。
几年前,我正在为 Android 编写 OpenGL 1.0 ES,并且能够获得具有透明度的纹理。
我正在处理一个 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();
}
OpenGL ES 1.x 区分 Common 和 Common-Lite 配置文件。参见 OpenGL ES 1.0.02 Specification - Appendix A。
虽然 Common 配置文件支持 Alpha-Test,但 Common-Lite 配置文件不支持 Alpha-Test。参见 OpenGL ES 1.0.02 Specification - 4.1 Per-Fragment Operations
如果你想绘制部分透明的纹理,那么使用Blending就足够了。您根本不需要 Alpha 测试。