当前位置:首页 » 操作系统 » opengles源码

opengles源码

发布时间: 2022-06-23 09:04:28

㈠ android的应用开发个2D图片转成3D的小程序,需要java的源代码,谢谢

用OpenGLEs 如果告诉你了你自己不去认真钻研你就什么都学不到.

㈡ android中Runnable的用法

只要java好就没有问题,这是3D魔方android的源码
package com.example.android.image3D;

import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.content.Context;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;

import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;

public class View3D extends SurfaceView implements SurfaceHolder.Callback {

private static final Semaphore sEglSemaphore = new Semaphore(1);
private boolean mSizeChanged = true;

private SurfaceHolder mHolder;
private GLThread mGLThread;
private GLWrapper mGLWrapper;

public View3D(Context context) {
super(context);
init();
}

public View3D(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}

public SurfaceHolder getSurfaceHolder() {
return mHolder;
}

public void setGLWrapper(GLWrapper glWrapper) {
mGLWrapper = glWrapper;
}

public void setRenderer(Renderer renderer) {
mGLThread = new GLThread(renderer);
mGLThread.start();
}

public void surfaceCreated(SurfaceHolder holder) {
mGLThread.surfaceCreated();
}

public void surfaceDestroyed(SurfaceHolder holder) {
mGLThread.surfaceDestroyed();
}

public void surfaceChanged(SurfaceHolder holder,
int format, int w, int h) {
mGLThread.onWindowResize(w, h);
}

public void onPause() {
mGLThread.onPause();
}

public void onResume() {
mGLThread.onResume();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mGLThread.onWindowFocusChanged(hasFocus);
}

public void queueEvent(Runnable r) {
mGLThread.queueEvent(r);
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mGLThread.requestExitAndWait();
}

public interface GLWrapper {
GL wrap(GL gl);
}

public interface Renderer {

int[] getConfigSpec();

void surfaceCreated(GL10 gl);
void sizeChanged(GL10 gl, int width, int height);
void drawFrame(GL10 gl);
}

private class EglHelper {

EGL10 mEgl;
EGLDisplay mEglDisplay;
EGLSurface mEglSurface;
EGLConfig mEglConfig;
EGLContext mEglContext;

public EglHelper() {

}

public void start(int[] configSpec){

mEgl = (EGL10) EGLContext.getEGL();
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
mEgl.eglInitialize(mEglDisplay, version);

EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,
num_config);
mEglConfig = configs[0];

mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,
EGL10.EGL_NO_CONTEXT, null);

mEglSurface = null;
}

public GL createSurface(SurfaceHolder holder) {

if (mEglSurface != null) {

mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
}

mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,
mEglConfig, holder, null);

mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
mEglContext);

GL gl = mEglContext.getGL();
if (mGLWrapper != null) {
gl = mGLWrapper.wrap(gl);
}
return gl;
}

public boolean swap() {
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}

public void finish() {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
}
if (mEglContext != null) {
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
}
if (mEglDisplay != null) {
mEgl.eglTerminate(mEglDisplay);
mEglDisplay = null;
}
}

}

class GLThread extends Thread {

private boolean mDone;
private boolean mPaused;
private boolean mHasFocus;
private boolean mHasSurface;
private boolean mContextLost;
private int mWidth;
private int mHeight;
private Renderer mRenderer;
private ArrayList<Runnable>
mEventQueue = new ArrayList<Runnable>();
private EglHelper mEglHelper;

GLThread(Renderer renderer) {
super();
mDone = false;
mWidth = 0;
mHeight = 0;
mRenderer = renderer;
setName("GLThread");
}

@Override
public void run() {

try {
try {
sEglSemaphore.acquire();
} catch (InterruptedException e) {
return;
}
guardedRun();
} catch (InterruptedException e) {

} finally {
sEglSemaphore.release();
}
}

private void guardedRun() throws InterruptedException {
mEglHelper = new EglHelper();
int[] configSpec = mRenderer.getConfigSpec();
mEglHelper.start(configSpec);

GL10 gl = null;
boolean tellRendererSurfaceCreated = true;
boolean tellRendererSurfaceChanged = true;

while (!mDone) {

int w, h;
boolean changed;
boolean needStart = false;
synchronized (this) {
Runnable r;
while ((r = getEvent()) != null) {
r.run();
}
if (mPaused) {
mEglHelper.finish();
needStart = true;
}
if(needToWait()) {
while (needToWait()) {
wait();
}
}
if (mDone) {
break;
}
changed = mSizeChanged;
w = mWidth;
h = mHeight;
mSizeChanged = false;
}
if (needStart) {
mEglHelper.start(configSpec);
tellRendererSurfaceCreated = true;
changed = true;
}
if (changed) {
gl = (GL10) mEglHelper.createSurface(mHolder);
tellRendererSurfaceChanged = true;
}
if (tellRendererSurfaceCreated) {
mRenderer.surfaceCreated(gl);
tellRendererSurfaceCreated = false;
}
if (tellRendererSurfaceChanged) {
mRenderer.sizeChanged(gl, w, h);
tellRendererSurfaceChanged = false;
}
if ((w > 0) && (h > 0)) {

mRenderer.drawFrame(gl);
mEglHelper.swap();
}
}
mEglHelper.finish();
}

private boolean needToWait() {
return (mPaused || (! mHasFocus) || (! mHasSurface) || mContextLost)
&& (! mDone);
}

public void surfaceCreated() {
synchronized(this) {
mHasSurface = true;
mContextLost = false;
notify();
}
}

public void surfaceDestroyed() {
synchronized(this) {
mHasSurface = false;
notify();
}
}

public void onPause() {
synchronized (this) {
mPaused = true;
}
}

public void onResume() {
synchronized (this) {
mPaused = false;
notify();
}
}

public void onWindowFocusChanged(boolean hasFocus) {
synchronized (this) {
mHasFocus = hasFocus;
if (mHasFocus == true) {
notify();
}
}
}

public void onWindowResize(int w, int h) {
synchronized (this) {
mWidth = w;
mHeight = h;
mSizeChanged = true;
}
}

public void requestExitAndWait() {
synchronized(this) {
mDone = true;
notify();
}
try {
join();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}

public void queueEvent(Runnable r) {
synchronized(this) {
mEventQueue.add(r);
}
}

private Runnable getEvent() {
synchronized(this) {
if (mEventQueue.size() > 0) {
return mEventQueue.remove(0);
}

}
return null;
}
}
}

