Articles of opengl es

适用于Android的OpenGL ES 2.0中的纹理

我是OpenGL的新手,我正在通过使用ES 2.0为Android制作2D游戏来自学。 我首先创建一个“Sprite”类,创建一个平面并为其渲染纹理。 为了练习,我有两个Sprite对象在同一个地方交替绘制。 我用ES 1.0很好地工作了,但是现在我已经切换到2.0,我得到了一个没有错误的黑屏 。 我已经筋疲力尽,想弄清楚我做错了什么,但我有一种强烈的感觉,它与我的着色器有关。 我将把所有相关的代码转储到这里,希望有人可以给我一个答案,或者告诉我我做错了什么。 如果不能立即明白我做错了什么,或许就如何解决这个问题提出一些建议? 提前感谢您浏览我即将发布的所有代码。 我发布的三个课程是: GameRenderer – 我的GLSurfaceView的渲染器 着色器 – 创建着色器程序对象 精灵 – 创建一个正方形并在其上绘制纹理 此外,我将发布我的顶点和片段着色器源。 我认为没有足够相关的相关课程发布: GameActivity GameView – 一个GLSurfaceView GameLoopThread – 我的主要游戏循环 FPSCounter – 每100帧将平均FPS输出到logcat。 GameRender类: package com.detour.raw; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.graphics.Bitmap; import android.opengl.GLES20; import android.opengl.GLU; import android.opengl.Matrix; import android.opengl.GLSurfaceView; public class GameRenderer […]

OpenGl直接渲染到位图(没有任何视图)

我需要将一些像素着色器应用于位图(使用OpenGL)并将结果发送到服务器。 渲染应该在后台进行,所以我不能为此创建GLSurfaceView。 所以我的问题是:是否可以在不使用GLSurfaceView的情况下在Android上进行OpenGL渲染? 喜欢直接渲染到位图,canvas或某种缓冲/数组? 或者可以通过它使用某种虚拟GLSurfaceView?

Android:LibGDX 2D游戏内存消耗

我在使用libGDX开发2D游戏时遇到了一些内存消耗问题。 这是一款具有丰富图形内容的2D游戏 – 有许多纹理,animation,字体等等。由于某些原因,所有图形内容都是在游戏开始时加载的 – 这是内存问题。 我已经在不同的设备上测试了内存分配(本机和堆)并得到了不同的结果:(我已经按照纹理大小划分了所有设备组) 第1组 (纹理采用~840 * 480屏幕) HTC Desire(Froyo): 178Mb(本机) – 12Mb(堆) – 应用程序加载成功 HTC One V(ICS): 30Mb(本机) – 12Mb(堆) – 应用程序成功加载 HTC Desire S(Jelly Bean): 30Mb(本机) – 12Mb(堆) – 应用程序加载成功 第2组 (纹理采用~1366 * 768屏幕) 三星(谷歌)Galaxy Nexus 329Mb(原生) – 18Mb(堆) – 效果很好 Galaxy TAB(Honeycomb) 164Mb(本机) – 10Mb(堆) – 应用程序崩溃 (Surface.OutOfResouresException)。 我认为在所有Android版本上可能存在一些重要的内存管理差异,这给我带来了这些麻烦。 […]

如何提高Android上位图绘制的性能

我创建了一个基于FFmpeg的电影播放器​​。 它工作正常。 LG P970(带有Neon的Cortex A8)解码速度非常快我平均拥有70 fps的640 x 424分辨率video流,包括YUV2RGB转换。 但是,存在一个瓶颈。 它是在Canvas上绘制的。 我使用jnigraphics本机库将图片数据填充到本机侧的位图中,然后在SurfaceView中的Canvas上绘制这个位图。 这是非常简单和常见的方法,但绘图需要44毫秒的位图,640 x 424分辨率,将fps降低到23并使这种技术无法使用……它需要比整个A / V帧解码更多! 有没有什么方法可以更快地绘制位图? 我更喜欢使用OpenGLES 2在本机代码中完全呈现,但我读过它也可能很慢 。 所以现在怎么办?… 如何尽可能快地渲染位图?

