2010-08-09 69 views
4

我正在開發一個Droid版本2.1-update1。我支持的GL擴展包括GL_OES_point_sprite和GL_OES_point_size_array。OpenGL Point Sprites在Android中工作嗎?

我無法獲得點精靈來呈現。下面的代碼在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); 

感謝

回答

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。

+0

只是出於好奇,什麼手機你在跑的? – 2010-11-13 19:59:12

+0

hmm - 看起來您必須使用glPointSize()或點大小數組來指定點大小。 glPointSizex()在運行2.2的Nexus One上不起作用。什麼都沒有顯示出來...... – 2010-11-13 20:53:30

+0

運行在2.2 n1上,請嘗試MetalRain動態壁紙,以查看來自此的示例。 – HaMMeReD 2010-12-01 20:06:11

0

如果你像我一樣正在使用MatrixTrackingGL你需要使用glTexEnvf而非glTexEnvi(F不是我在結束),你需要進入MatrixTrackingGL並更改glPointSizePointerOES:

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

我敢肯定有一個很好的理由,爲什麼這是擺在首位,但不支持我不知道它和它的作品對我來說在中興Blade上運行了Android 2.1的


大家很奇怪,MatrixTrackerGL來自C:\ PROGRAM文件\ Android的SDK-WINDOWS \ SAMPLES \ Android的7 \ ApiDemos \ S RC \ COM \例子\機器人\的API \圖形\ 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); 
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);