<--! [java] Opengl을 이용한 삼각형, 사각형 만들기 -->

[java] Opengl을 이용한 삼각형, 사각형 만들기

필그램

·

2017. 10. 7. 23:28

오픈GL을 공부하면서 'Beginning Android Games'라는 Mario Zechner공저의 책을 이용했습니다.


삼각형은 소스에서 크기를 변경했고,

사각형은 일부 함수를 바꾸었습니다.

그리고, impliment의 소스파일은 책은 소스를 이용했습니다. ( https://github.com/Apress/beg-android-games-2ed.git)


메인화면에 버튼을 만들고 도형 화면 을 링크했습니다.



삼각형

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

import korea2canada.com.test2_jiwonkim.framework.Game;
import korea2canada.com.test2_jiwonkim.framework.Screen;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGame;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGraphics;


public class MyTriangle2 extends GLGame {
public Screen getStartScreen() {
return new ColoredTriangleScreen(this);
}

class ColoredTriangleScreen extends Screen {
final int VERTEX_SIZE = (2 + 4) * 4;
GLGraphics glGraphics;
FloatBuffer vertices;

public ColoredTriangleScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put( new float[] { 80.0f, 80.0f, 1, 0, 0, 1,
260.0f, 80.0f, 0, 1, 0, 1,
160f, 400.0f, 0, 0, 1, 1});
vertices.flip();
}

@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}

@Override
public void update(float deltaTime) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public void dispose() {
}
}

}


사각형


import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

import korea2canada.com.test2_jiwonkim.framework.Game;
import korea2canada.com.test2_jiwonkim.framework.Screen;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGame;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGraphics;


public class MySquare2 extends GLGame {
public Screen getStartScreen() {
return new ColoredSquareScreen(this);
}

class ColoredSquareScreen extends Screen {
final int VERTEX_SIZE = (2 + 4) * 4;
// final int VERTEX_SIZE = (2 + 4) * 4;
GLGraphics glGraphics;
FloatBuffer vertices;

public ColoredSquareScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * VERTEX_SIZE);
// ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();


vertices.put( new float[] { 80.0f, 120.0f, 1, 0, 0, 1,
260.0f, 120.0f, 0, 1, 0, 1,
260.0f, 300.0f, 0, 1, 0, 1,
80.0f, 300.0f, 0, 0, 1, 1});


vertices.flip();
}

@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

// gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
}

@Override
public void update(float deltaTime) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public void dispose() {
}
}

}


//

gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); 

=> 이부분을 사각형으로 바꾸면서 4로 교체하고, 꼭지점 갯수를 4개로 늘렸습니다.

아래는 디렉토리 화면입니다. 맨 위의 링크를 참조하여 framework가 있어야 합니다.



그리고 메인화면을 아래와같이 만들었습니다. 아래의 소스는 제외하였습니다.


삼각형의 화면입니다.


아래는 사각형의 화면입니다.


반응형