For문으로 1000개를 돌려야 할까요???? 개발 요구사항에 따라 다르겠지만,
만약 전체적인 회전이나 컬러 알파 정도는 수정할 수 있는 방법이 있었습니다.
바로!!! 1000개의 Object의 Vertex를 지정하고,
한번에 그리는 것입니다.!!! ( 제가 초보라서.. 이제 알게됨..^^;)
Vertex와 Index 배열을 잘 이용하면 쉽게 그릴 수 있습니다.
먼저 테스트 해본 배열은
private final float[] mVerticesData = {
// X, Y, Z, U, V,alpha,colorR,colorG,colorB,colorA
0.0f, 0.5f, 0, 1.0f, 0.0f,1.0f,0.0f,0.0f,1.0f,1.0f, // 0
-0.5f, 0.5f, 0, 0.0f, 0.0f,1.0f,0.0f,0.0f,1.0f,1.0f, // 1
-0.0f, 1.0f, 0, 1.0f, 1.0f,1.0f,0.0f,0.0f,1.0f,1.0f, // 2
-0.5f, 1.0f, 0, 0.0f, 1.0f,1.0f,0.0f,0.0f,1.0f,1.0f, // 3
0.0f, 0.0f, 0, 1.0f, 0.0f,0.0f,1.0f,1.0f,1.0f,1.0f, // 4
-0.5f, 0.0f, 0, 0.0f, 0.0f,0.0f,1.0f,1.0f,1.0f,1.0f, // 5
-0.0f, 0.5f, 0, 1.0f, 1.0f,0.0f,1.0f,1.0f,1.0f,1.0f, // 6
-0.5f, 0.5f, 0, 0.0f, 1.0f,0.0f,1.0f,1.0f,1.0f,1.0f, // 7
0.0f,-0.5f, 0, 1.0f, 0.0f,1.0f,1.0f,1.0f,1.0f,1.0f, // 8
-0.5f,-0.5f, 0, 0.0f, 0.0f,1.0f,1.0f,1.0f,1.0f,1.0f, // 9
-0.0f, 0.0f, 0, 1.0f, 1.0f,1.0f,1.0f,1.0f,1.0f,1.0f, // 10
-0.5f, 0.0f, 0, 0.0f, 1.0f,1.0f,1.0f,1.0f,1.0f,1.0f, // 11
};
private short[] indices = {
0, 1, 2, 2, 1, 3, // 첫번째 4각형
4, 5, 6, 6, 5, 7, // 두번째 4각형
8, 9, 10, 10, 9, 11, // 세번째 4각형
};
주석에 적어 놓은 것과 같이, vertex 포인터 위치, 알파값 , 색깔 값으로 지정이 되어 있습니다.
[Shader 코드] : VertexShader에는 위치 값을 FrameShader에는 알파와 색깔 값을 설정
private final String mVertexShader =
"uniform mat4 uMVPMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec2 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
"attribute float aAlpha;\n" +
"varying float vAlpha; \n" +
"attribute vec4 aColor;\n" +
"varying vec4 vColor; \n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vTextureCoord = aTextureCoord;\n" +
" vAlpha = aAlpha;\n" +
" vColor = aColor;\n" +
"}\n";
private final String mFragmentShader =
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"varying float vAlpha; \n" +
"varying vec4 vColor; \n" +
"uniform sampler2D sTexture;\n" +
"void main() {\n" +
" gl_FragColor = texture2D(sTexture, vTextureCoord)*vColor*vAlpha;\n" +
"}\n";
[ Attribute 적용 코드 ] : 버퍼로 초기화를 해준 후, 각각 Attribute에 할당
mTriangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length
* FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
mTriangleVertices.put(mTriangleVerticesData).position(0);
mTriangleIndics = ByteBuffer.allocateDirect(indices.length
* FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asShortBuffer();
mTriangleIndics.put(indices).position(0);
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maPosition");
GLES20.glEnableVertexAttribArray(maPositionHandle);
checkGlError("glEnableVertexAttribArray maPositionHandle");
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maTextureHandle");
GLES20.glEnableVertexAttribArray(maTextureHandle);
checkGlError("glEnableVertexAttribArray maTextureHandle");
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_COLOR_OFFSET);
GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maColorHandle");
GLES20.glEnableVertexAttribArray(maColorHandle);
checkGlError("glEnableVertexAttribArray maColorHandle");
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_ALPHA_OFFSET);
GLES20.glVertexAttribPointer(maAlphaHandle, 1, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maAlphaHandle");
GLES20.glEnableVertexAttribArray(maAlphaHandle);
checkGlError("glEnableVertexAttribArray maAlphaHandle");
[ Draw 부분] : 3개의 Object에 한 개당 6개의 index 포인트가 있으므로 18을 설정
GLES20.glDrawElements ( GLES20.GL_TRIANGLES, 18, GLES20.GL_UNSIGNED_SHORT, mTriangleIndics );
결과 화면
이 소스는 Apidemo에 있는 opengl2.0 샘플을 변경 한 것입니다.
render 소스만 첨부 할터이니~ 참고하세요^^
'나의 플랫폼 > 안드로이드' 카테고리의 다른 글
[ Android ] Color 값을 RGB로 (0) | 2011.11.10 |
---|---|
[ Android ] 나인 패치의 이해 ^^ (0) | 2011.11.09 |
[ Android Opengl es 2.0 ] java.lang.IllegalArgumentException (0) | 2011.11.03 |
[ Android ] Wallpaper 개발 중 Map 클래스 사용 시 (1) | 2011.11.03 |
[Android Opengl es 2.0 ] Texture Setting. (2) | 2011.11.02 |