㈢ 如何学习 cocos2d-x

刚巧我也是从AS3转到了cocos2d-x,说说我的经验吧。
一、 cocos2d-x 部分
1.1 技术选型
从第三个手游开始,我实在被Adobe的ANE和国内的小平台折腾得没了脾气,决定转到cocos2d-x。在选择哪种语言绑定的时候纠结了很久,最后力排众议选了 lua:Cocos2d-x script language binding:Lua or Javascript? 。cocos2d-x 2.x 的lua绑定做得并不好,于是我选择了 quick-cocos2d-x 。
1.2 学习 C++
《C++ Primer》 是不错的入门书籍,建议看第五版,我写过一篇 C++Primer 第4版和第5版比较 。学习期间建议画一些思维导图帮助理解和整理思路。例如这个(不完整):

1.3 学习DEMO和熟悉开发平台。
编译 cocos2d-x 自带的 TestCPP 项目,全部跑一遍。熟悉 cocos2d-x API 的用法。记得生成文档,建议每个API的功能都浏览一遍。
在学习DEMO的过程中,你还必须熟悉自己开发平台的IDE,例如Windows上必须熟悉 Visual Studio,而OS X上必须熟悉xcode,linux平台上就熟悉Eclipse+CDT吧。
注意,quick-cocos2d-x 是不支持Linux开发平台的。
1.4 了解引擎的文件夹结构
基于 cocos2d-x 源码生成的文档并不怎么详细,许多功能必须看源码。但这个阶段,我不建议纠结源码太深,倒是可以纠结一下 cocos2d-x 的文件夹结构,看看各个类放在什么地方,找一找常见的哪些宏和常量以及枚举定义在什么地方,这花不了多少时间,但能让你对cocos2d-x有更深刻的了解,同时给你很强的成就感。这种成就感冲淡了你面对大量源码时候的无力感,让你能够继续前行。
下面是我的分析:

1.5 重复上面的第3步:再次学习DEMO
这时候看DEMO可能会轻松不少,但是你会有更多的问题去纠结。例如多分辨率支持?例如坐标系统?例如绘图功能?例如层级管理系统?例如事件传递系统?等等等等……这时候可以去Google(注意不要用百毒和其他搜索引擎)找文档看了。我推荐一些我看过的不错的文档和博客:

Cocos2d-x 多分辨率适配完全解析

Cocos2d-x官方中文文档 v2.x

子龙山人 – 博客园

红孩儿的游戏编程之路

Cocos2D | iOS Development Tips & Tricks by BiOM

Ray Wenderlich

Cocos2d-x | Cross Platform Open Source 2D Game Engine
许多博客都是极好的。红孩儿 写了许多源码分析,每一句源码都加了详细注释。虽然我不太认同他这种吃力不讨好的方法,但这对于新手来说确实是有很大帮助的。
另外在 Stack Overflow 你能找到绝大部分问题的答案。当然,许多问题是针对 cocos2d 而非 cocos2d-x 的,不过用法相同,照看不误。许多优秀的文章都是基于 cocos2d 的,所以,不要介意,可以先花半天时间熟悉 OC 的语法,能看懂即可。
暂时不要买中文书。我曾经花3天时间看完了 《Cocos2D-X游戏开发技术精解》 和 《cocos2d-x手机游戏开发–跨iOS、Android和沃Phone平台》 ,发现作者其实就是来赚稿费的。
忘了广告了,我的博客(cocos2d-x | zrong’s Blog)也有一些cocos2d-x内容,欢迎来喷。
1.6 熟悉工具集
现在你应该对周边工具感兴趣了。例如帧动画使用什么制作?BMFont使用什么制作?骨骼动画呢?plist文件怎么编辑?碎图用什么工具拼合?有些项目上,你有许多选择,也可能没得选。去Google吧,如果遇到选择上的问题,欢迎找我讨论。
二、 quick-cocos2d-x 部分
2.1 现在就到lua时间了
请认真读完 《Lua程序设计(第2版) 》 第一、二、三部分。第四部分可暂时不读。
2.2 熟悉 quick-cocos2d-x 的文件夹结构
相信有了上面 cocos2d-x 的基础,这个应该不难理解。
2.3 跑完 quick-cocos2d-x 自带的所有sample
在这期间,熟悉 framework 中的所有封装。可以参考 quick网站 和 quick wiki 。
2.4 学习导出API给Lua使用
导出 C/C++ API 给 Lua 使用
三、学习 OpenGL ES
熟悉Lua部分之后,作为一个有志于成为程序员的码农,依然要回到C++来,这里才是 cocos2d-x 的本质。
cocos2d-x 使用 OpenGL ES 进行渲染的,如果要对 cocos2d-x 的渲染层进行任何形式的扩展,你完全避不开 OpenGL ES。
既然逃不开,那就对她说,请张开双腿,我要上。
3.1 阅读 OpenGL ES 2.0 Programming Guide
下面是这本书的官网,目前已经出了 OpenGL ES 3.0 版本,cocos2d-x 使用的是2.0。
http://www.opengles-book.com/es2/index.html
这本书写得浅显易懂,非常适合新手。有位网友花3个月时间翻译了中文版,但还是建议你不要看了。
这里是 OpenGL ES 的 官方文档 和 API中文翻译 。
当然,你也可以买那本着名的 OpenGL 红宝书 《OpenGL编程指南(原书第7版)》 来看,不过 OpenGL ES 相对与 OpenGL 来说还是有一些不同的,你要知道如何区分这些不同。
3.2 尝试理解 cocos2d-x 的渲染部分架构
相关的类我就不列出了,我正在酝酿一个这方面的系列文章准备发到博客上。如果写完了,我会在这里更新。
3.3 自己写一些滤镜、绘图功能的扩展
例如这个: cocos2d-x-filters
四、回归项目
到了这里,你可以开始你的项目了。虽然源码还没有读完,但相信整个架构都能理解了。在做项目的过程中,再去一点点读源码是比较快捷和我能够接受的方法,否则就太枯燥了。
你可以还需要选择一下cocos2d-x相关的工具。你可能听说过 CCB(cocosBuilder)和CCS(cocoStudio),尝试了解她们,再决定是否使用她们。
你已经有了AS3的基础,这样许多前端的概念和经验已经很丰富了。这些经验在cocos2d-x中同样适用。但是要注意的是,cocos2d-x不是AS3,不要试图用AS3的方法去使用cocos2d-x。

