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 초마다 생성 할 수 있도록하고 싶습니다.
나는 또한 버퍼를 만드는 것에 대해 생각해 봤지만 동일한 문제가 있지 않습니까? 포인트를 5 초마다 생성하고 싶습니다 (이것을 지정하는 것을 잊었습니다). 첫 번째 방법을 사용하면 포인트를 생성하고이를 화면에 추가 할 수 있습니다. 버퍼로 어떻게 처리할까요? –
GetUniformLocation() 부분 정보 : 당신은 무엇을 의미합니까? –
당신의 접근 방식으로 각 프레임마다 각 프레임을 그립니다. 버퍼를 사용하면 각 프레임마다 한 번만 그립니다. 'GetUniformLocation()'의 경우 셰이더 프로그램 링크 후에 위치가 변경되지 않으므로 저장해야합니다. – pleluron