GL_TRIANGLE_STRIP之纹理贴图
一、基础知识:
GL_TRIANGLE_STRIP比GL_TRIANLGES 快100% ~ 200%。
建议:尽可能地使用GL_TRIANGLE_STRIP替代GL_TRIANGLES。
二、使用方法:
1.首先以框架入手,我们一般在Android上画一个3D的图形,需要在MainActivity的OnCreate函数中加入如下代码,用来进入我们的3D场景界面:
[java]
glView = new GLSu易做图ceView(this); // 创建一个GLSu易做图ceView
glView.setRenderer(new MyGLRenderer(this)); // 使用定制的渲染器
setContentView(glView);
glView = new GLSu易做图ceView(this); // 创建一个GLSu易做图ceView
glView.setRenderer(new MyGLRenderer(this)); // 使用定制的渲染器
setContentView(glView); 其中,glView为GLSu易做图ceView glView的引用对象,在MainActivity中的成员变量中声明:
[java]
private GLSu易做图ceView glView; // 使用GLSu易做图ceView
private GLSu易做图ceView glView; // 使用GLSu易做图ceView
2.接下来实现3D场景中的绚烂器(GLSu易做图ceView.Renderer):
[java]
public class MyGLRenderer implements GLSu易做图ceView.Renderer {
// 实现代码
}
public class MyGLRenderer implements GLSu易做图ceView.Renderer {
// 实现代码
}
①构造函数的编写:
[java]
/ Constructor with global application context
public MyGLRenderer(Context context) {
this.context = context;
// 设置所用图形的数据数组缓冲区
cube = new TextureCube();
}
// Constructor with global application context
public MyGLRenderer(Context context) {
this.context = context;
// 设置所用图形的数据数组缓冲区
cube = new TextureCube();
}
其中,TextureCube 为我们自己的纹理类,需要自己实现,后面会有实现。context和cube分别为成员变量:
[java]
private Context context; // 应用的上下文句柄
private TextureCube cube;
private Context context; // 应用的上下文句柄
private TextureCube cube;
②重载函数onSu易做图ceCreated,创建绚烂器时需要初始化的部分皆在此:
[java]
// Call back when the su易做图ce is first created or re-created
@Override
public void onSu易做图ceCreated(GL10 gl, EGLConfig config)
{
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 设置背景颜色
gl.glClearColor(0.2f, 0.4f, 0.52f, 1.0f);
// 设置深度缓存
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
// 禁止抖动以取得更好的性能
gl.glDisable(GL10.GL_DITHER);
// 设置纹理
cube.loadTexture(gl, context); // 加载纹理
gl.glEnable(GL10.GL_TEXTURE_2D); // 纹理使能
}
// Call back when the su易做图ce is first created or re-created
@Override
public void onSu易做图ceCreated(GL10 gl, EGLConfig config)
{
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 设置背景颜色
gl.glClearColor(0.2f, 0.4f, 0.52f, 1.0f);
// 设置深度缓存
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
// 禁止抖动以取得更好的性能
gl.glDisable(GL10.GL_DITHER);
// 设置纹理
cube.loadTexture(gl, context); // 加载纹理
gl.glEnable(GL10.GL_TEXTURE_2D); // 纹理使能
}
以上一些功能的打开和声明,都可以在我博客之前的一些文章中找到,不在详述。
最重要的一句就是 cube.loadTexture(gl, context); 加载纹理。
③重载函数onSu易做图ceChanged,当屏幕旋转(横屏变为竖屏)时,调用。当然,在初始化的时候也是要调用的:
[java]
// Call back after onSu易做图ceCreated() or whenever the window's size changes
@Override
public void onSu易做图ceChanged(GL10 gl, int width, int height)
{
if(height == 0) // 防止被零除
{
height = 1;
}
// 重置当前的视图区域
gl.glViewport(0, 0, width, height);
// 选择投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
// 重置投影矩阵
gl.glLoadIdentity();
// 设置视图区域的大小
GLU.gluPerspective(gl, 45.0f, (float)width/(float)height,0.1f,100.0f);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity();
}
// Call back after onSu易做图ceCreated() or whenever the window's size changes
@Override
public void onSu易做图ceChanged(GL10 gl, int width, int height)
{
if(height == 0) // 防
补充:移动开发 , Android ,