有位码农在从C#转到AS3的时候向我抱怨:为什么Flash Builder没有Visual Studio的这个功能那个功能?

然后这位码农在从AS3转到Sublime Text(用于Lua编辑)的时候向我抱怨,为什么Sublime Text没有Flash Builder的这个功能那个功能?
上面是个笑话。
同时,为了解决一些cocos2d-x没有提供的功能,你必须去学习相关的知识。例如这个:在 cocos2d-x 中使用 libcurl 实现上传文件功能(附quick-cocos2d-x封装) 。不过你现在已经有了基础,学习这些不是难事。
在有时间的时候,可认真读一下上面提到的《Lua程序设计(第2版) 》第四部分,了解Lua和C语言通信的方式,顺便看看cocos2d-x里面是怎么实现的。
另外,一些你需要的引擎中没有的功能,也可以顺手实现了开源出来(例如这个: 一个LuaSocket封装 ),说不定你需要的东西正好是别人也需要的。
五、熟悉发布平台
既然是做手游,Android和iOS平台是逃不掉了。
你要熟悉Android和iOS平台的特点,熟悉JAVA语言在Android上的应用,熟悉Objective-C在iOS上的应用,熟悉Eclipse ADT和XCode(上面应该已经熟悉过了)。
你还要熟悉Google Play和AppStore的发布流程以及方针、政策,内购的接入、SDK的嵌入。
你要学习和各个接入平台的程序员、商务、前台小妹打交道(因为经常会找不到你要找的真正的负责该SDK的技术人员),你要能忍受国内小平台糟糕的文档、代码规范和逆天的编程方法。
终、没有终点
上面说的并不完整,应该遗漏了不少东西,但我只能说这么多了。因为我的经验也止于此。
转载,仅供参考,祝你愉快,满意请采纳。

㈣ 游戏开发小白如何选择游戏引擎

2D休闲的 ... AndEngine 是采用Java的很适合,这款引擎是采用OpenGLES,但是集成设计度很高,OpenGLES不用了解太多也能轻松使用。该引擎没有中文文档,不过自带有大量的实例,很多博客也有对这些实例讲解,掌握这些实例,基本就能了解其框架。还有一点,他是开源的,很多方法功能,查看一下源码就能知道其作用。他还有很多扩展,像对物理引擎Box2D的支持,这个很强大。不过,考虑到跨平台发展,现在最火热的是cocos2d-x,可以说这个是2D引擎是最有前途的,只是不是Java的

㈤ 如何高效学习Android动画

自己整个学习过程中的产出的文章动画系列 - 传统View动画与Property动画基础及比较 动画系列 - PropertyAnim 详解动画系列 - PropertyAnim 实际应用动画系列 - ViewPager动画 Android 动画基础 (由于 @Trinea 发起的codeKK 项目下的开源项目原理分析项目android-cn/android-open-project-analysis · GitHub 二期中,很多分析项目涉及到了动画,所以该篇主要是对PropertyAnim详解和基础篇中的一些知识进行整理,作为二期的动画公共知识,codeKK 绝对是超级棒的项目,大家可以多关注)从传统View动画与Property动画基础及比较 以及Android 动画基础 这两篇文章,你可以对android动画总体有些了解,PropertyAnim 详解这一篇则是专门介绍了3.0出现的属性动画,其中也涉及到了JakeWharton大神为3.0之前实现的兼容库NineOldAndroids。 通过ViewPager来实现动画效果的方式越来越多,一些视差效果也确实很赞,比如雅虎天气的视差效果,知乎导航界面中元素的视差,关于它们的实现原理,在 ViewPager动画 这篇中有详细的分析,其中也提到了GitHub上一些和ViewPager动画类似的实现,也分析了它们之间的区别,具体可以参考文章。PropertyAnim 实际应用主要介绍了一些简单API的使用,亮点是其中介绍了很多GitHub 上的动画项目,其中实现多数使用了NineOldAndroids兼容库,可以作为不错的学习资料。上面几篇文章中都有非常详细的介绍,就不多说了,因为文章中对于一些概念,使用,原理介绍的确实太详细了,现在想起来,当时钻的确实有点深了,比如PropertyAnim 详解这篇文章,对属性动画中的ValueAnimator,Evaluators,Interpolators的介绍以及TimeInterpolator和TypeEvaluator的比较等等,具体的可以参考文章。这几篇文章看下来,你应该对android动画有一些更系统更深入的认识了。基本的动画实现应该没啥难度了。每篇文章的信息量很是很大的,因为在学习过程中主要是通过大量的GitHub动画项目,也参考了不少资料,在文章结尾处有提及。 如果你还想进阶,这里再分享一些不错的项目,这些项目都是在android动画基础上建立起来的,所以看他们的源码,完全没有难度:

