Android OpenGL ES教程.docx
《Android OpenGL ES教程.docx》由会员分享,可在线阅读,更多相关《Android OpenGL ES教程.docx(25页珍藏版)》请在冰豆网上搜索。
![Android OpenGL ES教程.docx](https://file1.bdocx.com/fileroot1/2023-1/21/c3324dcc-f5fb-44db-a976-d88541dc3cf7/c3324dcc-f5fb-44db-a976-d88541dc3cf71.gif)
AndroidOpenGLES教程
第一课OpenGlES介绍
Android用的是OpenGL图形函数库,它可以跨平台。
OpenGL的定义:
OpenGL(OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
Android所用到的是它的一个子集OpenGLES(OpenGLforEmbeddedSystems(嵌入式系统))就是OpenGL的嵌入式版本。
1.主activity
Java代码
1.package com.jftt.opengl;
2.
3.import android.app.Activity;
4.import android.os.Bundle;
5.
6.public class OpenGL extends Activity {
7. private static final String TAG = OpenGL.class.getSimpleName();
8. private VortexView vortexView;
9.
10. @Override
11. public void onCreate(Bundle savedInstanceState) {
12. super.onCreate(savedInstanceState);
13. vortexView = new VortexView(this);
14. setContentView(vortexView);
15. }
16.
17. @Override
18. protected void onPause() {
19. super.onPause();
20. vortexView.onPause();
21. }
22.
23. @Override
24. protected void onResume() {
25. super.onResume();
26. vortexView.onResume();
27. }
28.}
2.继承GLSurfaceView类的自己的View
Java代码
1.package com.jftt.opengl;
2.
3.import android.content.Context;
4.import android.opengl.GLSurfaceView;
5.import android.view.MotionEvent;
6.
7.public class VortexView extends GLSurfaceView {
8. private static final String LOG_TAG = VortexView.class.getSimpleName();
9. private VortexRenderer renderer;
10.
11. public VortexView(Context context) {
12. super(context);
13. renderer = new VortexRenderer();
14. setRenderer(renderer);
15. }
16.
17. @Override
18. public boolean onTouchEvent(final MotionEvent event) {
19. queueEvent(new Runnable() {
20. @Override
21. public void run() {
22. renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
23. renderer.setAngle(event.getX() / 10);
24. }
25. });
26. return super.onTouchEvent(event);
27. }
28.}
3.实现渲染器renderer类
Java代码
1.package com.jftt.opengl;
2.
3.import java.nio.ByteBuffer;
4.import java.nio.ByteOrder;
5.import java.nio.FloatBuffer;
6.import java.nio.ShortBuffer;
7.
8.import javax.microedition.khronos.egl.EGLConfig;
9.import javax.microedition.khronos.opengles.GL10;
10.
11.import android.opengl.GLSurfaceView;
12.
13.public class VortexRenderer implements GLSurfaceView.Renderer {
14. private static final String TAG = VortexRenderer.class.getSimpleName();
15.
16. private float red = 0f;
17. private float green = 0f;
18. private float blue = 0f;
19.
20. private ShortBuffer indexBuffer;
21. private FloatBuffer vertexBuffer;
22. private short[] indicesArray = { 0, 1, 2 };
23. private int numberOfVertices = 3;
24.
25. private float angle;
26.
27. private void initTriangle() {
28. ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);
29. vbb.order(ByteOrder.nativeOrder());
30. vertexBuffer = vbb.asFloatBuffer();
31.
32. ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);
33. ibb.order(ByteOrder.nativeOrder());
34. indexBuffer = ibb.asShortBuffer();
35.
36. float[] coords = { -0.5f, -0.5f, 0f, 0.5f, -0.5f, 0f, 0f, 0.5f, 0f };
37.
38. vertexBuffer.put(coords);
39. indexBuffer.put(indicesArray);
40.
41. vertexBuffer.position(0);
42. indexBuffer.position(0);
43. }
44.
45. public void setColor(float red, float green, float blue) {
46. this.red = red;
47. this.green = green;
48. this.blue = blue;
49. }
50.
51. public void setAngle(float angle){
52. this.angle = angle;
53. }
54.
55. @Override
56. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
57. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
58. initTriangle();
59. }
60.
61. @Override
62. public void onSurfaceChanged(GL10 gl, int width, int height) {
63. gl.glViewport(0, 0, width, height);
64. }
65.
66. @Override
67. public void onDrawFrame(GL10 gl) {
68. gl.glClearColor(red, green, blue, 1.0f);
69. gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
70. gl.glRotatef(angle, 0f, 1f, 0f);
71. gl.glColor4f(0.5f, 0f, 0f, 0.5f);
72. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
73. gl.glDrawElements(GL10.GL_TRIANGLES, numberOfVertices, GL10.GL_UNSIGNED_SHORT, indexBuffer);
74. }
75.}
4.封装的三角形的类
Java代码
1.package com.jftt.opengl;
2.
3.import java.nio.ByteBuffer;
4.import java.nio.ByteOrder;
5.import java.nio.FloatBuffer;
6.import java.nio.ShortBuffer;
7.import java.util.Random;
8.
9.public class Triangle {
10. private short[] myIndecesArray = { 0, 1, 2 };
11. private int numberOfVertices = 3;
12.
13. private float red = 0f;
14. private float green = 0f;
15. private float blue = 0f;
16.
17. // a raw buffer to hold indices allowing a reuse of points.
18. private ShortBuffer indexBuffer;
19. // a raw buffer to hold the vertices
20. private FloatBuffer vertexBuffer;
21. private Random random = new Random();
22.
23. public Triangle() {
24. red = random.nextFloat();
25. red = red - (float) Math.floor(red);
26. green = random.nextFloat();
27. green = green - (float) Math.floor(green);
28. blue = random.nextFloat();
29. blue = blue - (float) Math.floor(blue);
30.
31. ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);
32. vbb.order(ByteOrder.nativeOrder());
33. vertexBuffer = vbb.asFloatBuffer();
34.
35. ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);
36. ibb.order(ByteOrder.nativeOrder());
37. indexBuffer = ibb.asShortBuffer();
38.
39. float[] coords = { randomValue(red), randomValue(red),
40. randomValue(red), randomValue(green), randomValue(green),
41. randomValue(green), randomValue(blue), randomValue(blue),
42. randomValue(blue) };
43.
44. for (int i = 0; i < numberOfVertices; i++) {
45. for (int j = 0; j < 3; j++) {
46. vertexBuffer.put(coords[i * 3 + j]);
47. }
48. }
49.
50. for (int i = 0; i < 3; i++) {
51. indexBuffer.put(myIndecesArray[i]);
52. }
53. vertexBuffer.position(0);
54. indexBuffer.position(0);
55. }
56.
57. private float randomValue(float value) {
58. int tmp = random.nextInt
(2);
59. if (tmp == 0) {
60. tmp = -1;
61. }
62. return value * tmp;
63. }
64.
65. public FloatBuffer getVertexBuffer() {
66. return vertexBuffer;
67. }
68.
69. public ShortBuffer getIndexBuffer() {
70. return indexBuffer;
71. }
72.
73. public int getNumberOfVertices() {
74. return numberOfVertices;
75. }
76.
77. public float getGreen() {
78. return green;
79. }
80.
81. public float getRed() {
82. return red;
83. }
84.
85. public float getBlue() {
86. return blue;
87. }
88.}
第二课第一个OpenGL项目
首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何建立一个android的项目,同时了解activity的生命周期和android下的屏幕或键盘响应机制。
好的,开始建立一个android的项目Lesson1,Activity的名字的名字我们叫Lesson
package com.xinli;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class Lesson extends Activity{
private OpenGLView mOpenGLView;
@Override
public void onCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//去标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mOpenGLView = new OpenGLView(this);
setContentView(mOpenGLView);
}
}
我们在这里用了一个OpenGLView类,把这个类直接设为contentView。
package com.xinli;
import android.content.Context;
import android.opengl.GLSurfaceView;
public class OpenGLView extends GLSurfaceView{
private OpenGLRenderer mRenderer;
public OpenGLView(Contextcontext){
super(context);
mRenderer = new OpenGLRenderer();
setRenderer(mRenderer);
// TODO Auto-generatedconstructorstub
}
}
OpenGLView类继承自GLSurfaceView,这个类是android提供的用opengl画图的类。
这里用了OpenGLRenderer类,Render是渲染的意思,真正画图的操作在这个类里面。
package com.xinli;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
public class OpenGLRenderer implements Renderer{
@Override
public void onDrawFrame(GL10gl){
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
}
@Override
public void onSurfaceChanged(GL10gl, int width, int height){
// 设置输出屏幕大小
gl.glViewport(0,0,width,height);
}
@Override
public void onSurfaceCreated(GL10gl,EGLConfigconfig){
// TODO Auto-gener