android opengl纹理,Android OpenGL透明纹理绘制黑色

我试图在我的应用程序中绘制透明纹理(文本).奇怪的是,它适用于最新的Nexus 7和我的第二代Moto X,但在原来的Nexus 7上,纹理只是黑色.我已经启用了混合,纹理是512×512,所以它不是两个问题.我也只是使用GL10,应该支持一切,对吧?任何原因纹理不会在这个设备上工作?

gl.glEnable(GL10.GL_BLEND);

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

gl.glEnable(GL10.GL_TEXTURE_2D);

// text drawn here

gl.glDisable(GL10.GL_TEXTURE_2D);

gl.glDisable(GL10.GL_BLEND);

这里是纹理初始化,我在那里加载纹理atlas:

public void loadGlyphs(GL10 gl, Context context) {

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.text_bitmap);

gl.glGenTextures(1, textures, 0);

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

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);

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

bitmap.recycle();

}

顶部显示旧的Nexus 7发生了什么.底部的图片是Moto X.

编辑:这是一个完整的例子.没有透明度,没有在旧的Nexus 7上绘制任何东西.如果我摆脱了纹理的东西,它将绘制正方形白色,就像它应该的.

MainActivity.java

import android.app.Activity;

import android.opengl.GLSurfaceView;

import android.os.Bundle;

public class MainActivity extends Activity {

private GLSurfaceView glView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

glView = new TestView(this);

setContentView(glView);

}

@Override

protected void onPause() {

super.onPause();

glView.onPause();

}

@Override

protected void onResume() {

super.onResume();

glView.onResume();

}

}

TestView.java

import android.content.Context;

import android.opengl.GLSurfaceView;

public class TestView extends GLSurfaceView {

private TestRenderer renderer;

public TestView(Context context) {

super(context);

renderer = new TestRenderer(context);

setRenderer(renderer);

}

}

TestRenderer.java

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.opengl.GLSurfaceView;

import android.opengl.GLU;

import android.opengl.GLUtils;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

public class TestRenderer implements GLSurfaceView.Renderer {

private FloatBuffer floatBuffer;

private FloatBuffer textureBuffer;

private Context context;

private int[] textures;

public TestRenderer(Context context) {

this.context = context;

textures = new int[1];

}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

floatBuffer = ByteBuffer.allocateDirect(4 * 2 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();

floatBuffer.put(-0.5f);

floatBuffer.put(-0.5f);

floatBuffer.put(-0.5f);

floatBuffer.put(0.5f);

floatBuffer.put(0.5f);

floatBuffer.put(-0.5f);

floatBuffer.put(0.5f);

floatBuffer.put(0.5f);

floatBuffer.rewind();

textureBuffer = ByteBuffer.allocateDirect(4*2*4).order(ByteOrder.nativeOrder()).asFloatBuffer();

textureBuffer.put(0);

textureBuffer.put(1);

textureBuffer.put(0);

textureBuffer.put(0);

textureBuffer.put(1);

textureBuffer.put(1);

textureBuffer.put(1);

textureBuffer.put(0);

textureBuffer.rewind();

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.test);

gl.glGenTextures(1, textures, 0);

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

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);

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

bitmap.recycle();

}

public void onSurfaceChanged(GL10 gl, int w, int h) {

gl.glMatrixMode(GL10.GL_PROJECTION);

gl.glLoadIdentity();

GLU.gluPerspective(gl, 45.0f, (float) w / (float) h, 0.1f, 100.0f);

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

}

public void onDrawFrame(GL10 gl) {

gl.glLoadIdentity();

gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

gl.glTranslatef(0.0f, 0.0f, -5.0f);

gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

gl.glEnable(GL10.GL_TEXTURE_2D);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glFrontFace(GL10.GL_CW);

gl.glVertexPointer(2, GL10.GL_FLOAT, 0, floatBuffer);

gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

gl.glDisable(GL10.GL_TEXTURE_2D);

}

}

编辑:这是我在网上找到的一个例子.如果我禁用GL_TEXTURE_2D,我得到一个白色方块.如果我启用GL_TEXTURE_2D我什么都没有.

主要活动

public class MainActivity extends Activity {

private GLSurfaceView glSurfaceView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

glSurfaceView = new GLSurfaceView(this);

glSurfaceView.setRenderer(new GlRenderer(this));

setContentView(glSurfaceView);

}

@Override

protected void onResume() {

super.onResume();

glSurfaceView.onResume();

}

@Override

protected void onPause() {

super.onPause();

glSurfaceView.onPause();

}

}

GlRenderer

public class GlRenderer implements Renderer {

private Square square;

private Context context;

public GlRenderer(Context context) {

this.context = context;

this.square = new Square();

}

@Override

public void onDrawFrame(GL10 gl) {

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

gl.glLoadIdentity();

gl.glTranslatef(0.0f, 0.0f, -5.0f);

square.draw(gl);

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

if(height == 0) {

height = 1;

}

gl.glViewport(0, 0, width, height);

gl.glMatrixMode(GL10.GL_PROJECTION);

gl.glLoadIdentity();

GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

}

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

square.loadGLTexture(gl, this.context);

gl.glEnable(GL10.GL_TEXTURE_2D);

gl.glShadeModel(GL10.GL_SMOOTH);

gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

gl.glClearDepthf(1.0f);

gl.glEnable(GL10.GL_DEPTH_TEST);

gl.glDepthFunc(GL10.GL_LEQUAL);

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

}

}

广场

public class Square {

private FloatBuffer vertexBuffer;

private float vertices[] = {

-1.0f, -1.0f, 0.0f,

-1.0f, 1.0f, 0.0f,

1.0f, -1.0f, 0.0f,

1.0f, 1.0f, 0.0f

};

private FloatBuffer textureBuffer;

private float texture[] = {

0.0f, 1.0f,

0.0f, 0.0f,

1.0f, 1.0f,

1.0f, 0.0f

};

private int[] textures = new int[1];

public Square() {

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);

byteBuffer.order(ByteOrder.nativeOrder());

vertexBuffer = byteBuffer.asFloatBuffer();

vertexBuffer.put(vertices);

vertexBuffer.position(0);

byteBuffer = ByteBuffer.allocateDirect(texture.length * 4);

byteBuffer.order(ByteOrder.nativeOrder());

textureBuffer = byteBuffer.asFloatBuffer();

textureBuffer.put(texture);

textureBuffer.position(0);

}

public void loadGLTexture(GL10 gl, Context context) {

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),

R.drawable.test);

gl.glGenTextures(1, textures, 0);

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

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);

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

bitmap.recycle();

}

public void draw(GL10 gl) {

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

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glFrontFace(GL10.GL_CW);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值