㈥ android skia与opengl es 都可以画2d图吗

一、基础知识: OpenGL ES目前只支持三角形,但任何多边形都可拆分成多个三角形,所以无所谓这个限制的存在。 1.OpenGL中的坐标点: 每一个坐标点由(X, Y, Z)组成。 定义一个三角形的顶点数组: [java] int one = 0x10000; //三角形三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左下点 one,-one,0,}); //右下点 int one = 0x10000; //三角形三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左下点 one,-one,0,}); //右下点定义一个正方形的顶点数组: [java] //正方形的4个顶点 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); //正方形的4个顶点 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); 2.OpenGL中的坐标系: 当调用gl.glLoadIdentity()函数之后,实际上是将当前点移动到了屏幕中心, X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。 OpenGL屏幕中心的坐标值是X轴和Y轴的0.0f点。 中心左边的坐标值是负值,右边是正值; 移向屏幕顶端是正值,移向屏幕底端是负值; 移入屏幕深处是负值,移出屏幕则是正值。 在绘制时,我们可以使用glTranslatef函数来移动画笔的位置,从而使图形显示在我们 想要的位置。 [java] gl.glTranslatef(-1.5f, 0.0f, -6.0f); gl.glTranslatef(-1.5f, 0.0f, -6.0f);此函数,就是将画笔沿X轴左移1.5f个单位,Y轴保持不变,Z轴向屏幕里面移动6.0f个单位。 将视图推入屏幕背后足够的距离以便可以看见全部的场景,这里需要注意的是屏幕内移动的单位 必须小于我们前面通过glFrustumf方法设置的最远距离,否则超出视角范围,将显示不出来。 3.OpenGL中的顶点数组: 在实际画图时,我们往往需要定位几个点,然后让OpenGL以此为基准来画图。在设置顶点位置前, 我们需要按照以下步骤来启用我们的顶点数组: ①开启顶点设置动能: [java] gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);②设置顶点数组: [java] view plainprint?gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);glVertexPointer(int size, int type, int stride, Buffer pointer) size用于描述顶点的尺寸(本例使用XYZ,所以是3),type描述顶点的类型,固定的使用 GL_FIXED,stride描述步长,pointer指向顶点缓存,即我们创建的顶点数组。 ③绘制顶点: [java] gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); //绘制三角形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //绘制四边形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); //绘制三角形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //绘制四边形glDrawArrays(int mode, int first, int count) mode指明绘制的模式,first和count分别是开始的位置和要绘制的顶点计数。 4、实例: 画一个三角形和正方形。 根据我们上一节的框架分析,目前,我们只需将精力集中在onDrawFrame方法里面的绘图操作部分了。 1. 界面编辑(reslayoutmain.xml): [java] android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> 2.代码编辑 (srcwyfzclMyActivity.java): [java] package wyf.zcl; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; public class Activity01 extends Activity { Renderer render = new GLRender(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView glView = new GLSurfaceView(this); glView.setRenderer(render); setContentView(glView); } } package wyf.zcl; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; public class Activity01 extends Activity { Renderer render = new GLRender(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView glView = new GLSurfaceView(this); glView.setRenderer(render); setContentView(glView); } } (srcwyfzclGLRender.java): [java] package wyf.zcl; 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 { int one = 0x10000; //三角形三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左下点 one,-one,0,}); //右下点 //正方形的4个顶点 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存 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.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 设置三角形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); //绘制三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 左移 1.5 单位,并移入屏幕 6.0 gl.glTranslatef(1.5f, 0.0f, -6.0f); //设置和绘制正方形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // 取消顶点设置 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { 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(GL10 gl, EGLConfig config) { // 启用阴影平滑 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); } } package wyf.zcl; 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 { int one = 0x10000; //三角形三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左下点 one,-one,0,}); //右下点 //正方形的4个顶点 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存 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.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 设置三角形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); //绘制三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 左移 1.5 单位,并移入屏幕 6.0 gl.glTranslatef(1.5f, 0.0f, -6.0f); //设置和绘制正方形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // 取消顶点设置 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { 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(GL10 gl, EGLConfig config) { // 启用阴影平滑 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); } } 3.运行效果:

㈦ 《Android3D游戏开发技术宝典OpenGLES2.0》pdf下载在线阅读,求百度网盘云资源

《Android 3D游戏开发技术宝典》(吴亚峰)电子书网盘下载免费在线阅读

资源链接:

链接:https://pan..com/s/1A5S0LK7aslncrVbBQAJ5Rg

密码:2xnw

书名:Android 3D游戏开发技术宝典

作者:吴亚峰

出版年份:2012-5

页数:749

内容简介:

《Android 3D游戏开发技术宝典:OpenGL ES 2.0》内容简介:随着智能手机移动嵌入式平台硬件性能的不断提升,3D游戏应用也逐渐普及开来。《Android 3D游戏开发技术宝典:OpenGL ES 2.0》结合作者多年从事3D游戏应用开发的宝贵经验,全面介绍了与Android平台相关的必知必会的基础知识及大型完整3D案例,讲解上由浅入深,循序渐进,起点低、终点高,既适合初学者学习,也适合有一定基础的读者进一步提升之用。另外,由于OpenGL ES2.0的着色语言通用于各种移动嵌入式平台,因此,《Android 3D游戏开发技术宝典:OpenGL ES 2.0》中与着色器开发相关的60%左右的内容还可供iPhone、Windows Mobile、MeeGoo等平台的开发人员参考。全书共22章,其中第1章与第2章为Android平台相关的一些基础知识;第3章~第10章介绍了基于OpenGL ES2.0进行3D应用开发的一些必知必会的基本知识;第11章~第15章介绍了一些高级特效的实现方法;第16章~第17章介绍了3D游戏开发中相关的一些物理、碰撞检测知识以及常用的3D物理引擎JBullet:第19章介绍了3种人机交互的高级技术;第20章~第22章给出了3个完整的大型3D游戏案例,总代码量接近6万行。同时为了便于读者的学习,《Android 3D游戏开发技术宝典:OpenGL ES 2.0》附赠的光盘中包含了书中所有案例的完整源代码,同时给出了最后3个完整大型3D游戏案例的讲解视频,最大限度地帮助读者快速掌握相应的开发技术。

