에뮬레이터에서 실행했을 때는

3d 모델에 텍스처 입히는 데에 문제가 없는데



디바이스로 옴겨서 시험하면

텍스처가 전혀 보이지 않습니다.




실행기기는 갤럭시탭 7.0(진저브레드) 이고


에뮬레이터 실행시에는 안드로이드 2.3.3 버전 에뮬레이터에서 





프로젝트의 타겟 버전은 2.2와 4.2 시험해봤습니다.






[소스코드]


MainActivity.java


package com.example.testgame;


import android.opengl.GLSurfaceView;


import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.content.pm.ActivityInfo;

import android.view.KeyEvent;

import android.view.MotionEvent;

import android.view.Window;

import android.view.WindowManager;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(R.layout.activity_main);

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

WindowManager.LayoutParams.FLAG_FULLSCREEN);

//세로보기

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

//가로보기

//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

requestWindowFeature(Window.FEATURE_NO_TITLE);


setContentView(new glView(getBaseContext()));

}

//뷰 클래스를 정의

class glView extends GLSurfaceView{


private glRenderer render;

public glView(Context context) {

super(context);

//랜더 생성 및 설정

render = new glRenderer(context);

setRenderer(render);

//포커스와 터치모드를 줌.

setFocusable(true);

setFocusableInTouchMode(true);

}

public boolean onTouchEvent(MotionEvent event){

if(event.getAction() == MotionEvent.ACTION_DOWN){

//실제 터치 영역에 대한 판단은 랜더에서 한다.

render.touch = true;

render.setOrder(event.getX(), event.getY());

}

if(event.getAction() == MotionEvent.ACTION_UP){

render.touch = false;

}

return true;

}

}


}












glRenderer.java




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();
}
}






선배님들의 많은 도움 부탁드립니다. ( _ _);;