Articles of opengl es 2.0

实现GLSurfaceView.Renderer问题

代码源自本教程 我正在为Android系统开始一些OpenGL-ES 2.0 。 我从以下代码中获取了以下代码: http : //developer.android.com/training/graphics/opengl/environment.html#renderer public class MyRenderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unused, EGLConfig config) { GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); } public void onDrawFrame(GL10 unused) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); } } 我收到以下错误 Gradle:错误:MyRenderer不是抽象的,并且不会覆盖Renderer中的抽象方法onSurfaceCreated(GL10,EGLConfig) 有谁知道怎么办? 我需要使用MyRenderer类传递给GLSurfaceView ,因此简单地将其声明为抽象并不是一个可行的解决方案。 有人可以解释我的问题吗?

Android EGL / OpenGL ES帧率口吃

TL; DR 即使完全没有绘图,似乎也无法在Android设备上的OpenGL ES渲染线程上保持60Hz的更新速率。 神秘的尖峰经常出现(在底部的代码中展示),并且我已经做出的每一项努力来弄清楚为什么或如何导致死胡同。 使用自定义渲染线程在更复杂的示例中进行计时一直表明eglSwapBuffers()是罪魁祸首,经常超过17ms-32ms。 帮帮我? 更多细节 这尤其令人讨厌,因为我们项目的渲染要求是屏幕对齐元素,从屏幕的一侧到另一侧以固定的高速率平滑地水平滚动。 换句话说,一个平台游戏。 从60Hz频繁下降会导致明显的弹跳和晃动,无论是否有基于时间的移动。 由于滚动速度很高,因此在30Hz下渲染不是一种选择,这是设计中不可协商的部分。 我们的项目是基于Java的,以最大限度地兼容并使用OpenGL ES 2.0。 我们只深入了解NDK,用于API 7-8设备上的OpenGL ES 2.0渲染和API 7设备上的ETC1支持。 在它和下面给出的测试代码中,我已经validation了除了日志打印和我无法控制的自动线程之外没有分配/ GC事件。 我在一个使用股票Android类而没有NDK的文件中重新创建了这个问题。 下面的代码可以粘贴到Eclipse中创建的新Android项目中,只要您选择API级别8或更高级别,它就可以开箱即用。 该测试已在具有各种GPU和OS版本的各种设备上重现: Galaxy Tab 10.1(Android 3.1) Nexus S(Android 2.3.4) Galaxy S II(Android 2.3.3) XPERIA Play(Android 2.3.2) Droid Incredible(Android 2.2) Galaxy S(Android 2.1-update1)(将API要求降低到7级时) 样本输出(从运行时间不到1秒收集): Spike: 0.017554 Spike: 0.017767 Spike: 0.018017 Spike: 0.016855 Spike: […]

如何使用Android摄像头与OpenGL ES工作?

我想使用OpenGL ES进行Android相机预览并保存捕获的图像。 我喜欢在Android相机中使用OpenGL ES来为Android相机提供一些效果。 所以请有人告诉我该怎么做?

在Libgdx中绘制渐变

