|
|
텍스쳐 입히기( 이미지 덮어 씌우기 )
아래 내용은 100% 정확한 것이 아니며, 여기저기서 보고 실행해본 결과를 토대로 작성하였다.
기존 소스에서 몇 부분만 추가. Triangle 클래스는 사용하지 않고 Quad 클래스만 사용하여 연습해본다.
Quad.java
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.graphics.*;
import android.opengl.*;
public class Quad extends Shape {
private FloatBuffer vertexBuffer;
private ShortBuffer indexBuffer;
private FloatBuffer textureBuffer;
private int[] textureName;
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 short[] index = {
0, 1, 2,
0, 2, 3
};
private float[] texture = {
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
public Quad() {
textureName = new int[1];
vertexBuffer = getFloatBufferFromFloatArray(vertices);
indexBuffer = getByteBufferFromByteArray(index);
textureBuffer = getFloatBufferFromTextureArray(texture);
}
/* Draw */
public void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CW);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, index.length, GL10.GL_UNSIGNED_SHORT, indexBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
/* Initialize Texture */
public void InitTexture(GL10 gl, Context context) {
Bitmap imgPanda = BitmapFactory.decodeResource(context.getResources(), R.drawable.panda);
gl.glGenTextures(1, textureName, 0); // 텍스쳐 포인터 설정
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName[0]); // 텍스쳐 사용 연결
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, imgPanda, 0);
imgPanda.recycle();
}
}
우선 추가된 부분을 보면.
FloatBuffer textureBuffer;
텍스쳐 버퍼.
int[] textureName;
텍스쳐 포인터를 담는다.
float[] texture;
텍스쳐 좌표. 좌표를 어떻게 하느냐에 따라 이미지가 이상하게 붙어버린다.
어떤 순서로 붙는지 모르겠다.
어떤 순서로 붙는지 모르겠다.
InitTexture();
GLGameRenderer.java 에서 접근.
우선 Bitmap 이미지를 가져온다.
주의할점!! 이미지의 가로, 세로 길이가 '2의 배수'가 아니면 이미지가 나오지않는다.
gl.glGenTextures(1, textureName, 0);
텍스쳐 포인터 생성.
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName[0]);
텍스쳐 연결.
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
이미지 자동 확대, 축소.
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, imgPanda, 0);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, imgPanda, 0);
비트맵을 OpenGL 텍스쳐로 변경.
Draw();
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
텍스쳐 좌표 설정.
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
텍스쳐 활성화.
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
비활성화.
이전까지와는 다르게 텍스쳐 버퍼가 추가되었다.
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;
}
ShortBuffer getByteBufferFromByteArray(short[] index) {
ByteBuffer b = ByteBuffer.allocateDirect(index.length * 2);
b.order(ByteOrder.nativeOrder());
ShortBuffer buffer = b.asShortBuffer();
buffer.put(index);
buffer.position(0);
return buffer;
}
FloatBuffer getFloatBufferFromTextureArray(float texture[]) {
ByteBuffer tbb = ByteBuffer.allocateDirect(texture.length * 4);
tbb.order(ByteOrder.nativeOrder());
FloatBuffer buffer = tbb.asFloatBuffer();
buffer.put(texture);
buffer.position(0);
return buffer;
}
}
버퍼............GLGameRenderer.java
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//|GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
// mTriangle.draw(gl);
mQuad.draw(gl);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
mQuad.InitTexture(gl, context);
gl.glClearColor(0, 1, 0, 0.5f); // RGBA
gl.glEnable(GL10.GL_TEXTURE_2D); // 텍스쳐 활성
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // ??
}
onSurfaceCreated();mQuad.InitTexture(gl, context); 텍스쳐 초기화.
gl.glEnable(GL10.GL_TEXTURE_2D); 텍스쳐를 활성화 시킨다.
|
|
'Android > OpenGL' 카테고리의 다른 글
| [ Android OpenGL - 04 ] 기본 소스 정리 (0) | 2011.05.20 |
|---|---|
| [ Android OpenGL ] OpenGL 함수 설명 (0) | 2011.04.25 |
| [ Android OpenGL - 02 ] 삼각형, 사각형 그리기 (0) | 2011.04.21 |
| [ Android OpenGL - 01 ] 기본 구조 작성 (0) | 2011.03.23 |
| [ Android OpenGL ] 시작하기 (0) | 2011.03.23 |