【问题标题】:Do OpenGL Point Sprites work in Android?OpenGL Point Sprites 在 Android 中工作吗?
【发布时间】:2011-03-27 13:03:16
【问题描述】:

我正在 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);

谢谢

【问题讨论】:

    标签: android opengl-es point sprite


    【解决方案1】:

    我得到了这个工作,这是我的绘图功能

    初始化一切

        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。

    【讨论】:

    • 只是出于好奇,你是在什么手机上运行这个的?
    • hmm - 看来您必须使用 glPointSize() 或点大小数组来指定点大小。 glPointSizex() 在我运行 2.2 的 Nexus One 上不起作用。什么都没有出现...
    • 在 2.2 n1 上运行,尝试使用 MetalRain 动态壁纸作为示例。
    【解决方案2】:

    如果您像我一样使用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);
    

    【讨论】:

      【解决方案3】:

      我得到了点精灵与 ES 1.1 和 2 在一个 nexus 上工作。我使用固定点大小,因此我不必使用大小缓冲区,但您可以使用我的代码先使其工作,然后添加大小缓冲区。

      在我的draw方法中:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多