㈧ idea6410开发板都有哪些功能支持什么操作系统

http://item.taobao.com/auction/item_detail-0db2-.htm
支持的操作系统很能多的,至少6种:
一、WinCE6.0软件资源(点击展开)
软件特性:
·CPU主频稳定工作于667MHz
·视频硬件编码、解码支持MPEG-4/H263/H264/VC-1
·2D、3D图形硬件加速、D3D Mobile,支持OpenGL ES1.1 & 2.0
·支持SD卡+USB2.0升级系统
·支持TCPMP播放器完美硬件解码,MPEG-4/H264/VC-1在D1分辨率下音视频解码35fps
·支持MediaPlayer + Directshow视频硬件解码
·支持Camera回显、H264/MPEG-4视频高效率编码
·支持JPEG图片硬件编解码
·支持WIFI、蓝牙、3G、GPS等外置模块
·支持录音并存储存储至nand flash
·支持显示开机进度条、开机logo
·支持即时通工具MSN、SKYPE、QQ
·支持OFFICE、PDF阅读器
·支持Adobe Flash Lit,IE浏览器在线播放视频
·提供丰富的测试源码实例:视频编码实例、视频解码实例、JPEG编码实例、JPEG解码实例、Camera回显、拍照、录像实例、多重解码分屏显示实例、显示处理、缩放,TV OUT实例等,驱动源码+上层测试实例源码,为用户提供丰富、全面的参考资料
软件资源:
WinCE6.0 BSP软件资源
类别 功能特性 描述
Bootloader Stepldr ★ 提供源码,最终生成镜像STEPLDR.bin
Eboot ★ 提供源码,最终生成镜像EBOOT.bin
Eboot功能强大,主要包括:
1、网络下载:可设静态IP、HDCP获取动态IP、Mac地址设置、开机自动通过网络下载内核等功能
2、USB下载:通过USB OTG 2.0接口,高速更新镜像
3、格式化Nand Flash
4、格式化BinFS
5、低级格式化
6、设置启动延迟时间
7、开机启动进度条
Sdboot 提供可使用的二进制
1、SD启动、通过USB下载并烧写镜像(取代JTAG烧写)
2、任意更换开机LOGO
底层驱动
程序 DISPLAY LCD显示驱动,★ 提供源代码
显示驱动特点:
1、支持多款不同尺寸的液晶屏,3.5寸、4.3寸、7寸、10.2寸、10.4寸(LVDS)
2、支持16/18/24Bpp模式
3、支持屏幕旋转
TOUCH 触摸屏驱动,★ 提供源码
DM9000A DM9000网口驱动,★ 提供源码
CAMERA 摄像头驱动,支持OV9650/9653/9655, ★ 提供源码(选配)
HSMMC SD/MMC/SDIO驱动,★ 提供源码
IIC IIC驱动,★ 提供源码
JPEG JPEG驱动,★ 提供源码
SPI SPI驱动,★ 提供源码
Keybd 按键驱动程序,支持板载用户按键、外置矩阵按键 ★ 提供源码
NANDFLASH FMD模式Nand Flash驱动,支持512 Byts小Page、2K bytes大Page,驱动兼容128Mbit~8Gbit容量 ★ 提供源码
SERIAL 串口驱动,4个UART ★ 提供源码
WAVEDEV 音频驱动,支持AC97和IIS,默认驱动为AC97(WM9714) ★ 提供源码
CF_ATA CF卡,ATA硬盘驱动,提供源码
CMM ★ 提供源码
DMA ★ 提供源码
DrvLib ★ 提供源码
MFC 多媒体硬件编解码驱动, ★ 提供源码
OTG USB OTG驱动,仅支持Device功能, ★提供源码
USB USB HOST驱动, ★ 提供源码
POWERBUTTON ★ 提供源码
POWERCONTROL ★ 提供源码
UAO ★提供源码
WIFI_SDIO wifi模块驱动, ★ 提供源码(选配)
上层应用程序 MFC视频编解码
测试程序 提供源码、用户手册,支持MPEG-4/H264/H263/VC-1
详细的视频编码、解码实例和API操作文档
DirectShow filter
硬件解码程序 提供源码,源码内容包括
AACDecoderFilter
FrameExtractFilter
MFCDecoderFilter
MP4testcode
mpeg4ip_mp4v2
SsapMp4Parser
JPEG编解码测试程序 提供源码、API操作文档
OpenGL测试程序 提供源码、用户手册, 2D/3D硬件图形加速(OpenGL ES1.1&2.0)
Camera预览和编码测试程序 提供源码 支持OV9650/9653/9655 CMOS图像传感器
串口测试程序 提供源码 测试串口通讯的程序
TCPMP播放器 完美硬件解码MPEG-4/H263/H264/VC-1
支持avi、mp4、m4v、mov、3gp、flv、mpg等扩展格式
支持DIVX、XVID
支持解码MP1、MP2、MP3、AC3、AAC等音频格式
D1分辨率(720*576)下,视频解码40fps以上
录音程序 录音测试程序,支持永久存储至nand flash
Flash播放器 一款不错的flash 播放器
Skype 即时通讯工具,支持信息、语音聊天
MSN WinCE6.0自带即时通讯工具
QQ 腾讯QQ,支持在线聊天、QQ群、发送接收文件等
在线视频 支持在线播放视频
OFFICE软件 Word、Excel、PowerPoint、PDF、txt等阅览
PC端
开发环境及烧写软件 DNW V0.60C 串口调试终端、USB下载镜像工具
IROM_Fusing_Tool 烧写IROM_SD_EBOOT.NB0到SD卡的工具
Microsoft Visual Studio 2005 集成开发环境,系统定制、编译、调试环境 应用程序开发环境
Windows Embedded CE 6.0 内核定制、裁剪插件
Microsoft Activesync PC和WinCE的同步软件,同步建立后,可通过USB Device口与PC间进行数据交换,应用程序单步调试等

