|
아래 코드 실행시 삼각형과 사각형이 겹쳐서 나온다... 좌표 바꾸기가 귀찮아서..
GLGameRenderer.java
public class GLGameRenderer implements Renderer { private Triangle mTriangle; private Quad mQuad; public GLGameRenderer(Context context) { mTriangle = new Triangle(); mQuad = new Quad(); } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 화면을 깨끗하게 gl.glLoadIdentity(); mTriangle.draw(gl); mQuad.draw(gl); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); // 화면크기 지정 } @Override public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { gl.glClearColor(0, 1, 0, 0.5f); // RGBA gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // ?? } }
Triangle, Quad 객체를 생성한다.
onDrawFrame();
생성한 객체의 draw 메서드를 통해 그림을 그린다.
Triangle.java
import java.nio.*; import javax.microedition.khronos.opengles.*; public class Triangle extends Shape { private FloatBuffer vertexBuffer; private float[] vertices = { 0.0f , 1.0f , 0.0f, // 0, Top 1.0f , -1.0f , 0.0f, // 1, Right Bottom -1.0f , -1.0f , 0.0f // 2, Left Bottom }; public Triangle() { vertexBuffer = getFloatBufferFromFloatArray(vertices); } /* 그리기 */ public void draw(GL10 gl) { gl.glFrontFace(GL10.GL_CW); // 시계 방향 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); // 버퍼 포인터 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 버퍼 활성화 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 그린다 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); // 버퍼 비활성화 } }
vertices[];
삼각형을 이루는 꼭지점 3개를 지정한다.
삼각형을 이루는 꼭지점 3개를 지정한다.
좌표는 핸드폰 중심을 기준으로 상하좌우 0.0f ~ 1.0f. ( 1.0f는 화면 끝점이 된다. )
vertexBuffer = getFloatBufferFromFloatArray(vertices);
버퍼부분은 어떻게 돌아가는지 모르겠지만 공식과도 같다한다.
버퍼부분은 어떻게 돌아가는지 모르겠지만 공식과도 같다한다.
gl.glFrontFace(GL10.GL_CW);
각 꼭지점을 시계방향으로 그린다. 0 -> 1 -> 2 순서로 그림.
각 꼭지점을 시계방향으로 그린다. 0 -> 1 -> 2 순서로 그림.
GL_CCW - 반시계 방향.
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
꼭지점 값이 있는 실수형 버퍼를 넣는다.
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
꼭지점 배열값을 사용해 그린다.
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
도형 내부가 채워진 삼각형을 그린다.
GL_LINE_LOOP - 도형을 선으로 표현
GL_POINTS - 도형을 점으로 표현
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
그리기 종료(?)
Quad.java
import java.nio.*; import javax.microedition.khronos.opengles.*; public class Quad extends Shape { private FloatBuffer vertexBuffer; private ByteBuffer indexBuffer; private float[] vertices = { -0.5f , 0.5f , 0.0f, // 0, Left Top 0.5f , 0.5f , 0.0f, // 1, Right Top 0.5f , -0.5f , 0.0f, // 2, Right Bottom -0.5f , -0.5f , 0.0f // 3, Left Bottom }; private byte[] index = { 0, 1, 2, 0, 2, 3 }; public Quad() { vertexBuffer = getFloatBufferFromFloatArray(vertices); indexBuffer = getByteBufferFromByteArray(index); } void draw(GL10 gl) { gl.glFrontFace(GL10.GL_CW); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glDrawElements(GL10.GL_TRIANGLES, index.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } }OpenGL은 도형을 그릴때 삼각형을 모아서 다른 도형을 그린다고 한다.
우선 사각형을 이루는 4개의 꼭지점을 지정한다.
index[];
꼭지점을 어떻게 삼각형으로 만들지 정한다.
3개의 꼭지점( 0, 1, 2 )을 연결해 하나의 삼각형으로 만들고, 또다른 삼각형( 0, 2, 3 )을 만든다.
삼각형과는 다르게 indexBuffer도 필요하다.
그려지는 부분또한 삼각형이랑 다른데..
gl.glDrawElements(GL10.GL_TRIANGLES, index.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
index 개수와 indexBuffer를 넣는다.
Shape.java
import java.nio.*; public class Shape { FloatBuffer getFloatBufferFromFloatArray(float array[]) { ByteBuffer tempBuffer = ByteBuffer.allocateDirect(array.length * 4); tempBuffer.order(ByteOrder.nativeOrder()); FloatBuffer buffer = tempBuffer.asFloatBuffer(); buffer.put(array); buffer.position(0); return buffer; } ByteBuffer getByteBufferFromByteArray(byte array[]) { ByteBuffer buffer = ByteBuffer.allocateDirect(array.length); buffer.put(array); buffer.position(0); return buffer; } }버퍼 부분.. 잘 모름...... 아무나 가르쳐줘요 ~ ~ ~
|
'Android > OpenGL' 카테고리의 다른 글
[ Android OpenGL - 04 ] 기본 소스 정리 (0) | 2011.05.20 |
---|---|
[ Android OpenGL ] OpenGL 함수 설명 (0) | 2011.04.25 |
[ Android OpenGL - 03 ] 텍스쳐 입히기 (0) | 2011.04.25 |
[ Android OpenGL - 01 ] 기본 구조 작성 (0) | 2011.03.23 |
[ Android OpenGL ] 시작하기 (0) | 2011.03.23 |