텍스처가 전혀 보이지 않습니다.
프로젝트의 타겟 버전은 2.2와 4.2 시험해봤습니다.
package com.example.testgame;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.GLUtils;
import android.util.Log;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
//랜더를 위한 초기값 설정
public class glRenderer implements GLSurfaceView.Renderer{
//시선처리를 위한 명령어 셋
static final int plusX = 1, minusX = 2, plusY = 3, minusY = 4, plusZ = 5, minusZ = 6;
static final int plusAX = 7, minusAX = 8, plusAY = 9, minusAY = 10, plusAZ = 11, minusAZ = 12;
//컨텍스트
Context ctx;
//버텍스와 텍스처
FloatBuffer fbVtx, fbCol;
FloatBuffer fbVtxAxis, fbVtxGrid;
//삼각형 버텍스, 당장 안쓰니 꺼둠.
//FLoatBuffer fbVtxTri;
//판넬
FloatBuffer fbVtxPlane;
FloatBuffer fbTexPlane;
//입방체
FloatBuffer fbVtxCube;
FloatBuffer fbTexCube;
//UI와 뒷배경
FloatBuffer[] fbaBack = new FloatBuffer[2];
FloatBuffer[] fbaUI = new FloatBuffer[2];
//회전 각 및 화면크기
float angle, lcdW, lcdH;
int order;
//관찰자와 목표점 설정
float posX = 7, posY = 7, posZ = 7, atX, atY, atZ;
//터치가 이루어졌는지 확인
public boolean touch;
//회전을 위해서
float angle2;
int n;
//텍스처는 세개를 사용
int[] texture = new int[3];
float half=0.5f, one=1.f;
//큐브 버텍스
float faVtxCube[] = {
// front
-half,-half,half, half,-half,half,
-half,half,half, half,half,half,
// back
half,-half,-half, -half,-half,-half,
half,half,-half, -half,half,-half,
// left side
-half,-half,-half, -half,-half,half,
-half,half,-half, -half,half,half,
// right side
half,-half,half, half,-half,-half,
half,half,half, half,half,-half,
// top
-half,half,half, half,half,half,
-half,half,-half, half,half,-half,
// bottom
-half,-half,-half, half,-half,-half,
-half,-half,half, half,-half,half
};
//큐브 텍스쳐
float faTexCube[] = {
0,one, one,one, 0,0, one,0,
0,one, one,one, 0,0, one,0,
0,one, one,one, 0,0, one,0,
0,one, one,one, 0,0, one,0,
0,one, one,one, 0,0, one,0,
0,one, one,one, 0,0, one,0
};
//광원처리 위해서
//텍스처 안되니 이거라도 시험.
float lightPos[] = {5,5,5,0};
float lightAmbi[] = {.1f,.1f,.1f,1};
float lightSpec[] = {.5f,.5f,.5f,1};
float lightDiff[] = {.5f,.5f,.5f,1};
//광원 메트릭스 설정
float MatAmb[] = {0, 0, 1, 1};
float MatDif[] = {.5f,.5f,.5f, 1};
float MatSpc[] = {.5f,.5f,.5f, 1};
public glRenderer(Context context) {
// TODO Auto-generated constructor stub
ctx = context;
//그리드를 위한 버텍스
float faVtx[] = { -10,0,0, 10,0,0, 0,0,-10, 0,0,10};
fbVtxGrid = loadBuffer(faVtx);
//기준점을 위한 버텍스
float faAxis[] = { 0,0,0, 4,0,0, 0,0,0, 0,4,0, 0,0,0, 0,0,4};
fbVtxAxis = loadBuffer(faAxis);
//컬러 버퍼 설정
float faCol[] = {1,0,0,1, 1,0,0,1, 0,1,0,1, 0,1,0,1, 0,0,1,1, 0,0,1,1,};
fbCol = loadBuffer(faCol);
/*
float faTri[] = {
0,0,3, 1,0,0, -1,0,0, //바닥에 누운 삼각형
};
fbVtxTri = loadBuffer(faTri);
*/
//판넬 버텍스 설정
float faPlane[] = {
-1.0f, 1.0f,0, -1.0f,-1.0f,0, 1.0f,-1.0f,0,
-1.0f, 1.0f,0, 1.0f,-1.0f,0, 1.0f,1.0f,0, //triangles
-1.0f,-1.0f,0, 1.0f,-1.0f,0, -1.0f,1.0f,0, 1.0f,1.0f,0, //strip
-1.0f,-1.0f,0, 1.0f,-1.0f,0, 1.0f,1.0f,0, -1.0f,1.0f,0 //fan
};
fbVtxPlane = loadBuffer(faPlane);
//판넬 텍스처 설정
//좌표에 맞춰 설정해주자.
float faTexPlane[] = {0,0, 0,1, 1,1, 0,0, 1,1, 1,0};
fbTexPlane = loadBuffer(faTexPlane);
//큐브 버텍스, 텍스처 로드
fbVtxCube = loadBuffer(faVtxCube);
fbTexCube = loadBuffer(faTexCube);
//백그라운드 및 UI 로드
fbaBack = loadImage(0,0,320,480,0,0,512);
fbaUI = loadImage(0,0,144,72,320,0,512);
}
private FloatBuffer loadBuffer(float[] fa) {
// TODO Auto-generated method stub
FloatBuffer fb = ByteBuffer.allocateDirect(fa.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
fb.put(fa).position(0);
return fb;
}
FloatBuffer[] loadImage(float x, float y, float w, float h , float tx, float ty, float ts){
FloatBuffer[] fba = new FloatBuffer[2];
float vtx[] = {x, y+h, x+w, y+h, x,y, x+w, y};
float tex[] = {tx/ts, (ty+h)/ts, (tx+w)/ts, (ty+h)/ts, tx/ts, y/ts, (tx+w)/ts, ty};
fba[0] = loadBuffer(vtx);
fba[1] = loadBuffer(tex);
return fba;
}
void drawImage(GL10 gl, FloatBuffer[] fba, int texID){
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, lcdW, lcdH, 0, 0, 0.1f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D,texID);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fba[1]);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, fba[0]);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
void drawImage(GL10 gl, FloatBuffer[] fba, int w, int h, int texID){
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, w, h, 0, 0, 0.1f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D,texID);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fba[1]);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, fba[0]);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glEnable(GL10.GL_DEPTH_TEST);
}
boolean pointInRect(float x, float y, int X, int Y, int W, int H){
if(X < x && x < X+H && y > Y && y < Y + H) return true;
else return false;
}
void setOrder(float x, float y){
if(pointInRect(x,y, 0,24,24,24)) order = plusX;
else if(pointInRect(x,y, 24,24,24,24)) order = plusY;
else if(pointInRect(x,y, 48,24,24,24)) order = plusZ;
else if(pointInRect(x,y, 72,24,24,24)) order = plusAX;
else if(pointInRect(x,y, 96,24,24,24)) order = plusAY;
else if(pointInRect(x,y, 120,24,24,24)) order = plusAZ;
else if(pointInRect(x,y, 0,48,24,24)) order = minusX;
else if(pointInRect(x,y, 24,48,24,24)) order = minusY;
else if(pointInRect(x,y, 48,48,24,24)) order = minusZ;
else if(pointInRect(x,y, 72,48,24,24)) order = minusAX;
else if(pointInRect(x,y, 96,48,24,24)) order = minusAY;
else if(pointInRect(x,y, 120,48,24,24)) order = minusAZ;
else order = 0;
}
private void onProcess(){
switch(order){
case plusX: posX+=0.3f; break;
case minusX: posX-=0.3f; break;
case plusY: posY+=0.3f; break;
case minusY: posY-=0.3f; break;
case plusZ: posZ+=0.3f; break;
case minusZ: posZ-=0.3f; break;
case plusAX: atX+=0.1f; break;
case minusAX: atX-=0.1f; break;
case plusAY: atY+=0.1f; break;
case minusAY: atY-=0.1f; break;
case plusAZ: atZ+=0.1f; break;
case minusAZ: atZ-=0.1f; break;
}
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
onProcess();
drawImage(gl,fbaBack,320,480,texture[2]);
gl.glClear(GL10.GL_DEPTH_BUFFER_BIT);
//카메라 설정
gl.glViewport(0, 0, (int)lcdW, (int)lcdH); //viewport
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45, (float)lcdW/(float)(lcdH), 1, 100);
//직교투영시
//gl.glOrthof(-10, 10, -10, 10, 1, 100);
//카메라도 로테이트 트랜슬레이트 다 먹음. 스케일은 의미가 없졍.
GLU.gluLookAt(gl, posX,posY,posZ, atX,atY,atZ, 0,1,0);
//기준점 설정
gl.glMatrixMode(GL10.GL_MODELVIEW);
drawAxis(gl);
drawGrid(gl);
//입방체1
gl.glLoadIdentity();
gl.glTranslatef(3, 0, 2);
gl.glRotatef(angle++, 0, 1, 0);
drawCube(gl,texture[0]);
//판떼기1
gl.glLoadIdentity();
gl.glRotatef(angle++, 0, 1, 0);
gl.glTranslatef(3, 0, 0);
drawPlane(gl,texture[1]);
//블랜드
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_BLEND);
//소스값의 알파값을 1로 섞어주겠다.
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
gl.glColor4f(1, 1, 1, 0.7f );
drawImage(gl,fbaUI,texture[2]);
gl.glDisable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_DEPTH_TEST);
}
void drawPlane(GL10 gl){
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbVtxPlane);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);
// gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 6, 4);
// gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 10, 4);
}
void drawPlane(GL10 gl, int texID){
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texID);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fbTexPlane);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbVtxPlane);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);
gl.glDisable(GL10.GL_TEXTURE_2D);
}
void drawCube(GL10 gl, int texID){
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texID);
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,fbTexCube);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbVtxCube);
gl.glNormal3f(0, 0, 1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glNormal3f(0, 0, -1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);
gl.glNormal3f(-1, 0, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
gl.glNormal3f(1, 0, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);
gl.glNormal3f(0, 1, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
gl.glNormal3f(0, -1, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);
gl.glDisable(GL10.GL_TEXTURE_2D);
}
/*
void drawTriangle(GL10 gl){
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbVtxTri);
gl.glColor4f(1, 0, 1, 1);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
*/
void drawGrid(GL10 gl){
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbVtxGrid);
gl.glColor4f(.5f, .5f, .5f, 1);
gl.glLineWidth(1.f);
for(float f=-10.0f ; f <= 10.0f; f++){
gl.glLoadIdentity();
gl.glTranslatef(0, 0, f);
gl.glDrawArrays(GL10.GL_LINES, 0, 2);
gl.glLoadIdentity();
gl.glTranslatef(f, 0, 0);
gl.glDrawArrays(GL10.GL_LINES, 2, 2);
}
//리셋시켜줌
gl.glColor4f(1, 1, 1, 1);
// gl.glLineWidth(1f);
}
void drawAxis(GL10 gl){
gl.glLoadIdentity();
gl.glLineWidth(5.f);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// gl.glColor4f(1, 1, 1, 1);
// gl.glColorPointer(4, GL10.GL_FLOAT, 0, fbCol);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbVtxAxis);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, fbCol);
gl.glDrawArrays(GL10.GL_LINES, 0,6);
// gl.glDrawArrays(GL10.GL_LINES, 0, 2);
//
// gl.glDrawArrays(GL10.GL_LINES, 2, 2);
//
// gl.glDrawArrays(GL10.GL_LINES, 4, 2);
// gl.glColor4f(1, 1, 1, 1);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}
//뷰포트 설정
@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {
// TODO Auto-generated method stub
gl.glViewport(0, 0, w,h);
lcdW = w;
lcdH = h;
}
//백버퍼 지우기, 어레이 사용설정
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
//이중버퍼 안쓰면 해결. 두개라서 하나는 까맣고 하나는 하얗고.
gl.glClearColor(0,0,0,1);
//뎁스 테스트를 한다. 테스트 기준은 작거나 같으면.
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
//버텍스 어레이, 텍스처 어레이를 사용하겠다 선언.
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//GenTexture 정확한 의미 뭐였지...?
gl.glGenTextures(2,texture,0);
bindTexture(gl,texture[0],R.drawable.chrb);
bindTexture(gl,texture[1],R.drawable.chr2b);
bindTexture(gl,texture[2],R.drawable.chr3b);
gl.glPointSize(5.f);
gl.glLineWidth(5.f);
}
void bindTexture(GL10 gl, int texID, int resID){
gl.glBindTexture(GL10.GL_TEXTURE_2D, texID);
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);
Bitmap png = BitmapFactory.decodeResource(ctx.getResources(), resID);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, png, 0);
png.recycle();
}
}
선배님들의 많은 도움 부탁드립니다. ( _ _);;
찾았네요;
이미지를 drawable-mdpi 폴더에만 넣어놓으니 못찾는 문제였습니다.
다른 폴더에도 복사하여 넣어주면 해결