二、Linux2.6.28软件资源(点击展开)
Linux2.6.28 BSP软件资源
类别 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、读、写
2、支持USB 下载镜像
3、支持打印、设置、保存环境变量
4、支持内存内容显示、对比、修改
5、支持bootm、bootargs设置
★ 提供源代码
Sdboot 支持SD启动、通过USB下载并烧写镜像(取代JTAG烧写)
内核及
设备驱动
程序 内核 内核版本:Linux-2.6.28
系统时钟 系统主频:533MHz
显示驱动 支持多种不同尺寸液晶屏:3.5寸、4.3寸、7寸、10.2寸、10.4寸
★ 提供源码
TOUCH 触摸屏驱动 ★ 提供源码
DM9000 DM9000网口驱动 ★ 提供源码
CAMERA 摄像头驱动,支持OV9650/9653/9655, ★ 提供源码(选配)
HSMMC SD/MMC/SDIO驱动 ★ 提供源码
IIC IIC驱动 ★ 提供源码
SPI SPI驱动 ★ 提供源码
NANDFLASH NANDFLASH FMD模式Nand Flash驱动,支持512 Byts小Page、2K bytes大Page,驱动兼容128Mbit~8Gbit容量 ★ 提供源码
SERIAL 串口驱动,4个UART ★ 提供源码
WAVEDEV 音频驱动,支持AC97和IIS,默认驱动为AC97(WM9714) ★ 提供源码
USB Host 支持USB键盘、鼠标、U盘等 ★ 提供源码
DMA DMA驱动 ★ 提供源码
JPEG JPEG硬件编解码驱动 ★ 提供源码
MFC 多媒体硬件编解码驱动 ★ 提供源码
TV OUT 支持电视输出 ★ 提供源码
2D/3D 2D/3D硬件加速驱动 OpenGLES1.1 & 2.0、D3DM
文件系统 NFS文件系统 支持系统启动NFS挂载网络文件系统
Yaffs 支持yaffs文件系统
交叉编译器 cross-4.2.2-eabi.tar.bz2 交叉工具链
图形界面 Qtopia 2.2.0 图形界面支持多种功能
1、图片浏览器
2、MediaPlayer
3、日历、时钟、计算器
3、浏览器
4、文件管理器
5、终端
6、多款游戏
7、触摸校正程序
8、插件管理器
等等功能
上层
应用
程序 H.264 display H.264硬件解码测试程序
MPEG-4 display MPEG-4硬件解码测试程序
H.263 display H.263硬件解码测试程序
VC-1 display VC-1硬件解码测试程序
4-windows display 多重解码,四分屏硬件解码测试程序
Camera preview & MFC encoding Camera采集回显及MFC编码测试程序
MFC decoding & Camera preview MFC解码及camera回显测试程序
Camera input and JPEG encoding Camera 采集及JPEG编码测试程序
JPEG decoding and display JPEG解码机显示
MFC decoding & Camera preview thru TV TV输出MFC解码及camera回显
H.264 decoding thru TVOUT TV输出 H.264解码
PC端
(windows xp)
烧写工具 DNW V0.60C 串口调试终端、USB下载镜像工具
moviNAND_Fusing_Tool.exe 烧写启动代码到SD卡的工具

三、Android 1.5软件资源(点击展开)
Android1.5 BSP软件资源
类别 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、读、写
2、支持USB 下载镜像
3、支持打印、设置、保存环境变量
4、支持内存内容显示、对比、修改
5、支持bootm、bootargs设置
★ 提供源代码
Sdboot 支持SD启动、通过USB下载并烧写镜像(取代JTAG烧写)
内核及
设备驱动
程序 内核 内核版本:Linux-2.6.27
系统时钟 系统主频:533MHz
显示驱动 4.3寸屏(480*272)/7寸屏(800*480) ★ 提供源码
TOUCH 触摸屏驱动 ★ 提供源码
DM9000 DM9000网口驱动 ★ 提供源码
HSMMC SD/MMC/SDIO驱动 ★ 提供源码
IIC IIC驱动 ★ 提供源码
SPI SPI驱动 ★ 提供源码
KEYBD 按键驱动程序 ★ 提供源码
WAVEDEV 音频驱动,支持AC97和IIS,默认驱动为AC97(WM9714) ★ 提供源码
DMA DMA驱动 ★ 提供源码
RTC 实时时钟驱动
USB USB Device驱动
JPEG JPEG硬件编解码驱动 ★ 提供源码
MFC 多媒体硬件编解码驱动 ★ 提供源码
TV OUT 支持电视输出 ★ 提供源码
ROTATOR 屏幕旋转驱动 ★ 提供源码
2D/3D 2D/3D硬件加速驱动 OpenGLES1.1 & 2.0、D3DM
交叉编译器 arm-none-linux-gnueabi 交叉工具链
上层
应用
程序 Alarm Clock 这是Android 下一个闹钟程序,可以设置闹铃时间、铃声选择等等
ASTRO 文件管理器
Mediaplayer 不错的视频播放器,透明的工具条、可以横竖旋转屏幕
Music 音频播放器,支持专辑分类,艺术家、专辑、歌曲、播放列表、派对随机播放、背景播放、搜索等功能
Picsay 一款强大的图片编辑软件,通过该软件可以编辑图片、添加标题、文字说明、装饰图片,在图片上添加文字、添加小图片等等
Gallery 一个非常好的图片浏览控件,支持图片放大、缩小、上一张、下一张、幻灯片演示、共享、旋转、裁切、图片信息等
Browser Android 下的Brower 功能非常强大,支持网页放大、缩小、跳转、属性设置等
Panda Reader 熊猫看书是android下一款用于智能设备的阅读器,功能相当的强大。四大功能模块:本地图书、在线书库、电子杂志、我的收藏。
1、TXT动态加载实现流畅阅读
2、主题换肤:海蓝、银灰、金黄
3、多种滚屏方式、滚屏速度自由选择
4、历史记录的自动保存
5、色彩的设定:背景图片、背景颜色、文本颜色
6、字体的设置:字体大小、字体属性、字间距、行间距
7、全盘文件任意搜索
8、支持中英文切换
9、可浏览ZIP文件
PC端烧
写工具
(Windows XP) DNW V0.60C 串口调试终端、USB下载镜像工具
moviNAND_Fusing _Tool.exe 烧写启动代码到SD卡的工具

