Articles of opengl es 2.0

在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}; […]

丢弃对OpenGL中的程序性能有害吗?

我正在读这篇文章,作者写道: 以下是通过两个简单步骤在每个平台上编写高性能应用程序的方法: […] 遵循最佳做法。 在Android和OpenGL的情况下,这包括“批量绘制调用”,“不在片段着色器中使用丢弃”等内容。 我从来没有听说丢弃会对性能等产生不良影响,并且在没有必要使用详细的alpha时一直使用它来避免混合。 有人可以解释为什么以及何时使用丢弃可能被认为是一种不好的做法,以及discard + depthtest与alpha + blend相比如何? 编辑:在收到关于这个问题的答案后,我做了一些测试,通过渲染背景渐变和顶部的纹理四边形。 使用GL_DEPTH_TEST和以“ if( gl_FragColor.a < 0.5 ){ discard; } ”为结尾的片段着色器给出了大约32 fps 。 从片段着色器中删除if / discard语句会将渲染速度提高到大约44 fps 。 使用GL_BLEND和混合函数“(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)”而不是GL_DEPTH_TEST也导致大约44 fps 。

Android OpenGL ES 2.0屏幕坐标为世界坐标

我正在构建一个使用OpenGL ES 2.0的Android应用程序,而且我遇到了问题。 我正在尝试将屏幕坐标(用户触摸的位置)转换为世界坐标。 我已经尝试过阅读和玩弄GLU.gluUnProject,但我做错了或者只是不理解它。 这是我的尝试…… public void getWorldFromScreen(float x, float y) { int viewport[] = { 0, 0, width , height}; float startY = ((float) (height) – y); float[] near = { 0.0f, 0.0f, 0.0f, 0.0f }; float[] far = { 0.0f, 0.0f, 0.0f, 0.0f }; float[] mv = new float[16]; Matrix.multiplyMM(mv, 0, mViewMatrix, […]

如何学习和使用OpenGL ES 2.0? 我只是不明白 – 严肃的Qn。

这是一个严肃的问题,我在理解它与完全没有之间“陷入困境”。 我对阅读不同资源的时间非常困惑,并希望有人指出我正确的方向。 我正在使用Android平台,直到现在我已经使用了Canvas ,一些OpenGL ES 1.0 ,但主要是通过引擎或已经构建的代码来尝试和理解它。 我的目标是实际了解OpenGL ES 2.0 。 我不想直接去复杂的东西,从简单的东西开始,但我只是不知道怎么做。 我可以得到一个正方形,我可以设置相机和矩阵; 告诉你实话我真的不了解整个矩阵系统及其工作原理,如果我是对的,它是一个固定function管道 ,你不需要在OpenGL ES 1.0进行更改,但现在它是可编程的 –你必须自己设置的管道 。 我不知道如何使用坐标系,我知道原点是设备的中心,每次转向边缘都是1,所以从中心到左边它将是负1。 然而,有一些方法可以将它变成一个不同的坐标系,也许只是使用比例或乘法矩阵来将协调设置为我从Canvas习惯的东西。 基本上我需要帮助的是如何从这里进步? 我觉得好像到了某个地方,但我仍然无处可去。 我真的需要一些关于如何正确使用OpenGL ES 2.0 ,现在我正在计划的是一个简单的2D游戏,也许是侧滚动,所以我将不得不弄乱相机矩阵。 感谢您的时间,我将非常感谢您的帮助。 *我对变换矩阵不太感兴趣,因为我不认为2D游戏真的会使用它,也许只有当我镜像角色的精灵所以它看起来好像是在朝着不同的方向行走时,我很确定通过改变协调和宽度可以使这变得简单。