안녕하세요ㅎ
openGL을 사용해서 텍스쳐 맵핑을 하려고 합니다.
아직 초보라 어느 클래스 어느 함수에서 맵핑하는것을 진행해야 하는지 감이 안오네요ㅠ
책 예제와 검색을 하면서 소스를 조금 짜 보았는데
도움 주시면 감사하겠습니다
제 소스입니다.
package com.example.android.apis;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.GLUtils;
import android.os.Bundle;
public class ApiDemos extends Activity {
/** Called when the activity is first created. */
private GLSurfaceView mGLSurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kang);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
mGLSurfaceView = new GLSurfaceView(this); //내부적으로 GL요청을 처리함
mGLSurfaceView.setRenderer(new GLRenderer()); //프레임에 그림을 그림
setContentView(mGLSurfaceView);
}
}
class GLRenderer implements GLSurfaceView.Renderer{
final static int WIDTH = 320;
final static int HEIGHT = 480;
//사각형의 정점을 정의
float[] rec = new float[]{
-0.5f, -0.5f, 0, //bottom left
-0.5f, 0.5f, 0, //top left
0.5f, -0.5f, 0, //bottom right
0.5f, 0.5f, 0}; //top right
FloatBuffer recVB;
float xrot = 0.0f; //x축
float yrot = 0.0f; //y축
public GLRenderer(){
recVB = createFloatBuffer(rec);
}
@Override
public void onDrawFrame(GL10 gl){
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glColor4f(1, 1, 1, 1); //사각형
//배열을 Buffer클래스에 넘겨줘야한다
//배열을 버퍼로 만든다
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, recVB);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//이미지처리
/* gl.glPushMatrix(); //push matrix
gl.glRotatef(xrot++, 10.0f, 0.0f, 0.0f); //x 축 rotate
gl.glRotatef(yrot++, 0.0f, 10.0f, 0.0f); //y 축 rotate
gl.glTranslatef(d++, f++, e++); //translate
//gl.glScalef(a++, b++, c++); //scale
*/
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
// gl.glPopMatrix(); //pop matrix
//택스쳐 맵핑
gl.glEnable(GL10.GL_TEXTURE_2D);
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, recVB);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height){
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //색상버퍼 클리어(바탕)
gl.glViewport(0, 0, WIDTH, HEIGHT); //카메라설정
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, -1.0f, 1.0f, -1.0f, 1.0f);
}
protected FloatBuffer createFloatBuffer(float array[]){
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(array.length<<2);
byteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
floatBuffer.put(array);
floatBuffer.position(0);
return floatBuffer;
}
}