Работают ли OpenGL Point Sprites в Android?

Я развиваюсь на Droid версии 2.1-update1. Мои поддерживаемые расширения GL включают GL_OES_point_sprite и GL_OES_point_size_array.

Я не могу получить точечные спрайты для рендеринга. В приведенном ниже коде вызывается UnsupportedOperationException из GLWrapperBase при вызове glTexEnvi. Если я отключу текстуры и закомментирую 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); 

благодаря

Я получил эту работу, вот моя функция рисования

Инициализировать все

  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, если вы хотите покрасить свой спрайт.

Я получил точечные спрайты, работающие с 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); 

Если я использую MatrixTrackingGL, вам нужно использовать glTexEnvf, а не glTexEnvi (f не я в конце), и вам нужно перейти в MatrixTrackingGL и изменить glPointSizePointerOES:

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

Я уверен, что есть веская причина, почему это не поддерживается в первую очередь, но я не знаю, и это работает для меня на ZTE Blade, работающем под управлением Android 2.1.


Для кого-то интересно, MatrixTrackerGL происходит из C: \ Program Files \ android-sdk-windows \ samples \ android-7 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \ spritetext

Он используется при настройке GLSurface View:

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