0

openGLでテクスチャを表示しようとしています。次のコードでは、テクスチャのある単純な正方形を描きたいと思います。Androidエミュレーターで実行すると、すべて問題ありませんが、実際のデバイスで実行すると、テクスチャのない白い正方形しか表示されません。

同様の問題がありますが、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);
    }

誰かが私のコードを見て、どこに問題があるのか​​教えてもらえますか?

4

2 に答える 2

2

ミップマップを使用しないように縮小フィルターを設定することを覚えていますか? エミュレーターで機能しない場合でもこれが機能することに少し驚いていますが、何らかの理由で機能する可能性があります。

例えば

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

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

于 2012-08-08T20:31:32.913 に答える
1

エミュレータは OpenGL ES を実行せず、デスクトップ ドライバから実行されます。つまり、テクスチャは 2^n ではありません。携帯電話は 2^n (別名正方形) のテクスチャのみをサポートします。

これを確認します。エラーが発生しない場合は、おそらくあなたの問題です。2^n 画像を取得して、それがうまくいくかどうかを確認してください。

于 2012-08-08T20:20:46.783 に答える