android 纹理映射-OpenGL 纹理映射无法显示纹理

问题描述

OpenGL 纹理映射无法显示纹理

初学者,希望大侠们能做个解答,小弟在此先行谢过,问题很简单,但我琢磨好久都没搞出来,也找不出问题所在。

想要实现的的功能也很简单,就是纹理。

问题所在:运行之后只有背景,没有纹理

开发环境:Eclipse ADT

源代码:

一、SRC/ SFGame.java

package com.gamewenli;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

public class SFGame extends Activity {
Renderer render = new SFBameRenderer(this);
GLSurfaceView gameView;
Button start;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
GLImage.load(this.getResources());
gameView = new GLSurfaceView(this);
gameView.setRenderer(render);
setContentView(R.layout.pageone);
start = (Button) findViewById(R.id.button1);

start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(gameView);
}
});

二、

SRC/SFBameRenderer.java

package com.gamewenli;

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.content.Context;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLUtils;

public class SFBameRenderer implements Renderer {
public Context context;
private int[] textureids;
private FloatBuffer vertexBuffer;
private FloatBuffer textureBuffer;
//private ByteBuffer indexBuffer;

//vertices[]数组会列出一系列的点,其中每一行代表正方形一角的X,Y,Z的值.
private float vertices[] ={
0f, 0f, 0f,
1f, 0f, 0f,
1f, 1f, 0f,
0f, 1f, 0f,
};
//texture[]数组表示纹理的四角在何处能与所创建的正方形四角排成一条直线
private float texture[] = {
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f
};
//indices[]数组表示正方形表面的定义,正方形的表面被划分为两个三角形,该数组就是逆时针方向上这些三角形的角度数。
//private byte indices[] = {
//0, 1, 2,
//0, 2, 3
//};

public SFBameRenderer(Context context) {
this.context = context;
textureids = new int[1];

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);

ByteBuffer tbb = ByteBuffer.allocateDirect(texture.length * 4);
tbb.order(ByteOrder.nativeOrder());
textureBuffer = tbb.asFloatBuffer();

//indexBuffer = ByteBuffer.allocateDirect(indices.length);
//indexBuffer.put(indices);
//indexBuffer.position(0);

//为正方形贴上纹理
//for (int i = 0; i < 1; i++) {
textureBuffer.put(texture);
//}
textureBuffer.position(0);
}

@Override
public void onDrawFrame(GL10 gl) {
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 开启顶点和纹理功能(开启顶点和纹理缓冲)
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// 设置顶点和纹理
gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexBuffer);
gl.glTexCoordPointer(3, GL10.GL_FIXED, 0, textureBuffer);
// 绘制正方形
//int i = 1;
//switch (i) {
//case 0:
// 生成纹理
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0);
// 关闭顶点和纹理功能
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
//}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
float ratio = (float) (width) / height;
// 设置OpenGL场景的大小
gl.glViewport(0, 0, width, height);
// 设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
// 重置投影矩阵
gl.glLoadIdentity();
// 设置视口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
// 绿色背景

gl.glClearColor(0, 1, 0, 0);
gl.glEnable(GL10.GL_CULL_FACE);
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
//启用纹理映射

gl.glClearDepthf(1.0f);
//深度测试的类型

gl.glDepthFunc(GL10.GL_LEQUAL);
// 允许2D贴图,纹理

gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);
// 创建纹理

gl.glGenTextures(1, textureids, 0);
// 绑定要使用的纹理
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureids[0]);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0);
// 线性滤波

gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
}

}

}
}

class GLImage {
public static Bitmap iBitmap;
public static Bitmap close_Bitmap;
public static void load(Resources resources) {
iBitmap = BitmapFactory.decodeResource(resources, R.drawable.wall);
}

}

三、

RES/Androidmanifest.xml

package="com.gamewenli"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity android:name="SFGame">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
时间: 2024-09-15 16:22:59

android 纹理映射-OpenGL 纹理映射无法显示纹理的相关文章

android 使用 opengl 2.0 显示一张静态背景图片,效果显示出来的很奇怪