在Android上使用CPU到GPU的最低开销相机

我的应用程序需要在CPU上对实时相机帧进行一些处理,然后再在GPU上进行渲染。 还有一些其他的东西在GPU上呈现,这取决于CPU处理的结果; 因此,保持所有内容同步非常重要,这样我们就不会在GPU上渲染帧本身,直到该帧的CPU处理结果也可用。 问题是在Android上这个最低的开销方法是什么? 在我的情况下CPU处理只需要一个灰度图像,因此Y平面打包的YUV格式是理想的(并且往往与相机设备的原生格式很好地匹配)。 NV12,NV21或全平面YUV都可以提供理想的低开销灰度访问,因此在CPU方面是首选。 在原始相机API中,setPreviewCallbackWithBuffer()是将数据输入CPU进行处理的唯一合理方法。 这使得Y平面分离,因此非常适合CPU处理。 将此框架提供给OpenGL以便以低开销方式呈现是更具挑战性的方面。 最后,我编写了一个NEON颜色转换例程来输出RGB565,并且只需使用glTexSubImage2d就可以在GPU上使用它。 这是在Nexus 1时间帧中首次实现的,即使是320×240 glTexSubImage2d调用也需要50ms的CPU时间(我猜想,尝试进行纹理调配的不良驱动程序 – 后来在系统更新中显着改善)。 回到那一天,我研究了像eglImage扩展这样的东西,但是对于用户应用程序来说,它们似乎不够用或没有足够的文档记录。 我对内部android GraphicsBuffer类进行了一些研究,但理想情况下希望保留在受支持的公共API的世界中。 android.hardware.camera2 API承诺能够将ImageReader和SurfaceTexture连接到捕获会话。 不幸的是我无法看到任何确保正确的顺序管道的方法 – 在CPU处理完毕之前暂停调用updateTexImage()很容易,但如果在处理过程中另一帧已经到达,那么updateTexImage()将直接跳到最新帧。 在多个输出中似乎也会有每个队列中帧的独立副本,理想情况下我想避免这些副本。 理想情况下,这就是我想要的: 相机驱动程序使用最新帧填充一些内存 CPU获取指向内存中数据的指针,可以在不进行复制的情况下读取Y数据 当帧准备就绪时,CPU处理数据并在我的代码中设置一个标志 开始渲染帧时,检查新帧是否准备就绪 调用一些API来绑定与GL纹理相同的内存 准备好较新的帧时,将保留前一帧的缓冲区释放回池中 我无法看到在Android上使用公共API完全实现零拷贝样式的方法,但是最接近它的是什么? 我试过的一个疯狂的事情似乎有用,但没有记录:ANativeWindow NDK API可以接受数据NV12格式,即使适当的格式常量不是公共标题中的那个。 这允许通过memcpy()填充SurfaceTxture的NV12数据,以避免CPU端颜色转换以及glTexImage2d中驱动程序端发生的任何混乱。 这仍然是数据的额外副本,虽然感觉它应该是不必要的,并且再次因为它没有文档可能不适用于所有设备。 支持的顺序零拷贝摄像头 – > ImageReader – > SurfaceTexture或等效物将是完美的。

信号11(SIGSEGV),代码1(SEGV_MAPERR)

