2016-11-09 3 views
0

는 OpenGL. 그려지는 내용을 변경할 수 있기를 원합니다 (새로운 지점으로 장면을 업데이트하십시오). 완전히 새로운 객체를 재생성하는 것은 좋지 않으므로 버퍼의 내용을 변경하려고했습니다. 최근에 나는 glBufferSubData()에 대해 알았지 만, 어떻게 사용하는지 모르겠습니다.동적 변화 정점 버퍼 데이터 I는 몇 가지 포인트를 그릴 버퍼를 사용하는 점을 클래스

public class Point { 
    private int mProgram, mPositionHandle, mColorHandle, mMVPMatrixHandle; 
    private FloatBuffer vertexBuffer,colorBuffer; 
    private static final int COORDS_PER_VERTEX = 3; 
    private static final int COORDS_PER_COLOR = 3; 
    private int vertexCount,colorCount; 


    private final String vertexShaderCode = 
      "uniform mat4 uMVPMatrix;" + 
        "attribute vec4 vPosition;" + 
        "attribute mediump vec4 vColor;" + 
        "varying mediump vec4 vaColor;" + 
        "void main() {" + 
        " vaColor = vColor;" + 
        " gl_Position = uMVPMatrix * vPosition;" + 
        " gl_PointSize = 20.0;" + 
        "}"; 

    private final String fragmentShaderCode = 
      "precision mediump float;" + 
        "varying mediump vec4 vaColor;" + 
        "void main() {" + 
        " gl_FragColor = vaColor;" + 
        "}"; 


    private static int vertexStride = COORDS_PER_VERTEX * 4; 
    private final int colorStride = COORDS_PER_COLOR * 4; 


    public Point(float pointCoords[],float colorCoords[]){ 
     this.vertexCount = pointCoords.length/COORDS_PER_VERTEX; 
     this.colorCount = colorCoords.length/COORDS_PER_COLOR; 

     ByteBuffer vbb = ByteBuffer.allocateDirect(pointCoords.length * 4); 
     vbb.order(ByteOrder.nativeOrder()); 
     vertexBuffer = vbb.asFloatBuffer(); 
     vertexBuffer.put(pointCoords); 
     vertexBuffer.position(0); 



     ByteBuffer cbb = ByteBuffer.allocateDirect(colorCoords.length * 4); 
     cbb.order(ByteOrder.nativeOrder()); 
     colorBuffer = cbb.asFloatBuffer(); 
     colorBuffer.put(colorCoords); 
     colorBuffer.position(0); 


     int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, 
       vertexShaderCode); 
     int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, 
       fragmentShaderCode); 

     // create empty OpenGL ES Program 
     mProgram = GLES20.glCreateProgram(); 

     // create empty OpenGL ES Program 
     mProgram = GLES20.glCreateProgram(); 

     // add the vertex shader to program 
     GLES20.glAttachShader(mProgram, vertexShader); 

     // add the fragment shader to program 
     GLES20.glAttachShader(mProgram, fragmentShader); 

     // creates OpenGL ES program executables 
     GLES20.glLinkProgram(mProgram); 
    } 

    public void draw(float[] mvpMatrix) { 
     // Add program to OpenGL ES environment 
     GLES20.glUseProgram(mProgram); 

     // get handle to vertex shader's vPosition member 
     mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); 

     // Enable a handle to the triangle vertices 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 

     // Prepare the point coordinate data 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, 
       GLES20.GL_FLOAT, false, 
       vertexStride, vertexBuffer); 


     mColorHandle = GLES20.glGetAttribLocation(mProgram,"vColor"); 

     GLES20.glEnableVertexAttribArray(mColorHandle); 
     // Set color for drawing the triangle 
     GLES20.glVertexAttribPointer(mColorHandle, COORDS_PER_COLOR, GLES20.GL_FLOAT, false, 
       colorStride, colorBuffer); 

     // get handle to shape's transformation matrix 
     mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 

     //TRANSLATION 
     float[] transMatrix = new float[16]; 

     Matrix.setIdentityM(transMatrix,0); 
     Matrix.translateM(transMatrix,0,0.5f,0,0); 
     Matrix.multiplyMM(transMatrix,0,mvpMatrix,0,transMatrix,0); 


     // Apply the projection and view transformation 
     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 

     GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vertexCount); 

     // Disable vertex array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
    } 

    /** 
    * Change content of buffer 
    */ 
    public void changeBufferData(float[] newBufferInfo) { 
     GLES20.glBufferSubData(?,0,newBufferInfo.length*4,vertexBuffer); 
    } 

    } 

답변

0

당신은 glVertexAttribPointer를 사용 무승부 당 업로드 된 데이터와 클라이언트 측 정점 배열을 사용하고 있습니다 :

여기 내 포인트 클래스입니다. 이 작업을 동적으로 업데이트하는 것은 이미 수행중인 작업보다 비용이 많이 들지 않습니다. 이미 모든 그리기 작업에 대해 드라이버가 소유 한 메모리에 데이터를 할당하고 복사해야하기 때문입니다. 당신이 말한대로

그러나, 버퍼를 다시하는 것은 버텍스 버퍼 개체 (glGenBuffers 등)을 만들 필요가

누락 된 부분 ... 그래서 클라이언트 측 정점 업로드가 좋습니다 피하는 비용입니다 그런 다음 클라이언트 측 속성 대신 사용할 수 있습니다. glBufferDataglSubBufferData은 이러한 버퍼 객체 중 하나의 내용을 패치하는 데 사용됩니다.

+0

저는 gl을 열어 본 경험이 있습니다. 나는 당신이 말한 것을 이해하고, 나는 그것을 구현할 수 있는지 알아볼 것입니다. –

+0

도움이 될 수 있습니다 : http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/ – solidpixel