OpenGL Point Sprites可以在Android中运行吗?

时间:2010-08-09 21:40:31

标签: android opengl-es point sprite

我正在开发Droid版本2.1-update1。我支持的GL扩展包括GL_OES_point_sprite和GL_OES_point_size_array。

我无法获得点精灵来渲染。下面的代码在glTexEnvi调用时从GLWrapperBase抛出UnsupportedOperationException。如果我禁用纹理并注释掉glTexEnvi all,它会在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);

由于

3 个答案:

答案 0 :(得分: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,...]第二个是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。

答案 1 :(得分:1)

我得到了精神与ES 1.1& 2关于nexus one。我使用固定点大小,所以我不必使用大小缓冲区,但你可以使用我的代码首先使它工作,然后添加大小缓冲区。

在我的绘画方法中:

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);

答案 2 :(得分:0)

如果像我一样你使用MatrixTrackingGL你需要使用glTexEnvf而不是glTexEnvi(最后不是我),你需要进入MatrixTrackingGL并更改glPointSizePointerOES:

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

我确信有一个很好的理由为什么它首先不受支持但我不知道它在我的运行android 2.1的中兴刀片上适用于我


对于任何想知道的人,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);