四、Android 0.9软件资源(点击展开)
Android 0.9 BSP软件资源
类别 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、读、写
2、支持USB 下载镜像
3、支持打印、设置、保存环境变量
4、支持内存内容显示、对比、修改
5、支持bootm、bootargs设置
★ 提供源代码
Sdboot 支持SD启动、通过USB下载并烧写镜像(取代JTAG烧写)
内核及
设备驱动
程序 内核 内核版本:Linux-2.6.29.1
系统时钟 系统主频:533MHz
显示驱动 4.3寸屏(480*272) ★ 提供源码
TOUCH 触摸屏驱动 ★ 提供源码
UART 4路串口驱动 ★ 提供源码
256M Nand Flash Nand Flash驱动,256M Bytes ★ 提供源码
Keybd 按键驱动,默认功能:上、下、左、右、确定、返回 ★ 提供源码
RTC 实时时钟驱动 ★ 提供源码
SD/MMC SD/MMC驱动 ★ 提供源码
编译器 Arm-none-linux-gnueabi 交叉工具链
图形界面 androidfs-sdk_m5-rc15-fix.tar Android 0.9

五、Ubuntu 9.04软件资源(点击展开)
Ubuntu-9.04 BSP软件资源
类别 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、读、写
2、支持USB 下载镜像
3、支持打印、设置、保存环境变量
4、支持内存内容显示、对比、修改
5、支持bootm、bootargs设置
★ 提供源代码
Sdboot 支持SD启动、通过USB下载并烧写镜像(取代JTAG烧写)
内核及
设备驱动
程序 内核 内核版本:Linux-2.6.29.1
系统时钟 系统主频:533MHz
显示驱动 4.3寸屏(480*272) ★ 提供源码
TOUCH 触摸屏驱动 ★ 提供源码
UART 4路串口驱动 ★ 提供源码
256M Nand Flash Nand Flash驱动,256M Bytes ★ 提供源码
Keybd 按键驱动,默认功能:上、下、左、右、确定、返回 ★ 提供源码
RTC 实时时钟驱动 ★ 提供源码
SD/MMC SD/MMC驱动 ★ 提供源码
编译器 Arm-none-linux-gnueabi 交叉工具链
图形界面 Lxde-ubuntu Ext3 rootfs

六、 DJYOS操作系统介绍(点击展开)

㈨ 国外有哪些关于Android的学习网站或资料或论坛

国外的Android学习网站最大资源帝Google官方——Android开发者网站。

Google官方开发者支持平台Android Developers,开发者可以找到Google关于Android设计(Design)、开发(Develop)及发布应用(Distribute)的官方说明文档。

在Develop(开发)中,分别有教程(Android Training)、API指南(API Guides)、引用(Ref-erence)、工具(Tools)四项内容。下面就对这四项内容进行简单介绍。

(1)Android Training:在这个模块中,Google针对初学者和中高级开发者分别给出初级(Get Started)和高级(Advanced Training)两个级别的教程。网站右侧都提供Demo工程下载,使开发者可以很方便地下载学习。

初级教程内容包括应用界面搭建、管理Activity生命周期、对不同移动设备进行适配等内容。高级教程则包括了大量的Android系统特性及OpenGLes使用等内容。

(2)API Guides:该模块包含了Android API说明文档,对Android中的每个功能模块进行说明。说明文档中有大量的范例代码。如果对某一个控件或某一个传感器的使用不明白.可以在这里找到答案。
(3)Reference:根据Android包结构对每一个类及类中的接13、方法进行说明。对一个Android方法的使用不是很明白时,就赶快来这里查查吧!可以使用网站右上角的搜索按钮来寻找自己所需要的文档说明。

(4)Tools:这个模块介绍了与Android开发工具使用方法。

㈩ 毕业设计选了用android做一个3d魔方的游戏,应为android以前没接触过的,要从头开始学的。这个难吗高手

只要java好就没有问题,这是3D魔方android的源码。
package com.example.android.image3D;

import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.content.Context;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;

import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;