好的,我有这个代码 @Override public void render() { // do not update game world when paused if (!paused) { // Update game world by the time that has passed // since last render frame worldController.update(Gdx.graphics.getDeltaTime()); } // Sets the clear screen color to: Cornflower Blue Gdx.gl.glClearColor(0x64/255.0f, 0x95/255.0f, 0xed/255.0f, 0xff/255.0f); // Clears the screen Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // Render game […]

Android上的EGL与GLES 2.0(例如Java)

(经验丰富的c程序员,预着色器,固定functionopen gl。称职的Java程序员) 我一直在Android上使用GLES并且已经运行了示例(本机和Java)。 特别是纹理三角形的例子。 令我完全困惑的是Khronos EGL和android GLES界面的“关系”。 这些是并行的独立接口(API)吗? EGL应该是一个独立于平台(中立)的界面吗? EGL似乎完全支持GLES 1.0和1.1,但不支持ES 2.0(在Android上)? 因此,在我看来,EGL 应该是一个平台中立的并行接口, 但它并不完全支持GLES 2.0 (在Android上); 因此,如果您正在编写GLES 2.0代码(在Android上),那么最好只使用GLxxx API而不是EGLxxx API(并且无论如何都必须使用GLxxx API)。 据我所知,你没有“使用EGL”,因为它只支持ES 2.0 API的一个子集。 (每个示例/书籍/参考要么混合两者,使用原生界面或仅使用EGL 1.1function;我在这里缺少一些基本的东西吗?)

Android OpenGL ES 2.0模拟器

我有一个支持OpenGl ES 2.0(HTC Desire)的设备,当然在设备上部署app比在模拟器上快得多。 默认的android模拟器不支持2.0,androidX86项目和类似的androbox项目不支持本机代码(NDK)所以即使Hello-Jni崩溃它们(所有样本在标准AVD上工作正常除了Hello-GL2样本ofc),不知道支持他们是否是OpenGL ES 2.0,请告诉我。 因此,如果有本地方式(NDK)的开发支持OpenGl 2.0 – 如何在没有设备的情况下测试应用程序?

如何使用OpenGL-ES 2在Android中加载和显示.obj文件

我正在尝试将.obj文件加载到我的Android应用程序中并使用OpenGL 2显示它。 你可以在这里find这个文件: 编辑:我删除了文件 ,你可以使用任何包含下面提到的值的.obj文件进行测试。 stackoverflow上有很多类似的问题,但我找不到一个不需要一些大型库的简单解决方案。 该文件仅包含以下值types: G v VT VN F 我尝试了libgdx,它工作正常,但对我需要的东西来说有点矫枉过正。 我在没有LWJGL的情况下尝试了oObjLoader https://github.com/seanrowens/oObjLoader 。 解析似乎有效,但如何在简单场景中显示值? 下一步是将图像作为纹理附加到对象。 但是现在我很乐意按原样显示文件。 我愿意接受不同的解决方案,例如预转换文件,因为它只会在应用程序中出现。 谢谢! 状态更新基本加载和显示现在可以正常工作,如我自己的答案所示。

如何使用OpenGLES 2.0实时在libgdx中在背景上渲染Android的YUV-NV21相机图像?

与Android不同,我对GL / libgdx相对较新。 我需要解决的任务,即将Android相机的YUV-NV21预览图像实时渲染到libgdx内部的屏幕背景是多方面的。 以下是主要关注点: Android相机的预览图像仅保证在YUV-NV21空间中(在类似的YV12空间中,U和V通道不交错但分组)。 假设大多数现代设备提供隐式RGB转换是非常错误的,例如最新的Samsung Note 10.1 2014版本仅提供YUV格式。 由于除非是RGB格式,否则无法在OpenGL中向屏幕绘制任何内容,因此必须以某种方式转换颜色空间。 libgdx文档( 集成libgdx和设备摄像头 )中的示例使用Android表面视图,该视图位于使用GLES 1.1绘制图像的所有内容之下。 自2014年3月初以来,由于过时而且几乎所有设备都支持GLES 2.0,因此从libgdx中删除了OpenGLES 1.x支持。 如果使用GLES 2.0尝试相同的样本,则在图像上绘制的3D对象将是半透明的。 由于后面的表面与GL无关,因此无法真正控制。 禁用BLENDING / TRANSLUCENCY不起作用。 因此,渲染此图像必须完全在GL中完成。 这必须是实时完成的,因此色彩空间转换必须非常快。 使用Android位图的软件转换可能会太慢。 作为侧面function,必须可以从Android代码访问摄像机图像,以执行除在屏幕上绘制之外的其他任务,例如通过JNI将其发送到本机image processing器。 问题是,如何正确地尽快完成这项任务?

Android流畅的游戏循环

我在OpenGL中平滑滚动有问题(在SGS2和ACE上测试) 我创建了简单的应用程序 – 只有固定速度的水平滚动图像,或者只有一个图像(播放器)通过加速器移动,但它的运动并不平滑:-( 我尝试了很多代码,但没有满意…… 首先我尝试使用GLSurfaceView.RENDERMODE_CONTINUOUSLY并将所有代码放到onDrawFrame: public void onDrawFrame(GL10 gl) { updateGame(gl, 0.017f); drawGame(gl); } 这是最简单绝对的顺畅! – 但它取决于硬件速度(=无用) public void onDrawFrame(GL10 gl) { frameTime = SystemClock.elapsedRealtime(); elapsedTime = (frameTime – lastTime) / 1000; updateGame(gl, elapsedTime); drawGame(gl); lastTime = frameTime; } 这是最好的,但它不像以前那样流畅,有时是轻弹 第二次我尝试了GLSurfaceView.RENDERMODE_WHEN_DIRTY ,在onDrawFrame中我只有绘图对象和这个代码在单独的线程中: while (true) { updateGame(renderer, 0.017f); mGLSurfaceView.requestRender(); next_game_tick += SKIP_TICKS; sleep_time = next_game_tick […]

适当的矩阵乘法用于旋转/平移

为了旋转/平移物体(仅绕z轴旋转和仅在xy平面上平移)不仅仅是wrt到全局中心(设备中心)而且还有其他任意点,我创建了一个算法,这是正确的(因为所有高级我已经讨论过的编码器认为它是正确的), 但是在实现中删除不需要的翻译需要花费很多时间(算法是在8月4日创建的,并且是在同一天实现的,从那以后代码被修改了15次)。 这是http://www.pixdip.com/opengles/transform.php#ALGO1的实现 产生不希望的翻译的代码行在里面: private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) { 并列出如下: Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0); objX = GLES20Renderer._uBodyCentreMatrix[0]; objY = GLES20Renderer._uBodyCentreMatrix[1]; 即使进行了以下更改,沿着+ Y的不希望的转换仍然存在: objY = _uBodyCentreMatrix[1] – _uBodyCentre[1]; zAngle = 0; ds = 0; 每次调用onDrawFrame() ,值-0.545867f都会添加到Y坐标,因为Renderer类的这些字段: private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f}; […]