2012-08-08 116 views
0

我想通过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); 
    } 

有人可以看看我的代码,并告诉我问题在哪里?

+0

有复制的纹理资源到您的设备?猜你会得到一个运行时错误,如果你没有...我不熟悉Android GL10,但你可以尝试在glDrawArrays之前调用glEnable(GL_TEXTURE_2D),将其他应用程序或部分应用程序停用。 – torbjoernwh 2012-08-08 17:40:35

+0

纹理是在.apk文件中。我像这样加载它。 “Bitmap b = BitmapFactory.decodeResource(thiz.getResources(),R.drawable.nex2);” 如果我在glDrawArrays之前移动glEnable(GL10.GL_TEXTURE_2D),它不会改变。 – WELLCZECH 2012-08-08 17:44:10

+0

你有没有试过glGetError? – Tim 2012-08-08 17:50:00

回答

2

您是否记得将缩小过滤器设置为不使用mipmap?如果你不这样做,我会很惊讶,如果你不这样做的话,它可以在模拟器上工作,但也许它出于某种原因允许它。

E.g.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

http://www.opengl.org/wiki/Common_Mistakes#Creating_a_Texture

+0

是的,这是有效的。非常感谢 – WELLCZECH 2012-08-09 00:05:33

1

模拟器不运行OpenGL ES afaik,它运行在桌面驱动程序之外。意思是它可以支持纹理不是2^n,你的手机只支持2^n(aka square)纹理。

我会检查这个,如果你没有错误,这很可能是你的问题。抓住2^n图像,看看它是否适合你。

+0

可能,尽管如果设备不支持npot纹理,它应该在glTexImage2d上发布glError:*如果不支持非幂次幂纹理,将生成GL_INVALID_VALUE ... * – Tim 2012-08-08 20:28:04

+0

我只是试图说明为什么它可以在一个而不是另一个上工作,但你可能是正确的,但我没有测试过。 – Jug6ernaut 2012-08-08 20:42:25

+0

我使用254 * 254像素的图片。所以这是好的。当我使用另一个尺寸像300 * 300时,正方形是黑色而不是白色。 在每一个方面感谢努力。 – WELLCZECH 2012-08-09 00:10:46

相关问题