android opengl
- 1、GL
- 2、GL 10
- 3、GL 10 EXT
- 4、GL 11
- 5、GL 11 EXT
- 6、GL 11 ExtensionPack
- 1、为 Renderer 类赶回命名空间
import android.opengl.GLSurfaceView.Renderer; - 2、新建一个类来实现 Renderer 接口,代码如下:
public class ThreeDGl implements Renderer
{
} - 3、如上代码所写,程序实现了 Renderer 类,则必须重写以下方法
public void onDrawFrame(GL10gl)
{
}
public void onSurfaceChanged(GL10gl, int width, int height)
{}
public void onSurfaceCreated(GL10gl,EGLConfigconfig)
{} - 4、当窗口被创建时需要调用 onSurfaceCreate ,我们可以在这里对 OpenGL 做一些初始化工作,例如:
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景
gl.glClearColor( 0 , 0 , 0 , 0 );
// 设置深度缓存
gl.glClearDepthf( 1.0f );
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST); glHint 用于告诉 OpenGL 我们希望进行最好的透视修正,这会轻微地影响性能,但会使得透视图更好看。
glClearColor 设置清除屏幕时所用的颜色,色彩值的范围从 0.0f~1.0f 大小从暗到这的过程。
glShadeModel 用于启用阴影平滑度。阴影平滑通过多边形精细地混合色彩,并对外部光进行平滑。
glDepthFunc 为将深度缓存设想为屏幕后面的层,它不断地对物体进入屏幕内部的深度进行跟踪。
glEnable 启用深度测试。 - 5、当窗口大小发生改变时系统将调用 onSurfaceChange 方法,可以在该方法中设置 OpenGL 场景大小 ,代码如下:
// 设置OpenGL场景的大小
gl.glViewport( 0 , 0 ,width,height); - 6、场景画出来了,接下来我们就要实现场景里面的内容,比如:设置它的透视图,让它有种越远的东西看起来越小的感觉,代码如下:
// 设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
// 重置投影矩阵
gl.glLoadIdentity();
// 设置视口的大小
gl.glFrustumf( - ratio,ratio, - 1 , 1 , 1 , 10 );
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity(); gl.glMatrixMode(GL10.GL_PROJECTION); 指明接下来的代码将影响 projection matrix (投影矩阵),投影矩阵负责为场景增加透视度。
gl.glLoadIdentity(); 此方法相当于我们手机的重置功能,它将所选择的矩阵状态恢复成原始状态,调用glLoadIdentity(); 之后为场景设置透视图。
gl.glMatrixMode(GL10.GL_MODELVIEW);指明任何新的变换将会影响 modelview matrix (模型观察矩阵)。
gl.glFrustumf(- ratio,ratio, - 1 , 1 , 1 , 10 ); 此方法,前面4个参数用于确定窗口的大小,而后面两个参数分别是在场景中所能绘制深度的起点和终点。 - 7、了解了上面两个重写方法的作用和功能之后,第三个方法 onDrawFrame 从字面上理解就知道此方法做绘制图操作的。嗯,没错。在绘图之前,需要将屏幕清除成前面所指定的颜色,清除尝试缓存并且重置场景,然后就可以绘图了, 代码如下:
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重置当前的模型观察矩阵
gl.glLoadIdentity(); - 8、Renderer 类在实现了上面的三个重写之后,在程序入口中只需要调用
Rendererrender = new ThreeDGl( this );
/** Calledwhentheactivityisfirstcreated. */
@Override
public void onCreate(BundlesavedInstanceState){
super .onCreate(savedInstanceState);
GLSurfaceViewgview = new GLSurfaceView( this );
gview.setRenderer(render);
setContentView(gview);
} 即可将我们绘制的图形显示出来。
OpenGL 参考代码 package com.terry;
import java.nio.IntBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
public class GLRender implements Renderer{
float rotateTri,rotateQuad;
int one = 0x10000 ;
// 三角形的一个顶点
private IntBuffertriggerBuffer = IntBuffer.wrap( new int []{
0 ,one, 0 , // 上顶点
- one, - one, 0 , // 左顶点
one, - one, 0 // 右下点
});
// 正方形的四个顶点
private IntBufferquateBuffer = IntBuffer.wrap( new int []{
one,one, 0 ,
- one, - one, 0 ,
one, - one, 0 ,
- one, - one, 0
});
private IntBuffercolorBuffer = IntBuffer.wrap( new int []{
one, 0 , 0 ,one,
0 ,one, 0 ,one,
0 , 0 ,one,one
});
@Override
public void onDrawFrame(GL10gl){
// TODOAuto-generatedmethodstub
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 左移1.5单位,并移入屏幕6.0
gl.glTranslatef( - 1.5f , 0.0f , - 6.0f );
// 设置旋转
gl.glRotatef(rotateTri, 0.0f , 1.0f , 0.0f );
// 设置定点数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 设置颜色数组
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glColorPointer( 4 ,GL10.GL_FIXED, 0 ,colorBuffer);
// 设置三角形顶点
gl.glVertexPointer( 3 ,GL10.GL_FIXED, 0 ,triggerBuffer);
// 绘制三角形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0 , 3 );
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
// 绘制三角形结束
gl.glFinish();
/** ******************** */
/* 渲染正方形 */
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 左移1.5单位,并移入屏幕6.0
gl.glTranslatef( 1.5f , 0.0f , - 6.0f );
// 设置当前色为蓝色
gl.glColor4f( 0.5f , 0.5f , 1.0f , 1.0f );
// 设置旋转
gl.glRotatef(rotateQuad, 1.0f , 0.0f , 0.0f );
// 设置和绘制正方形
gl.glVertexPointer( 3 ,GL10.GL_FIXED, 0 ,quateBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0 , 4 );
// 绘制正方形结束
gl.glFinish();
// 取消顶点数组
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
// 改变旋转的角度
rotateTri += 0.5f ;
rotateQuad -= 0.5f ;
}
@Override
public void onSurfaceChanged(GL10gl, int width, int height){
// TODOAuto-generatedmethodstub
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(GL10gl,EGLConfigconfig){
// TODOAuto-generatedmethodstub
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景
gl.glClearColor( 0 , 0 , 0 , 0 );
// 设置深度缓存
gl.glClearDepthf( 1.0f );
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
}
}
更多相关文章
- 狭路相逢Android胜:智能手机市场深度分析
- Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)
- Android 的坐标系及矩阵变换
- Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转
- Android 3D 旋转的三角形(一)
- android 对图像进行矩阵变换(Martix)的使用笔记
- Android中的矩阵(Matrix)变换
- Android drawable 三角形
- Android下openGL操作矩阵的函数