Android 3D学习之利用NDK绘制2D四边形

转自:http://blog.csdn.net/ldj299/article/details/6299232


如果你对NDK开发的基本概念不是很了解,可以先看看我这篇文章:http://blog.csdn.net/ldj299/archive/2011/02/12/6181456.aspx

 

这是在Activity中的重要代码:

  1. package com.ldj.hellondk;  
  2. import android.app.Activity;  
  3. import android.opengl.GLSurfaceView;  
  4. import android.os.Bundle;  
  5. public class HelloNDK extends Activity {  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         GLSurfaceView surface = new GLSurfaceView(this);  
  9.         surface.setRenderer(new NdkGLRenderer());  
  10.         setContentView(surface);  
  11.     }  
  12.     static {  
  13.          //加载本地共享库   
  14.          System.loadLibrary("NdkGLRenderer");  
  15.     }  
  16. }  

 

这里面主要是创建一个GLSurfaceView对象且绑定渲染,并且加载了本地共享库。

接下来看NdkGLRenderer这个渲染类:

  1. package com.ldj.hellondk;  
  2. import javax.microedition.khronos.egl.EGLConfig;  
  3. import javax.microedition.khronos.opengles.GL10;  
  4. import android.opengl.GLSurfaceView.Renderer;  
  5. public class NdkGLRenderer implements Renderer {  
  6.     /* 
  7.      * 声明了三个本地方法并且在Java中调用 
  8.      * 
  9.      */  
  10.     native private void onNdkSurfaceCreated ();  
  11.     native private void onNdkSurfaceChanged (int width, int height);  
  12.     native private void onNdkDrawFrame      ();  
  13.       
  14.     public void onDrawFrame(GL10 gl) {  
  15.         onNdkDrawFrame ();   
  16.     }  
  17.     public void onSurfaceChanged(GL10 gl, int width, int height) {  
  18.         onNdkSurfaceChanged (width, height);  
  19.     }  
  20.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  21.         onNdkSurfaceCreated ();  
  22.     }  
  23. }  


接下来就是这三个本地方法的实现了,hello-ndk.c:

  1. #include <jni.h>  
  2. #include <GLES/gl.h>  
  3. unsigned int vbo[2];  
  4. float positions[12] = {1,-1,0, 1,1,0, -1,-1,0, -1,1,0};  
  5. short indices  [4]  = {0,1,2,3};  
  6. void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceCreated (JNIEnv* env, jobject obj)  
  7. {  
  8.      //生成两个缓存区对象  
  9.     glGenBuffers (2, vbo);  
  10.      //绑定第一个缓存对象  
  11.     glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);  
  12.     //创建和初始化第一个缓存区对象的数据  
  13.     glBufferData (GL_ARRAY_BUFFER, 4*12, positions, GL_STATIC_DRAW);  
  14.      //绑定第二个缓存对象  
  15.     glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo[1]);  
  16.     //创建和初始化第二个缓存区对象的数据  
  17.     glBufferData (GL_ELEMENT_ARRAY_BUFFER, 2*4, indices, GL_STATIC_DRAW);   
  18. }  
  19. void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceChanged (JNIEnv* env, jobject obj, jint width, jint height)  
  20. {  
  21.      //图形最终显示到屏幕的区域的位置、长和宽  
  22.     glViewport (0,0,width,height);   
  23.      //指定矩阵  
  24.      glMatrixMode   (GL_PROJECTION);  
  25.      //将当前的矩阵设置为glMatrixMode指定的矩阵  
  26.     glLoadIdentity ();  
  27.     glOrthof       (-2, 2, -2, 2, -2, 2);  
  28. }  
  29.    
  30. void Java_com_ldj_hellondk_NdkGLRenderer_onNdkDrawFrame (JNIEnv* env, jobject obj)  
  31. {  
  32.      //启用顶点设置功能,之后必须要关闭功能   
  33.     glEnableClientState (GL_VERTEX_ARRAY);  
  34.      //清屏  
  35.     glClearColor (0,0,1,1);  
  36.     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  37.     glMatrixMode (GL_MODELVIEW);  
  38.     glLoadIdentity ();   
  39.     glBindBuffer    (GL_ARRAY_BUFFER, vbo[0]);  
  40.      //定义顶点坐标  
  41.     glVertexPointer (3, GL_FLOAT, 0, 0);  
  42.     glBindBuffer    (GL_ELEMENT_ARRAY_BUFFER, vbo[1]);  
  43.      //按照参数给定的值绘制图形  
  44.     glDrawElements  (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);  
  45.      //关闭顶点设置功能    
  46.      glDisableClientState(GL_VERTEX_ARRAY);   
  47. }  


代码中的注释应该是比较详细的,和用Java来实现此功能的代码其实还是差不多的,

最后在Android.mk中告诉NDK需要编译哪些文件,生成哪些模块。

 

本文的源程序下载地址:http://download.csdn.net/source/3154085

 

 

 

利用ndk-build命令编译jni里的文件,然后运行程序你就回得到如下效果图:

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值