public class View3D extends SurfaceView implements SurfaceHolder.Callback {

private static final Semaphore sEglSemaphore = new Semaphore(1);
private boolean mSizeChanged = true;

private SurfaceHolder mHolder;
private GLThread mGLThread;
private GLWrapper mGLWrapper;

public View3D(Context context) {
super(context);
init();
}

public View3D(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}

public SurfaceHolder getSurfaceHolder() {
return mHolder;
}

public void setGLWrapper(GLWrapper glWrapper) {
mGLWrapper = glWrapper;
}

public void setRenderer(Renderer renderer) {
mGLThread = new GLThread(renderer);
mGLThread.start();
}

public void surfaceCreated(SurfaceHolder holder) {
mGLThread.surfaceCreated();
}

public void surfaceDestroyed(SurfaceHolder holder) {
mGLThread.surfaceDestroyed();
}

public void surfaceChanged(SurfaceHolder holder,
int format, int w, int h) {
mGLThread.onWindowResize(w, h);
}

public void onPause() {
mGLThread.onPause();
}

public void onResume() {
mGLThread.onResume();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mGLThread.onWindowFocusChanged(hasFocus);
}

public void queueEvent(Runnable r) {
mGLThread.queueEvent(r);
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mGLThread.requestExitAndWait();
}

public interface GLWrapper {
GL wrap(GL gl);
}

public interface Renderer {

int[] getConfigSpec();

void surfaceCreated(GL10 gl);
void sizeChanged(GL10 gl, int width, int height);
void drawFrame(GL10 gl);
}

private class EglHelper {

EGL10 mEgl;
EGLDisplay mEglDisplay;
EGLSurface mEglSurface;
EGLConfig mEglConfig;
EGLContext mEglContext;

public EglHelper() {

}

public void start(int[] configSpec){

mEgl = (EGL10) EGLContext.getEGL();
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
mEgl.eglInitialize(mEglDisplay, version);

EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,
num_config);
mEglConfig = configs[0];

mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,
EGL10.EGL_NO_CONTEXT, null);

mEglSurface = null;
}

public GL createSurface(SurfaceHolder holder) {

if (mEglSurface != null) {

mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
}

mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,
mEglConfig, holder, null);

mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
mEglContext);

GL gl = mEglContext.getGL();
if (mGLWrapper != null) {
gl = mGLWrapper.wrap(gl);
}
return gl;
}

public boolean swap() {
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}

public void finish() {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
}
if (mEglContext != null) {
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
}
if (mEglDisplay != null) {
mEgl.eglTerminate(mEglDisplay);
mEglDisplay = null;
}
}

}

class GLThread extends Thread {

private boolean mDone;
private boolean mPaused;
private boolean mHasFocus;
private boolean mHasSurface;
private boolean mContextLost;
private int mWidth;
private int mHeight;
private Renderer mRenderer;
private ArrayList<Runnable>
mEventQueue = new ArrayList<Runnable>();
private EglHelper mEglHelper;

GLThread(Renderer renderer) {
super();
mDone = false;
mWidth = 0;
mHeight = 0;
mRenderer = renderer;
setName("GLThread");
}

@Override
public void run() {

try {
try {
sEglSemaphore.acquire();
} catch (InterruptedException e) {
return;
}
guardedRun();
} catch (InterruptedException e) {

} finally {
sEglSemaphore.release();
}
}

private void guardedRun() throws InterruptedException {
mEglHelper = new EglHelper();
int[] configSpec = mRenderer.getConfigSpec();
mEglHelper.start(configSpec);

GL10 gl = null;
boolean tellRendererSurfaceCreated = true;
boolean tellRendererSurfaceChanged = true;

while (!mDone) {

int w, h;
boolean changed;
boolean needStart = false;
synchronized (this) {
Runnable r;
while ((r = getEvent()) != null) {
r.run();
}
if (mPaused) {
mEglHelper.finish();
needStart = true;
}
if(needToWait()) {
while (needToWait()) {
wait();
}
}
if (mDone) {
break;
}
changed = mSizeChanged;
w = mWidth;
h = mHeight;
mSizeChanged = false;
}
if (needStart) {
mEglHelper.start(configSpec);
tellRendererSurfaceCreated = true;
changed = true;
}
if (changed) {
gl = (GL10) mEglHelper.createSurface(mHolder);
tellRendererSurfaceChanged = true;
}
if (tellRendererSurfaceCreated) {
mRenderer.surfaceCreated(gl);
tellRendererSurfaceCreated = false;
}
if (tellRendererSurfaceChanged) {
mRenderer.sizeChanged(gl, w, h);
tellRendererSurfaceChanged = false;
}
if ((w > 0) && (h > 0)) {

mRenderer.drawFrame(gl);
mEglHelper.swap();
}
}
mEglHelper.finish();
}

private boolean needToWait() {
return (mPaused || (! mHasFocus) || (! mHasSurface) || mContextLost)
&& (! mDone);
}

public void surfaceCreated() {
synchronized(this) {
mHasSurface = true;
mContextLost = false;
notify();
}
}

public void surfaceDestroyed() {
synchronized(this) {
mHasSurface = false;
notify();
}
}

public void onPause() {
synchronized (this) {
mPaused = true;
}
}

public void onResume() {
synchronized (this) {
mPaused = false;
notify();
}
}

public void onWindowFocusChanged(boolean hasFocus) {
synchronized (this) {
mHasFocus = hasFocus;
if (mHasFocus == true) {
notify();
}
}
}

public void onWindowResize(int w, int h) {
synchronized (this) {
mWidth = w;
mHeight = h;
mSizeChanged = true;
}
}

public void requestExitAndWait() {
synchronized(this) {
mDone = true;
notify();
}
try {
join();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}

public void queueEvent(Runnable r) {
synchronized(this) {
mEventQueue.add(r);
}
}

private Runnable getEvent() {
synchronized(this) {
if (mEventQueue.size() > 0) {
return mEventQueue.remove(0);
}

}
return null;
}
}
}

热点内容
mu免费脚本 发布:2024-11-09 10:12:57 浏览:233
安卓手机虚拟按键如何设置 发布:2024-11-09 10:07:32 浏览:159
安卓手机如何校正触控屏 发布:2024-11-09 10:07:31 浏览:349
服装数据库数据 发布:2024-11-09 10:07:22 浏览:628
比较图片算法 发布:2024-11-09 10:01:40 浏览:544
车数控编程 发布:2024-11-09 09:53:30 浏览:575
安卓在哪里设置允许广告追踪 发布:2024-11-09 09:51:37 浏览:166
山立压缩机 发布:2024-11-09 09:51:32 浏览:766
海南dns服务器ip 发布:2024-11-09 09:51:30 浏览:425
电脑连线路由器用户名密码多少 发布:2024-11-09 09:46:33 浏览:953