问题描述 android 使用 opengl 2.0 显示一张静态背景图片,效果显示出来的很奇怪 背景原图是: 显示的效果却是: 我不知道我的代码错在哪了.请有OpenGL开发经验的兄弟帮忙下.我的代码如下: public class BackgroundGLRnder implements GLSurfaceView.Renderer { // Our matrices private final float[] mtrxProjection = new float[16]; private

Android开发 OpenGL ES绘制3D 图形实例详解_Android

OpenGL ES是 OpenGL三维图形API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计. Ophone目前支持OpenGL ES 1.0 ,OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的.本文主要介绍利用OpenGL ES绘制图形方面的基本步骤. 本文内容由三部分构成.首先通过EGL获得OpenGL ES的编程接口;其次介绍构建3D程序的基本概念;最后是一个应用程序示例. OpenGL E

android 中opengl画正方体,其顶底坐标还有索引是怎么计算和定义的?

问题描述 android 中opengl画正方体,其顶底坐标还有索引是怎么计算和定义的? 能不能给个具体例子 ,详细说明,顺时针逆时针还是索引法?以及坐标旋转方法.不用给我讲很多例子 ,只用搞懂一种做法就好了? 解决方案 android OpenGl Es实现正方体多纹理 解决方案二: 我表示OPENGL 我不懂,同等答案 解决方案三: opengl es画图形都是通过三角形来画的,当然还可以画直线和点 画图形的时候有两种方法:glDrawArrays( ) 和glDrawElements( )

opengl-求问:OpenGL 4.3 通过纹理传递整形数据失败?

问题描述 求问:OpenGL 4.3 通过纹理传递整形数据失败? GLSL4.3 通过Texture向Shader传递整数数据,但不成功,Shader不能正确读取整数数据, 如果传递的是浮点型的纹理数据,则可以正确读取数据的: 例如:C代码中:glTexStorage2D( GL_TEXTURE_2D, 1, GL_RGBA32F, tw, th ); Shader中:layout (binding = 0) uniform sampler2D tex_float; vec4 data = te

tablet-在 android 平板上的动画显示错误

问题描述 在 android 平板上的动画显示错误 我开发一个android程序,开始于启动画面.程序在模拟器和真机上可以运行,但是平板上不行. package com.example.project; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Window; import an

Android 自定义一个可以展开显示更多的文本布局

在查阅其他博主的博文中,发现了一个比较不错的文本伸展的效果,在此借鉴学习.可以先看看到底是什么样的效果 看起来很眼熟吧,很多应用中都有这样的使用场景,其实就是控制textview的maxlines属性,来做的.在这里就简单的说下定义的过程 1.stretchy_text_layout.xml --这是创建一个布局,用来装裱以上展示的控件 [html] view plain copy <?xml version="1.0" encoding="utf-8"?&g

Android 个人理财工具六:显示账单明细 下_Android

     上一节的显示账单明细 上中,账单明细的显示已经基本实现,本文主要整理下代码,实现此窗口的查询和删除功能:按下Menu菜单时弹出选择月份的窗口,可选择明细的月份:在ListView上长按可弹出确认删除的对话框,以完成删除.        下面上图:        这里面有个OnItemLongClickListener 事件,这个事件的用法如下:        首先activity 里面implements OnItemLongClickListener,然后如下面的代码所写: Java

Android 个人理财工具五:显示账单明细 上_Android

前面我们已经将每个月的收支明细存入到SQLite的数据表中,本文将实现从SQLite的数据表中取出这些数据显示为账单明细界面.        下图是最终的效果图:        在设计该界面时我考虑过好几个方案.本来准备使用一个gridview,因为觉得名字很像我需要的东西.可是后来查了一些资料,并且做了点实验,发现和我想象的有些差距.于是采用了目前这种方式.使用Listview.        这个界面布局实际上很简单,就是上面一个表头(Linearlayout),中间一个Listview,下

Android的Fragment 进入时显示正在加载

问题描述 Android的Fragment 进入时显示正在加载 像微信那样,地址四个功能,点击尚为加载的Fragment显示 一个在加载的进度条(圆形的)不是ProgressDialog喔, 没有思路.