본문 바로가기

카테고리 없음

안드로이드 OpenGL ES 예제, 텍스쳐

안드로이드에서 정점을 이용하여 사각형을 구성하고 텍스쳐를 적용하는 예

사용된 텍스쳐 이미지

Activity

package gl.test6;


import android.app.Activity;

import android.opengl.GLSurfaceView;

import android.os.Bundle;

import android.view.Window;

import android.view.WindowManager;


public class TextureActivity extends Activity {


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


// Remove the title bar from the window.

this.requestWindowFeature(Window.FEATURE_NO_TITLE);


// Make the windows into full screen mode.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);


// Create a OpenGL view.

GLSurfaceView view = new GLSurfaceView(this);


// Creating and attaching the renderer.

MyGLRenderer renderer = new MyGLRenderer(this);

view.setRenderer(renderer);

setContentView(view);

}

}


Renderer

package gl.test6;


import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

import android.content.*;

import android.graphics.*;

import android.opengl.GLSurfaceView.Renderer;

import android.opengl.GLU;


public class MyGLRenderer implements Renderer {

private Context context;

private TexturedRect rect;

public MyGLRenderer(Context context) {

this.context = context;

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.crate3);

rect = new TexturedRect(bitmap);

}


public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// Set the background color to black ( rgba ).

gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

// Enable Smooth Shading, default not really needed.

gl.glShadeModel(GL10.GL_SMOOTH);

// Depth buffer setup.

gl.glClearDepthf(1.0f);

// Enables depth testing.

gl.glEnable(GL10.GL_DEPTH_TEST);

// The type of depth testing to do.

gl.glDepthFunc(GL10.GL_LEQUAL);

// Really nice perspective calculations.

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

}


public void onDrawFrame(GL10 gl) {

// Clears the screen and depth buffer.

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

// Replace the current matrix with the identity matrix

gl.glLoadIdentity();

// Translates 4 units into the screen.

gl.glTranslatef(0, 0, -10);

// Draw our scene.

rect.draw(gl);

}


public void onSurfaceChanged(GL10 gl, int width, int height) {

// Sets the current view port to the new size.

gl.glViewport(0, 0, width, height);

// Select the projection matrix

gl.glMatrixMode(GL10.GL_PROJECTION);

// Reset the projection matrix

gl.glLoadIdentity();

// Calculate the aspect ratio of the window

GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 1000.0f);

// Select the modelview matrix

gl.glMatrixMode(GL10.GL_MODELVIEW);

// Reset the modelview matrix

gl.glLoadIdentity();

}


TexturedRect

package gl.test6;

import java.nio.*;

import javax.microedition.khronos.opengles.GL10;

import android.graphics.*;

import android.opengl.*;


public class TexturedRect {

private float vertices[] = {

     -1.0f,  1.0f, 0.0f,  // 0, Top Left

     -1.0f, -1.0f, 0.0f,  // 1, Bottom Left

      1.0f, -1.0f, 0.0f,  // 2, Bottom Right

      1.0f,  1.0f, 0.0f,  // 3, Top Right

};

// 정점배열의 인덱스를 사용하여 삼각형을 구성한다

private short[] indices = { 0, 1, 2, 0, 2, 3 };

// 정점배열에 선언된 정점의 위치에 텍스쳐 좌표를 배정한다

private float [] textures = {

0.0f, 0.0f, //  0, Top Left

0.0f, 1.0f, //  1, Bottom Left

1.0f, 1.0f, //  2, Bottom Right

1.0f, 0.0f, //  3, Top Right

};


// Our vertex buffer.

private FloatBuffer vertexBuffer;


// Our index buffer.

private ShortBuffer indexBuffer;

// Our UV texture buffer.

private FloatBuffer textureBuffer;


// Our texture id.

private int textureId = -1;


// The bitmap we want to load as a texture.

private Bitmap bitmap;

public TexturedRect(Bitmap bitmap) {

// a float is 4 bytes, therefore we multiply the number if 

// vertices with 4.

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);

vbb.order(ByteOrder.nativeOrder());

vertexBuffer = vbb.asFloatBuffer();

vertexBuffer.put(vertices);

vertexBuffer.position(0);

// short is 2 bytes, therefore we multiply the number if 

// vertices with 2.

ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);

ibb.order(ByteOrder.nativeOrder());

indexBuffer = ibb.asShortBuffer();

indexBuffer.put(indices);

indexBuffer.position(0);

ByteBuffer tbb = ByteBuffer.allocateDirect(vertices.length * 4);

tbb.order(ByteOrder.nativeOrder());

textureBuffer = tbb.asFloatBuffer();

textureBuffer.put(textures);

textureBuffer.position(0);

this.bitmap = bitmap;

}


public void draw(GL10 gl) {

// Counter-clockwise winding.

//gl.glFrontFace(GL10.GL_CCW);

// Enable face culling.

//gl.glEnable(GL10.GL_CULL_FACE);

// What faces to remove with the face culling.

//gl.glCullFace(GL10.GL_BACK);

// Enabled the vertices buffer for writing and to be used during 

// rendering.

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

// Specifies the location and data format of an array of vertex

// coordinates to use when rendering.

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

// 텍스쳐 관련 내용

gl.glEnable(GL10.GL_TEXTURE_2D);

// Enable the texture state

gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);


if(textureId==-1) loadGLTexture(gl);

// Point to our buffers

gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, 

GL10.GL_UNSIGNED_SHORT, indexBuffer);

// Disable the vertices buffer.

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glDisable(GL10.GL_TEXTURE_2D);

// Disable face culling.

gl.glDisable(GL10.GL_CULL_FACE);

}

private void loadGLTexture(GL10 gl) {

// Generate one texture pointer...

int[] textures = new int[1];

gl.glGenTextures(1, textures, 0);

textureId = textures[0];

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

// Create Nearest Filtered Texture

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,

GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,

GL10.GL_LINEAR);

/*

// Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,

GL10.GL_CLAMP_TO_EDGE);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,

GL10.GL_REPEAT);

*/

// Use the Android GLUtils to specify a two-dimensional texture image

// from our bitmap

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

}

}