转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8710062
========
前一段时间,在准备游戏开发的过程中,自己尝试着去了解游戏引擎,也做了一些试验;期间遇到了很多问题,现在把一些解决方案以及相关知识点整理出来。这里是第一篇。
========
这篇文章是为了解决Android SDK2.2中使用OpenGL VBO技术时遇到的bug,如果你并不关心2.2版本,或者不直接使用OpenGL的VBO技术,那就可以忽略这篇文章。不过这篇文章还提醒一点的是,不管什么样的软件,多多少少都会有些问题的,这个时候就需要多多思考,通过搜索引擎的帮助来解决问题,这样不仅解决了问题,而且还掌握了很多东西。
传统的OpenGL绘制方式,是每一条命令绘制命令都会有CPU向GPU发送数据的操作。OpenGL VBO(Vertex Buffer Object)通过加载的方式,把需要绘制的数据预先加载到GPU,能够减少程序对GPU发送的数据量,从而提高游戏的性能。
这个VBO的bug是glDrawElements和glVertexAttribPointer的VBO版本没有被映射,导致Java端调用失败。不知道是什么原因导致了这个结果,这个bug感觉有些低级,有个老外这样嘲讽google的开发人员:
I don’t know if it’s because they didn’t run their unit tests, or if the developer was sloppy with
their code generation tools, or if everyone was on 8 cups of coffee and burning the midnight oil to get things out the door. I don’t know why the API is broken, but the fact is that it’s broken.
其实解决方案很简单,就是用JNI实现一个java端映射就可以了,具体如下:
===============
JNI源代码编写
===============
public class GLES20Fix {
native public static void glDrawElements(
int mode, int count, int type, int offset);
native public static void glVertexAttribPointer(
int index, int size, int type,
boolean normalized, int stride, int offset);
private GLES20Fix() {}
static {
System.loadLibrary("GLES20Fix");
}
}
javac -cp . stalendp/game/extend/opengl/GLES20Fix.java
javah -jni stalendp.game.extend.opengl.GLES20Fix
#include "stalendp_game_extend_opengl_GLES20Fix.h"
#include <GLES2/gl2.h>
JNIEXPORT void JNICALL Java_stalendp_game_extend_opengl_GLES20Fix_glDrawElements
(JNIEnv *env, jclass c, jint mode, jint count, jint type, jint offset) {
glDrawElements(mode, count, type, (void*) offset);
}
JNIEXPORT void JNICALL Java_stalendp_game_extend_opengl_GLES20Fix_glVertexAttribPointer
(JNIEnv *env, jclass clazz, jint index, jint size, jint type,
jboolean normalized, jint stride, jint offset) {
glVertexAttribPointer(
index, size, type, normalized, stride, (void*)offset);
}
===============
NDK的编译链接
===============
- NDK编译需要三种类型的资源,1)源文件,2)mk文件,3)properties文件
- 编译使用命令 ndk-build
- 编译目录的结构:假设根目录为root, root/jni放置源文件和mk文件,在root下放置properties文件(其中包含编译目标平台);在root下运行ndk-build命令,此命令会根据properties和jni下的mk文件进行编译链接,编译结果放在root/obj目录下,链接结果放在root/libs文件夹下
目录结构一览
-------------------------------------------
root /jni
Android.mk
abc.h
abc.c
/libs
/armeabi
libGLES20Fix.so
/obj
/local
/armeabi
…...
project.properties
-------------------------------------------
mk文件一览:
-------------------------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GLES20Fix
LOCAL_CFLAGS := -Werror
LOCAL_SRC_FILES := abc.c
LOCAL_LDLIBS := -lGLESv2
include $(BUILD_SHARED_LIBRARY)
-------------------------------------------
properties文件一览:
-------------------------------------------
target=android-8
-------------------------------------------
相关参考:
- http://stackoverflow.com/questions/8552365/vertex-buffer-objects-vbo-not-working-on-android-2-3-3-using-gles20
- https://code.google.com/p/gdc2011-android-opengl/
- http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/
分享到:
相关推荐
我们通过所谓的 **顶点缓冲对象 (VBO)**,可以在GPU的内存中存储大量的顶点。使用这些缓冲区对象的好处是,我们可以一次将大批数据全部发送到图形卡,如果还有足够的内存,则可以将其保存在此处,而不必一次发送一...
OPENGL VBO经典例子,初学者必看!
vbo_piping.zip su(草图大师插件)管道生成工具
cpp-opengl-vbo-vao着色器 用法: git submodule init git submodule update mkdir build cd build cmake .. make ./triangle 在Linux,MacOS和Windows上进行了测试。
Android OpenGL ES 3.0中Vertex Buffer Object(VBO)和Vertex Array Object(VAO)的应用。
vbo 使用案例 使用与不使用vbo的区别 正方形 三角形 opengl的vbo实现 7个example 解决vbo使用中的一些问题 如何在opengl里面实现vbo技术的使用
一个简单VBO茶壶示例,可以了解如何使用VBO!
一个使用opengl vbo 像素顶点缓存对象的例子
vbo转换将 VBO转换为3D文件格式的几种方法。 这些脚本与从七巧板导出的顶点缓冲对象(VBO)一起使用。 有关如何导出这些VBO的示例,请参见用法python [scriptname] [infile] [outfile] 用法示例python vbo_to_ply.py...
csv2vbo.py在标准输入上需要一个.csv文件,并将.vbo文件写入标准输出。 它会自动检测输入的.csv文件的变体,否则将失败并退出。 例如,要将“ log.csv”转换为“ log.vbo”,需要发出以下命令: $ ./csv2vbo.py ...
想学习OpenGL VBO的同学不妨下载该资源,其中提供了使用OpenGL VBO绘制茶壶的实例程序(包含源码)。
OpenGL工程,可用dev c++打开,利用VBO方法绘制水壶,空格键切换是否使用VBO,可以看出绘制数据与帧数的对比
Excel 转换成 VBO 文件, 能直接选择EXCEL 文件 ,输出 VBO 文件。
opengles之vbo顶点缓冲
关于利用opengl和vbo是的环境配置
LowLevel-OpenGL-P5 在处理 2.2.1 上使用 VBO 和低级 OpenGL 进行各种测试
提高了应用的FPS,提高程序的运行速度。把数据加载到显卡的高性能的显存里。大大降低了渲染时间
常用按键继电器拨码开发电源插座耳机插座等封装库PCB库160个(PROTEL99SE封装库) Component Count : 163 Component Name ----------------------------------------------- AUDIO AV3-8.4 AUDIO EARPHONE AUDIO ...
转接芯片,转换IC、LVDS to VBO with Scaler、新港海岸、成熟方案
opengl vbo 简单演示 这是一个vbp的小例子。简单的螺旋运动。