我想通过openGL显示纹理。在下面的代码中,我想用纹理绘制简单的正方形。当我在android模拟器上运行它时,一切正常,但是当我在真实设备上运行它时,只能看到没有任何纹理的白色方块。openGL纹理运行在模拟器上,但不是在真实设备上
There is similar problem,但我不使用NDK。我只使用Java。
public class MainActivity extends Activity
{
public static TextView t;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout l = new LinearLayout(this);
t = new TextView(this);
l.addView(t);
l.setOrientation(1);
l.addView(new ImageView(this));
setContentView(l);
}
long last = System.currentTimeMillis();
int FPS = 0;
//Show FPS(+ some extraData)
public void FPS(final String extraData)
{
if(System.currentTimeMillis()<last+1000)
{
FPS++;
}
else
{
runOnUiThread(new Runnable(){@Override public void run(){
t.setText((double)FPS/(((double)System.currentTimeMillis()-last)/1000)+";"+extraData);
}});
FPS = 0;
last = System.currentTimeMillis();
}
}
public class ImageView extends GLSurfaceView implements GLSurfaceView.Renderer
{
MainActivity thiz;
public ImageView(MainActivity thiz)
{
super(thiz);
this.thiz = thiz;
setRenderer(this);
}
FloatBuffer vertex;
ShortBuffer texture;
int[] textureID = new int[1];
public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertex);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, texture);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
thiz.FPS("");
}
public void onSurfaceCreated(GL10 gl, EGLConfig arg1)
{
vertex = FloatBuffer.wrap(new float[]{-0.5f, -0.5f,
0.5f, -0.5f,
-0.5f, 0.5f,
0.5f, 0.5f});
texture = ShortBuffer.wrap(new short[]{0, 1,
1, 1,
0, 0,
1, 0});
Bitmap b = BitmapFactory.decodeResource(thiz.getResources(), R.drawable.nex2);
gl.glGenTextures(1, textureID, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID[0]);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, b, 0);
b.recycle();
gl.glClearColor(0.1f, 0.5f, 1f, 1f);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
public void onSurfaceChanged(GL10 gl, int w, int h)
{
gl.glViewport(0, 0, w, h);
}
有人可以看看我的代码,并告诉我问题在哪里?
有复制的纹理资源到您的设备?猜你会得到一个运行时错误,如果你没有...我不熟悉Android GL10,但你可以尝试在glDrawArrays之前调用glEnable(GL_TEXTURE_2D),将其他应用程序或部分应用程序停用。 – torbjoernwh 2012-08-08 17:40:35
纹理是在.apk文件中。我像这样加载它。 “Bitmap b = BitmapFactory.decodeResource(thiz.getResources(),R.drawable.nex2);” 如果我在glDrawArrays之前移动glEnable(GL10.GL_TEXTURE_2D),它不会改变。 – WELLCZECH 2012-08-08 17:44:10
你有没有试过glGetError? – Tim 2012-08-08 17:50:00