2011.04.21 17:25 Android/OpenGL



삼각형과 사각형을 그려볼 차례다.

아래 코드 실행시 삼각형과 사각형이 겹쳐서 나온다... 좌표 바꾸기가 귀찮아서.. 

 

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;
	}
}
버퍼 부분.. 잘 모름...... 아무나 가르쳐줘요 ~ ~ ~


 



posted by 베라뷰
TAG