Articles of opengl es 2.0

android opengl-es-2.0 – rotateM解释

我从android opengl es 2.0开始,我试图理解这些概念。 我写了下面的函数来旋转一个矩形。 通过使用rotateM方法中的值,我成功地进行了一些旋转。 但是,我没有成功做出矩形的一些具体旋转,例如向右旋转2D 45度。 基本上我正在盯着说明以下的android参考; rotateM(float [] m,int mOffset,float a,float x,float y,float z)围绕坐标轴(x,y,z)以angular度a(度)旋转matrixm。 现在我明白了,我们提供了一个modelMatrix,这个matrix中的一个偏移量和angular度旋转,但是为什么我们必须提供xyz轴分量,这些值真的做了什么? 希望有人可以给我一个关于rotateM方法的清晰解释,谢谢! private void positionRectangleInScene() { setIdentityM(modelMatrix, 0); rotateM( modelMatrix, // m : source matrix 0, // mOffset : index into m where the matrix starts 0f, // a : angle ato rotate in degrees 1f, // x […]

检测OpenGl ES 2.0是否可用

我正在为API级别> = 7的Android创build应用程序。一个屏幕通过ndk使用带有OpenGL ES 2.0的GLSurfaceView。 如何检测opengl 2.0是否可用? 我不能在我的AndroidManifest.xml中使用android:glEsVersion="0x00020000" ,因为我必须支持API级别大于android:glEsVersion="0x00020000" 7的所有手机。如果不支持2.0,我将显示一个静态屏幕。 我正在使用ndk附带的hello-gl2示例应用程序中的类似代码。 在GL2JNIView中,当它设置Opengl上下文时,如果它找不到合适的openglconfiguration(在我的情况下需要opengl es 2.0的configuration),它会抛出一个IllegalArgumentException("No configs match configSpec")并且应用程序崩溃。 我无法find拦截该exception的方法,并在该屏幕上执行其他操作。 有任何想法吗?

显示黑色纹理的Android OpenGL2.0

我正在尝试在OpenGL2.0中将纹理绘制到四边形上。 到目前为止,我已经得到了四边形和一切,但纹理不存在 – 四边形都是黑色的。 我的主要怀疑是我没有正确地映射纹理 – 我的纹理不是2的幂,也不是正方形 – 它们的宽度在mWidth字段中,mRowHeight中的高度。 四边形绘制在一个垂直列表中,用一个翻译matrix完成。 我会非常感激,如果任何人都可以过去这个事业,我绝望! 这里是相关的代码: 初始化缓冲区: void initBuffers() { float r = (float) mRowHeight / (mHeight / 2f); ByteBuffer bb; float[] bounds = { // XYZ /* 0 – TL */-1f, 1f, 0f, /* 1 – BL */-1f, 1 – r, 0f, /* 2 – BR */ 1f, […]

当执行eglSwapBuffer和eglMakeCurrent时性能低下

我正在开发一个允许用户logging他/她的游戏玩法的Android Unity插件 我的解决scheme概述: 使用OpenGl FrameBufferObject(FBO)使Unity渲染离开这个FBO 获得这个FBO的离线纹理,然后用于2个目的: 渲染到video表面 重绘到设备屏幕 每帧执行stream程: 绑定我的FBO 渲染场景到FBO(统一码) 解开我的FBO 设置video表面 configuration表面大小(仅限第一次执行) 保存egl状态 使video表面电stream 使用FBO的离屏纹理绘制到video表面 恢复到默认的表面 将演示时间设置为video帧 从video表面交换缓冲区到默认窗口 恢复egl状态 使默认的表面电stream 通知编码器线程数据已准备好写入 我的问题是录制时的performance不好。 三星Galaxy S4的FPS从60降低到40。 我试图logging渲染操作的执行时间,并认识到最影响性能操作是使video表面当前操作和从video表面到默认窗口操作的交换缓冲区。 以下是他们的代码 public void makeCurrent() { if (!EGL14.eglMakeCurrent(this.mEGLDisplay, this.mEGLSurface, this.mEGLSurface, this.mEGLContext)) throw new RuntimeException("eglMakeCurrent failed"); } public boolean swapBuffers() { return EGL14.eglSwapBuffers(this.mEGLDisplay, this.mEGLSurface); } 执行当前操作的时间为1〜18 ms 交换缓冲区的执行时间为4〜14 ms 其他操作的执行时间通常为0〜1 […]

AndEngine RenderTextureexception:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

我开发了一个很多人玩的Android游戏。 100-200中的一个用户面临一个我无法理解的例外。 我使用了一个RenderTexture ,当我试图初始化它时抛出下面的exception: Fatal Exception: org.andengine.opengl.exception.RenderTextureInitializationException org.andengine.opengl.exception.GLFrameBufferException: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 它适用于所有设备的99%。 init方法如下所示: public void init(final GLState pGLState) throws GLFrameBufferException, GLException { this.savePreviousFramebufferObjectID(pGLState); try { this.loadToHardware(pGLState); } catch (final IOException e) { /* Can not happen. */ } /* The texture to render to must not be bound. */ pGLState.bindTexture(0); /* Generate FBO. */ this.mFramebufferObjectID = pGLState.generateFramebuffer(); […]

在opengl ES 2.0驱动程序上使用irrlicht android

我正在学习在Android上使用Irrlicht 。 上个月我一直在开发基于openGL es 1.0的驱动,效果很好(我使用1.0,因为当我试图运行基于驱动es 2.0的例子时,结果变得非常奇怪)。 加载网格是好的,但让我困惑的是纹理无法正确显示。 渲染代码如下: smgr = device->getSceneManager(); guienv = device->getGUIEnvironment(); stringc myDir = gSdCardPath; myDir += "/Irrlicht"; device->getFileSystem()->changeWorkingDirectoryTo(myDir.c_str()); stringc sydneyFilename = "/Irrlicht/sydney.md2"; mesh=smgr->getMesh("/sdcard/Irrlicht/sydney.md2"); if (!mesh) { device->drop(); __android_log_print(ANDROID_LOG_INFO, "Irrlicht", "cannot getMesh"); return; } nodeSydney = smgr->addAnimatedMeshSceneNode(mesh); if (nodeSydney) { nodeSydney->setMaterialFlag(EMF_LIGHTING, false); nodeSydney->setMD2Animation(scene::EMAT_STAND); stringc sydneyTextureFilename = "/Irrlicht/sydney.bmp"; texture=driver->getTexture("/sdcard/Irrlicht/sydney.bmp"); if (!texture) LOGI("sydney.bmp load […]

Android – OpenGL ES 2.0:模拟器(工程) – 设备(不)

美好的一天! 我正在做Android的OpenGL ES 2.0一些简单的testing。 我正在使用模拟加载器,在模拟器中运行良好。 但是,当我尝试在华硕ZenFone 2E(Android 5.0.1)(预付电话)上使用它时,它只是显示背景的清晰颜色,没有旋转模型。 我希望在OpenGL ES 2.0和Android方面经验丰富的人能够帮助我。 对不起,冗长,我真的不知道为什么它不是在电话上工作。 这里是来源(我是一个极端的新手): GameView.java: package wise.child.dials; import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import android.os.SystemClock; import java.io.IOException; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import model.Model; import render.Program; import render.Shader; import util.OBJLoader; public class GameView extends GLSurfaceView implements GLSurfaceView.Renderer { // App Context private Context […]

录制由Open GL ES在android上生成的帧

我从相机捕获帧并通过OpenGL ES 2.0实时渲染。 现在我想把它们和audio一起录制到一个电影文件中。 在iPhone上,我有AVAssetWriter,照顾录音,给我30fps。 我在android上有什么select? 我试过search,但找不到任何。 更新:对于那些想知道我在做什么,请看这个应用程序: https : //play.google.com/store/apps/details?id=com.androidillusion.videocamillusion&hl=en 这是我发现的唯一可以执行30FPSvideo渲染/录制的应用程序。 我的目标是试图弄清楚它是如何完成的。

dynamic添加Opengl形状

我正在按照这个教程来添加Opengl到我的Android应用程序。 https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html 。 在所有的例子中,形状都是在MyGLRenderer构造函数中创build的,但是我想知道如何在Renderer创build后dynamic地添加Opengl形状。 如何才能做到这一点?

Android Openg GL ES 2绘制大纹理速度缓慢

我对OpenGL 很陌生。 我试图画纹理四边形(2个三angular形)。 纹理的大小是900x900px。 我没有问题的一个四,但是当我试图画出5-10个四边形,我看到明显的减速。 也许我在做错事 码: public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); … matrix calculation … GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); } 顶点着色器: uniform mat4 uMVPMatrix; attribute vec4 vPosition; attribute vec2 a_TexCoordinate; varying vec2 v_TexCoordinate; void main() { gl_Position = uMVPMatrix*vPosition; v_TexCoordinate = a_TexCoordinate; } 片段着色器: precision mediump float; […]