openGL es 纹理问题

淘气娃娃 2014-06-10 02:50:32
我自己写了一个Android 3D 程序,纹理在虚拟机上可以显示出来,但是当把程序安装在手机上运行时,纹理就显示不出来。纹理图片是PNG个格式的,分辨率大小分别为32*32,64*64,128*128,这3种不同分辨率的图片是分别加在drawable-ldpi,drawable-mdpi,drawable-hdpi,文件夹里的。请问这是怎么回事?请大神赐教
public class SW extends Activity {
public myGLSurfaceView myGLView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myGLView=new myGLSurfaceView(this);
setContentView(myGLView);
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
myGLView.onPause();
}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
myGLView.onResume();
}
class myGLSurfaceView extends GLSurfaceView
{
private CubeRender mRenderer;
public myGLSurfaceView(Context context) {
super(context);
// TODO 自动生成的构造函数存根
mRenderer = new CubeRender(context); //创建场景渲染器
setRenderer(mRenderer); //设置渲染器
}

public class CubeRender implements GLSurfaceView.Renderer {
public Context context;
public GLcube cube;
public CubeRender(Context context){
cube=new GLcube();
this.context=context;
}
public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除颜色缓存和深度缓存
gl.glMatrixMode(GL10.GL_MODELVIEW); //设置使用模型矩阵进行变换
gl.glLoadIdentity(); // 初始化单位矩阵
gl.glTranslatef(0.5f, 0f, 0f);
// 当使用GL_MODELVIEW模式时,必须设置视点,也就是观察点
GLU.gluLookAt(gl, 0, 0, -5, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
gl.glRotatef(100, 0.0f, 1.0f, 1.5f); // 旋转总坐标系
// 绘制立方体
cube.draw(gl);
}
public void onSurfaceCreated(GL10 gl,EGLConfig config)
{
//设置窗体的背景颜色
gl.glClearColor(1.0f, 1.0f , 1.0f, 1.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //启用顶点坐标数组
gl.glDisable(GL10.GL_DITHER);// 关闭抗抖动
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 设置系统对透视进行修正
gl.glShadeModel(GL10.GL_SMOOTH); // 设置阴影平滑模式
gl.glEnable(GL10.GL_DEPTH_TEST); // 启用深度测试
gl.glEnable(GL10.GL_CULL_FACE);
gl.glDepthFunc(GL10.GL_LEQUAL); // 设置
/*************纹理贴图设置***********************/
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//启用贴图坐标数组
gl.glEnable(GL10.GL_TEXTURE_2D);//启用纹理贴图

//纹理拉伸
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);//重复拉伸S轴
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);//重复拉伸T轴
cube.loadTexTure1(gl, context);

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

gl.glViewport(0, 0, width, height); //设置OpenGL场景的大小
float ratio = (float) width / height; // 计算透视视窗的宽度、高度比
gl.glMatrixMode(GL10.GL_PROJECTION); // 将当前矩阵模式设为投影矩阵
gl.glLoadIdentity(); // 初始化单位矩阵
// 设置透视视窗的空间大小
GLU.gluPerspective(gl, 45.0f, ratio, 1, 100f);
gl.glLoadIdentity();
}

}

}
public class GLcube {
private final IntBuffer mVertexBuffer; //顶点坐标数据缓冲
private final IntBuffer mVertexBuffer1; //顶点坐标数据缓冲
private IntBuffer mTextureBuffer; //贴图坐标数据缓冲
private int []textureID;
public GLcube() {
int one =65536;
int half = one/2 ;
int vertices[] = {
// 前面
-half, -half, half, half, -half, half,
-half, half, half, half, half, half,
// 背面
-half, -half, -half, -half, half, -half,
half, -half, -half, half, half, -half,
// 左面
-half, -half, half, -half, half, half,
-half, -half, -half, -half, half, -half,
// 右面
half, -half, -half, half, half, -half,
half, -half, half, half, half, half,
// 上面
-half, half, half, half, half, half,
-half, half, -half, half, half, -half,
// 下面
-half, -half, half, -half, -half, -half,
half, -half, half, half, -half, -half,
};
//创建顶点坐标数据缓冲
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder()); //设置字节顺序
mVertexBuffer = vbb.asIntBuffer();//转换为int型缓冲
mVertexBuffer.put(vertices); //向缓冲中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区的起始位置
/******************贴图坐标数组设置***************************/
int textureCoors[]={
// 前面
0, one, one, one, 0, 0, one, 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, 0, 0, 0, one, one, 0, one,
// 下面
0, 0, 0, one, one, 0, one, one,
};//定义贴图坐标数据结束
//创建纹理坐标数据缓冲
ByteBuffer tbb = ByteBuffer.allocateDirect(textureCoors.length * 4);
tbb.order(ByteOrder.nativeOrder()); // 设置字节顺序
mTextureBuffer = tbb.asIntBuffer();// 转换为int型缓冲
mTextureBuffer.put(textureCoors); // 向缓冲中放入贴图坐标数据
mTextureBuffer.position(0);// 设置缓冲区的起始位置
/*********************************************************/
}

public void draw(GL10 gl)
{
gl.glVertexPointer(3, GL10.GL_FIXED, 0, mVertexBuffer); //为画笔指定顶点坐标数据
/********************** 纹理贴图 *********************************************/
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID[0]);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, mTextureBuffer);//为画笔指定贴图坐标数据
/***************************************************************************/
// 绘制FRONT和BACK两个面
gl.glColor4f(0.8f, 0.8f, 0.8f, 1);
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); //绘制图形
// 绘制LEFT和RIGHT两个面
gl.glNormal3f(-1, 0, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID[1]);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); //绘制图形
gl.glNormal3f(1, 0, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4); //绘制图形
// 绘制TOP和BOTTOM两个面
gl.glNormal3f(0, 1, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID[1]);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4); //绘制图形
gl.glNormal3f(0, -1, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); //绘制图形
gl.glFinish();
}
//加载纹理数据
public void loadTexTure1(GL10 gl, Context context) {
textureID=new int[2];
gl.glGenTextures(2, textureID, 0);
textureID[0]=intbuffer.get();
gl.glBindTexture(GL10.GL_TEXTURE_2D,textureID[0]);
Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),
R.drawable.grassland512); //加载位图
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); //使用图片生成纹理
bmp.recycle();
gl.glBindTexture(GL10.GL_TEXTURE_2D,textureID[1]);
Bitmap bmp1 = BitmapFactory.decodeResource(context.getResources(),
R.drawable.pic); //加载位图
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp1, 0); //使用图片生成纹理
bmp.recycle(); //释放资源
}





}

...全文
211 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
淘气娃娃 2014-06-17
  • 打赏
  • 举报
回复
看来是没人回复了,要结帖了
夜雨疯子 2014-06-11
  • 打赏
  • 举报
回复
要不要向z轴里面偏移一点点?
淘气娃娃 2014-06-11
  • 打赏
  • 举报
回复
回复于: 2014-06-11 12:02:52 要不要向z轴里面偏移一点点? 可以偏移也可以不偏移,看你自己
淘气娃娃 2014-06-10
  • 打赏
  • 举报
回复
谢谢啦
韩曙亮 2014-06-10
  • 打赏
  • 举报
回复
不是很会, 帮你顶一下

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