在还没有研究Android的原生(Native)开发之前,就一直很好奇google用的是哪一种OpenGL ES的实现,也写过一些Java 3D的代码去测试3D的性能,但结果很不理想(http://blog.sina.com.cn/s/blog_4a0a39c30100auh6.html),显示一个MD2低模,也只能达到 6 FPS左右,后来也尝试过通过SDL来实现的3D:TinySDGL,gears Demo能达到14 FPS左右,但显示MD2低模,可能也好不到哪去。

后来有时间下载了Android的代码,在翻阅代码的时候,发现 $android_src/frameworks/base/opengl/tests 竟然有一个angeles目录,San angeles是OpenGL ES 2005编程挑战赛的一个项目,它是一个OpenGL ES的自运行演示程序,包含超过60000 render faces,看样子Google是想port这个项目来做测试。

因为用的Cygwin+Toolchain环境,源码中的Android.mk编译不过去,于是就写了个简单的Makefile,如下:

# Compiler, linker, lib and other tools

CC = arm-eabi-gcc
LD = arm-eabi-g++
RM = rm -f

CFLAGS = -O2 -include AndroidConfig.h -DANDROID
CFLAGS+= -msoft-float -fpic /
         -ffunction-sections /
         -funwind-tables /
         -fstack-protector /
         -fno-short-enums /
         -fomit-frame-pointer
LDFLAGS = -s -nostdlib -Bdynamic -Wl,-T,armelf.x -Wl,-dynamic-linker,/system/bin/linker
LDFLAGS+= -Wl,--gc-sections /
          -Wl,-z,nocopyreloc /
          -lc -lm -lGLES_CM

#android dir
LIB_DIR    = /cygdrive/e/toolchain/arm-eabi/lib
CRT_OBJS= $(LIB_DIR)/crtbegin_dynamic.o $(LIB_DIR)/crtend.o

# Variables
OBJS = app-linux.o demo.o

# Targets
all: angeles

angeles: $(OBJS)
    $(LD) $(LDFLAGS) -o [email protected] $(OBJS) $(CRT_OBJS)
   
push: angeles
    adb push angeles /dev/sample/angeles
    adb shell chmod 777 /dev/sample/angeles

clean:
    $(RM) *.o angeles

app-linux.o: app.h
demo.o: app.h shapes.h cams.h

启动模拟器,进入目录编译即可:
$make
$make push
$adb shell ./dev/sample/angeles &
如果一切顺利,看看你的模拟器,你将看到有点卡的一些画面,包括一些圆开或柱形,然后镜头在自动移动,如图:


在源码app-linux.c的201行,加入如下代码:
     printf("GL_VENDOR:/t%s/n", glGetString(GL_VENDOR));
    printf("GL_RENDERER:/t%s/n", glGetString(GL_RENDERER));
    printf("GL_VERSION:/t%s/n", glGetString(GL_VERSION));
    printf("GL_EXTENSIONS:/t%s/n", glGetString(GL_EXTENSIONS));
重新编译运行,命令行会显示:
GL_VENDOR:      Google Inc.
GL_RENDERER:    Android PixelFlinger 1.0
GL_VERSION:     OpenGL ES-CM 1.0
GL_EXTENSIONS:  GL_OES_byte_coordinates GL_OES_fixed_point GL_OES_single_precisi
on GL_OES_read_format GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_
OES_matrix_get GL_OES_query_matrix GL_ARB_texture_compression GL_ARB_texture_non
_power_of_two GL_ANDROID_direct_texture GL_ANDROID_user_clip_plane GL_ANDROID_ve
rtex_buffer_object GL_ANDROID_generate_mipmap
从上面的信息可以看出,Android用的是soft render,是Google自已写的PixelFlinger,支持的扩展不是很多,虽然有点卡,但整体效果还是不错的,我在Win32上面跑这个Demo也不是很流利,Android能达到这个效果已经很不错了。
通过这个例子,基本上证明在Native上开发3D程序是可行的。于是又写了两个简单的demo做测试,如下图所示,第一个demo,最经典三角形:


最最经典的立方体:



因sina不能上传附件,请访问些贴下载源码进行编译: http://www.j2medev.com/bbs/dispbbs.asp?boardid=48&id=35931&page=1&star=1

更多相关文章

  1. Android(安卓)Material Design动画 View state changes|视图状态
  2. Android有用代码(二)
  3. 关于Android(安卓)Studio打包混淆以及上传mapping文件
  4. 获取Android(安卓)SDK 源代码并在Eclipse中关联查看的方法
  5. Android(安卓)DownLoadManager的使用
  6. Android(安卓)ViewStub控件使用
  7. 使用AXMLPrinter2,smali,baksmali来实现Android(安卓)编译,反编
  8. Android最好用的播放器ExoPlayer的使用及自定义UI
  9. Android中Toast的用法简介(转)

随机推荐

  1. Proguard可以对Android库项目(APKLIB)进行
  2. Android——实现无障碍
  3. 软件工程应用与实践复习笔记
  4. Glide源码分析(四)——Registry机制
  5. 通过Android软件ZAX实时查看Zabbix监控
  6. Android低版本使用ActionBar导入v7-appco
  7. 将XML元素反序列化为Java Map
  8. 推荐一个Emoji框架
  9. Suggestion: use tools:overrideLibrary=
  10. 仪表测试自定义视图