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,...] 第二个是 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

我得到了与 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 ,则需要使用 glTexEnvf 而不是 glTexEnvi(最后是 f 不是 i),并且您需要进入 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 回答