openGL的纹理是在模拟器而不是真实设备上运行 [英] openGL texturing is running on emulator but not on real device

查看:191
本文介绍了openGL的纹理是在模拟器而不是真实设备上运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过openGL的显示纹理。在以下code我想提请纹理简单的方形。当我在Android模拟器中运行它,一切正常,但是当我真正在设备上运行的话,我只能看到白色方形没有任何纹理。

I'm trying to show textures by openGL. In following code I want to draw simple square with texture. When I run it on android emulator, everything is OK, but when I run it on real device, I can see only white square without any texture.

<一个href=\"http://stackoverflow.com/questions/8587661/cant-map-textures-with-opengl-es-on-real-devices\">There类似的问题的,但我不使用NDK。我只用Java的。

There is similar problem, but I don't use NDK. I use only 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);
    }

有人可以看看我的code,告诉我问题出在哪里?

Can someone look at my code and tell me where is the problem?

推荐答案

你还记得来设置过滤微小不使用贴图?我有点惊讶,这将在模拟器上工作,如果你没有,但也许这允许它的某些原因。

Do you remember to set the minification filter to not use mipmaps? I'm kind of surprised this would work on the emulator if you didn't, but maybe it allows it for some reason.

例如

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

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

这篇关于openGL的纹理是在模拟器而不是真实设备上运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