我正在使用OpenGL在Android上创建2D游戏。 目前我正在几台设备上测试和调试游戏。 我面临的问题是可怕的“信号11”错误。 当我在我的三星Galaxy Nexus上玩时,一切都运行顺畅,我可以玩几个小时没有游戏丢失任何错误。 我的Nexus正在运行Android ICS。 现在,当我在其他设备上运行时,我收到此信号11错误。 这是抛出错误的设备: – HTC Desire HD(姜饼) – HTC Desire Z(姜饼) – HTC Wildfire(姜饼) – Advent Vega平板电脑(Vegacomb) – 华硕EE Pad Transformer(冰淇淋三明治) 我不能在我的Advent Vega上使用USB调试,但其他3个popup错误的设备都是可调试的。 似乎我需要根据我的设备来获取有关信号11错误的更多信息。 我能够根据我的Galaxy Nexus和我的Desire HD。 由于错误似乎总是出现在同一时刻(当游戏刚刚完成加载纹理时),我想我只能使用一个有根设备找出问题的原因,然后修复它,并测试另一台设备上的新版本。 首先,我认为它与内存管理有关(不释放我的对象,因此执行大量的GC请求)。 因此,经过几个小时的分析,优化,测试等,我发现这不是问题所在。 然后我认为它与Thread Safety有关(一个线程试图从内存中获取内容,另一个线程刚刚销毁了引用)。 但事实似乎并非如此。 好的,现在我将我的根Desire HD连接到我的笔记本电脑上,然后打开我的Eclipse项目,运行DDMS。 现在,当游戏/应用程序崩溃时,logcat会告诉我什么? 04-02 13:24:50.561: D/dalvikvm(3526): GC_CONCURRENT freed 739K, 43% free 4225K/7303K, external 1478K/1939K, paused 2ms+4ms […]

如何在Android应用程序中检测OpenGL ES中的对象点击?

在我的Android应用程序中,我在一个集合中有一堆网格物体在3D空间中移动。 当触摸任何一个移动的网格(对象)时,我想要在网格上发生某些事情。 如何检测已点击/单击的对象?

Android OpenGL:睡眠后的疯狂长宽比

如果我按下我的Android手机上的电源按钮(或等待它超时)并且手机进入睡眠状态,在重新唤醒之后,屏幕宽高比完全没有了。 截图: 破碎 正确 在GameActivity.onCreate()中 // Grab display info DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); ACTUAL_SCREEN_WIDTH = (int) dm.widthPixels; ACTUAL_SCREEN_HEIGHT = (int) dm.heightPixels; ACTUAL_DENSITY = dm.density; double scale = ((double) MainMenuActivity.resolutionScale / 100.0); SCREEN_WIDTH = (int) (ACTUAL_SCREEN_WIDTH * scale); SCREEN_HEIGHT = (int) (ACTUAL_SCREEN_HEIGHT * scale); DENSITY = ACTUAL_DENSITY * scale; // Setup graphics requestWindowFeature(Window.FEATURE_NO_TITLE); surface_view […]

移动可视化工具(平板电脑)

我有一个项目可视化平板电脑上的一些数据。 我可能会使用android来开发应用程序,但我不知道如何可视化实时数据? 在Android上可以使用哪些工具来执行此操作? 我注意到我可以使用OpenGL ES,但后来我对此一无所知,这对我来说非常复杂。 还有其他简单的工具可以获取实时数据并将其可视化吗? 我们有一个基本的Matlab / Simulink可视化,但需要更好的可视化。 有什么建议吗?

通过SurfaceTexture在GLSurfaceView上显示相机流

我试图通过传递给OpenGL ES 2.0着色器的SurfaceTexture在GLSurfaceView中显示相机流。 我从这篇文章中汲取灵感。 图像已完成,但未在我的平板电脑上正确显示。 屏幕分为2×2部分。 图像显示在左上部分,而其他三个部分显示为黑色。 我怀疑问题来自于我使用此处记录的序列返回的转换矩阵 updateTexImage(); getTransformMatrix(…); 我在顶点着色器中传输此矩阵以生成片段着色器的纹理坐标。 顶点着色器: attribute vec3 aPosition; uniform mat4 uMvpTransform; // Matrix retrieved by getTransformMatrix(…); uniform mat4 uTexMatTransform; varying vec2 vTexCoord; void main(void) { gl_Position = uMvpTransform *vec4(aPosition.xyz, 1); vec4 l_tex = uTexMatTransform*vec4(aPosition.xyz, 1); vTexCoord=l_tex.xy; } 片段着色器: #extension GL_OES_EGL_image_external : require varying mediump vec2 vTexCoord; uniform samplerExternalOES […]