在 OpenGL ES Android 中使用 glBufferSubData 和 glMultiDrawArrays

Posted

技术标签:

【中文标题】在 OpenGL ES Android 中使用 glBufferSubData 和 glMultiDrawArrays【英文标题】:Using glBufferSubData and glMultiDrawArrays in OpenGL ES Android 【发布时间】:2016-09-29 04:39:50 【问题描述】:

我正在将 C++ 点和多边形绘图移植到 android。最初它直接将代码移植到 java 样式。我可以使用以下代码绘制点。

//POINT
public class MyPoint


 public float x,y,z;


//Points in x,y,z format are parsed and stored here
public static ArrayList<MyPoint> m_vPoints;


public static  float [] fPointVertices =;//Float array
public static FloatBuffer mPointVerticesFloatBuffer;//Buffer for rendering

int m_drawCount=0;

//Converting to float array
//AND
//Converting to FloatBuffer
public  static void FormatPointDataAsGLBuffer()

        fPointVertices=new float[m_vPoints.size()*3];
        int count=0;

        for(int i=0;i<m_vPoints.size();i++)
        
            fPointVertices[count]=m_vPoints.get(i).x;
            fPointVertices[count+1]=0.0f;
            fPointVertices[count+2]=m_vPoints.get(i).y;
            count=count+3;
        

        m_drawCount=count;
        //Convert vertices to OpenGL ES compatible format
        mPointVerticesFloatBuffer= ByteBuffer.allocateDirect(fPointVertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        mPointVerticesFloatBuffer.put(fPointVertices).position(0);


public void DrawPoints()

    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, mPointVerticesFloatBuffer);
    GLES20.glDrawArrays(GLES20.GL_POINTS, 0, m_drawCount);
    GLES20.glDisableVertexAttribArray(mPositionHandle);


我还不确定如何使用单个浮点数组绘制多边形。但在 C++ 版本中,使用 glBufferSubData 创建 VBO 并使用对 glMultiDrawArrays 的单个调用,如下面的 SE 查询中所述。 Using VBO to draw line string

多边形相关脚本如下所示

//POLYGON

public static ArrayList<MyPolygon> m_vPolygons;
public static class MyPolygon
    
        public ArrayList<MyPoint> vPointList;
    


public  static void FormatPolygonDataAsGLBuffer()
    
        for(int i=0;i<vPolygons.size();i++)
        

            for(int j=0;j<vPolygons.get(i).vPointList.size();j++)
            
                fPointVertices[count]=vPolygons.get(i).vPointList.get(i).x;
                fPointVertices[count+1]=0.0f;
                fPointVertices[count+2]=-vPolygons.get(i).vPointList.get(i).y;//Negating since y is outwards from the screen and z is upwards
                count=count+3;
            

           
    


    public void DrawPolygons()
    
        //WHAT IS THE RIGHT WAY HERE???
        //glBufferSubData
        //Draw the lines
        //glMultiDrawArrays(GLES20.GL_LINE_LOOP, startIndices,endIndices,nPolygonCount); 
    

【问题讨论】:

【参考方案1】:

glBufferSubData 函数仍然存在,所以它应该仍然像以前一样工作。 glMultiDrawArrays 函数在 GLES 中不存在,因此您只需对 glDrawArrays() 进行多次单独调用,每个要渲染的对象调用一次。

【讨论】:

以上是关于在 OpenGL ES Android 中使用 glBufferSubData 和 glMultiDrawArrays的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android上使用OpenGL ES 2.0绘制点

android openGL ES2 一切从绘制纹理開始

在 OpenGL ES Android 中使用 glBufferSubData 和 glMultiDrawArrays

在Android中使用OpenGL ES进行开发第节:概念先行

在 Android 中使用带有 OpenGL ES 的 VBO 性能不佳

如何使用带有 OpenGL ES 的 android 相机工作?