2016-11-01 3 views
0

Android에서 OpenGL ES를 사용하여 임의의 등고선도를 생성하려고합니다. 화면에 점을 그리기위한 Point 클래스를 만들었지 만 임의의 점을 그리는 것에 대한 내 접근 방식을 알아야합니다.GL_POINTS로 여러 점 생성

mPoint.draw(scratch,0.0f,0.0f,0.0f); 
mPoint2.draw(scratch,0.0f,0.5f,0.0f); 

내가 지금 (500)를 생성하는거야 예를 들어, 2 점을 표시하기 위해, 나는이 객체

내 렌더러 내부
mPoint = new Point(); 

mPoint2 = new Point(); 

을 만드는거야하고 방법을 그리기 점들과 겹칠 수있는 500 개의 객체를 만드는 것은 똑같지 않습니다 (동일한 x, y, z 좌표). 지금까지 포인트를 그리는 나의 접근 방식이 있습니까? 많은 양의 점이있는 뷰를 계속 작성하려면 어떻게해야합니까?

내 Point 클래스

public class Point { 
private int mProgram, mPositionHandle, mColorHandle, mMVPMatrixHandle; 


private final String vertexShaderCode = 
     // This matrix member variable provides a hook to manipulate 
     // the coordinates of the objects that use this vertex shader 
     "uniform mat4 uMVPMatrix;" + 
       "uniform vec4 vPosition;" + 
     "void main() {" + 
       " gl_Position = uMVPMatrix * vPosition;" + 
       " gl_PointSize = 20.0;" + 
       "}"; 

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


// Set color with red, green, blue and alpha (opacity) values 
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f }; 

public Point(){ 
    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,float px,float py,float pz) { 
    float positionCoords[] = {px,py,pz,1.0f}; 

    // Add program to OpenGL ES environment 
    GLES20.glUseProgram(mProgram); 

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

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

    // Set color for drawing the triangle 
    GLES20.glUniform4fv(mColorHandle, 1, color, 0); 

    GLES20.glUniform4fv(mPositionHandle, 1, positionCoords, 0); 

    // 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, transMatrix, 0); 

    GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 1); 
} 

} 

편집 : 나는 그들에게 10 초마다 생성 할 수 있도록하고 싶습니다.

답변

0

이것은 좋은 접근 방법이 아닙니다. 포인트 당 하나의 그리기 호출은 거대한 드라이버 오버 헤드와 전반적인 나쁜 GPU 성능을 생성합니다. 위치와 색상을 고유 한 정점 버퍼에 배치하고 한 번만 그려야합니다.

또한 GetUniformLocation()은 셰이더 프로그램 연결 후 유니폼마다 한 번 호출해야합니다. 정말 느려지거나 운전자가 캐싱 할 수는 있지만 혼자서 해가되는 것은 아닙니다.

+0

나는 또한 버퍼를 만드는 것에 대해 생각해 봤지만 동일한 문제가 있지 않습니까? 포인트를 5 초마다 생성하고 싶습니다 (이것을 지정하는 것을 잊었습니다). 첫 번째 방법을 사용하면 포인트를 생성하고이를 화면에 추가 할 수 있습니다. 버퍼로 어떻게 처리할까요? –

+0

GetUniformLocation() 부분 정보 : 당신은 무엇을 의미합니까? –

+0

당신의 접근 방식으로 각 프레임마다 각 프레임을 그립니다. 버퍼를 사용하면 각 프레임마다 한 번만 그립니다. 'GetUniformLocation()'의 경우 셰이더 프로그램 링크 후에 위치가 변경되지 않으므로 저장해야합니다. – pleluron