4

私は Droid のバージョン 2.1-update1 で開発しています。サポートされている GL 拡張機能には、GL_OES_point_sprite と GL_OES_point_size_array が含まれます。

レンダリングするポイント スプライトを取得できません。以下のコードは、glTexEnvi 呼び出しで GLWrapperBase から UnsupportedOperationException をスローします。テクスチャを無効にして glTexEnvi をすべてコメントアウトすると、同じ例外がさらに下の glPointSizePointerOES() でスローされます。

ポイント スプライトは Android で適切にサポートされていますか? 誰かがそれらを機能させましたか?または、以下のコードに問題がありますか?

// Note that gl is cast to GL11
gl.glEnable(GL11.GL_TEXTURE_2D);
gl.glEnable(GL11.GL_BLEND);
gl.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
gl.glDepthMask(false);
gl.glEnable(GL11.GL_POINT_SPRITE_OES);
gl.glTexEnvi( GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE );  
gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL11.GL_SHORT, 0, .vertBuffer);
gl.glEnableClientState(GL11.GL_POINT_SIZE_ARRAY_OES);
gl.glPointSizePointerOES(GL11.GL_FLOAT, 0, pointSizeBuffer);

ありがとう

4

3 に答える 3

5

私はこれを機能させました、これが私の描画機能です

すべてを初期化する

    gl.glEnable(GL10.GL_TEXTURE);
    TextureManager.activateTexture(gl, R.drawable.water1); //Don't look for this, it's not public api, just looks upd texture id for android resource if loaded, and then activates it. it's the gl.glBindTexture() call replacement
    gl.glEnable(GL11.GL_POINT_SPRITE_OES);
    gl.glEnableClientState(GL11.GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES);
    gl.glEnableClientState(GL11.GL_POINT_SIZE_ARRAY_OES);       
    gl.glEnableClientState(GL11.GL_POINT_SPRITE_OES);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

ポイントスプライトを使用するようにテクスチャ環境を設定します

    gl.glTexEnvf(GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE);

データへのポインタを設定します(最初の配列は2dレイアウト[x、y、x2、y2、...]2番目は1d[s1、s2、..])

    gl.glVertexPointer(2,GL11.GL_FLOAT,0,PosData);              
    ((GL11)(gl)).glPointSizePointerOES(GL10.GL_FLOAT, 0, SizeData);

描く

    gl.glDrawArrays(GL10.GL_POINTS,0,MAX);

ものを無効にする

    gl.glDisableClientState(GL11.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL11.GL_POINT_SIZE_ARRAY_OES);
    gl.glDisableClientState(GL11.GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES);
    gl.glDisableClientState(GL11.GL_POINT_SIZE_ARRAY_OES);      
    gl.glDisable(GL10.GL_TEXTURE);

イニシャライザでは、プロジェクションの設定とGL_BLENDのみをブレンドに対して有効にしています。スプライトに色を付けたい場合は、GL_COLOR_MATERIALが必要だと思います。

于 2010-10-18T03:57:57.717 に答える
1

nexus 1でES 1.1および2で動作するポイントスプライトを取得しました。私は固定小数点サイズを使用しているので、サイズ バッファーを使用する必要はありませんでしたが、私のコードを使用して、最初に動作させてからサイズ バッファーを追加することができます。

私の描画方法では:

gl.glEnable(GL11.GL_POINT_SPRITE_OES);
gl.glTexEnvf(GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 2 dimensional array, (x1,y1, x2, y2, ...).
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, mVerticesBuffer); 

gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
gl.glPointSize(32); // Fixed point size for all points
// This only worked with GLES11 & GLES20.
GLES11.glDrawArrays(GLES11.GL_POINTS, 0, vertices.length); 

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glDisable(GL11.GL_POINT_SPRITE_OES);
于 2011-11-29T11:14:16.067 に答える
0

私のように MatrixTrackingGL を使用している場合、glTexEnvi ではなく glTexEnvf を使用する必要があり (最後に f ではありません)、MatrixTrackingGL に移動して glPointSizePointerOES を変更する必要があります。

public void glPointSizePointerOES(int type, int stride, Buffer pointer) {
    mgl11.glPointSizePointerOES(type, stride, pointer);
    //throw new UnsupportedOperationException();
}

そもそもサポートされていないのには正当な理由があると確信していますが、それはわかりません.Android 2.1を実行しているZTE Bladeで動作します.


不思議に思っている人のために、MatrixTrackerGL は C:\Program Files\android-sdk-windows\samples\android-7\ApiDemos\src\com\example\android\apis\graphics\spritetext から来ています

GLSurface ビューをセットアップするときに使用されます。

// GraphicsRenderer is my implementation of Renderer
Graphics Renderer graphicsRenderer = new GraphicsRenderer(this);

    GLSurfaceView mGLView = (GLSurfaceView) findViewById(R.id.graphics_glsurfaceview1);
    mGLView.setGLWrapper(new GLSurfaceView.GLWrapper() {
        public GL wrap(GL gl) {
            return new MatrixTrackingGL(gl);
        }});
    mGLView.setEGLConfigChooser(true);         
    mGLView.setRenderer(graphicsRenderer);

つまり、GLU.gluUnProject を使用してピッキングを行うことができます!:

        MatrixGrabber matrixGrabber = new MatrixGrabber();
        matrixGrabber.getCurrentModelView(gl);  
        matrixGrabber.getCurrentProjection(gl);

        float[] vector = new float[4]; 

        GLU.gluUnProject(x, y, 0f, matrixGrabber.mModelView, 0, matrixGrabber.mProjection, 0, new int[]{mGLView .getTop(),mGLView .getLeft(),mGLView .getWidth(),mGLView .getHeight()}, 0, vector, 0);
于 2011-10-11T19:08:34.630 に答える