삼각형과 사각형을 그려볼 차례다.
아래 코드 실행시 삼각형과 사각형이 겹쳐서 나온다... 좌표 바꾸기가 귀찮아서..
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개를 지정한다.
좌표는 핸드폰 중심을 기준으로 상하좌우 0.0f ~ 1.0f. ( 1.0f는 화면 끝점이 된다. )
vertexBuffer = getFloatBufferFromFloatArray(vertices);
버퍼부분은 어떻게 돌아가는지 모르겠지만 공식과도 같다한다.
gl.glFrontFace(GL10.GL_CW);
각 꼭지점을 시계방향으로 그린다. 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;
}
}
버퍼 부분.. 잘 모름...... 아무나 가르쳐줘요 ~ ~ ~