在我看来,我正在绘制一条相当大的路,而且我遇到了一些性能问题。 目前的path是32000点,但我的应用程序应该扩展到至less128000点。 对于path的大小,我无法做任何事情,因为数据集非常大,我需要能够一次显示整个path并允许放大。 我使用的是运行Android 4.2的Nexus 10,默认情况下硬件加速function是针对未明确禁用的应用程序启用的。 path是用下面的代码创build的(我省略了一些设置和其他不相关的部分): dataPath.moveTo(0, offset – (float) data[leftLimit]/ scalingFactor); for (int i = leftLimit; i < rightLimit; ++i) { x = (i – leftLimit) * dx; y = offset – (float) data[i]/ scalingFactor; dataPath.lineTo(x, y); } 然后在onDraw()方法中绘制: canvas.drawColor(Color.WHITE); canvas.drawPath(dataPath, linePaint); 我测量了使用adb shell dumpsys gfxinfo来绘制我的视图所花费的时间,而且没有硬件加速,我惊讶地发现硬件加速比较慢: 随着硬件加速: 没有硬件加速: 硬件加速版本每帧需要大约200-300毫秒,大部分花费在处理阶段。 非加速版本大约需要50 ms,Draw阶段为2/3,处理阶段为1/3。 显然,即使我没有硬件加速的更快的版本仍然太慢,达不到60fps,或者当我移动到更大的数据集时甚至几乎无法使用。 将path渲染为位图,然后仅将该位图转换为适合屏幕的想法在我的情况下也是有问题的。 […]
在learnwebgl tutorial1中,我在片段着色器中发现了一条有趣的线条。 precision mediump float; 我在这里find一篇关于它的文章,但是我还是不明白这是什么意思? 如果我删除这条线,没有任何改变。 一切都是一样的。 那么precision mediump float是什么意思?
我正在为iOS编写一个3D应用程序。 我是OpenGL ES 2.0的新手,所以我仍然围绕着编写基本的着色器。 我真的需要根据纹理对我的一些模型实现“发光”效果。 这是一个示例: 。 我正在寻找OpenGL ES 2.0的代码示例。 我在网上find的大多数代码是桌面OpenGL或D3D。 有任何想法吗?
我一直在我的Android代码中使用FloatBuffers一段时间(从一些opengles教程复制它),但我不能确切地理解这个结构是什么以及为什么需要它。 例如我在很多人的代码和android教程中看到的这个代码(或类似的): float[] vertices = …some array… ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); // use the device hardware's native byte order FloatBuffer fb = vbb.asFloatBuffer(); // create a floating point buffer from the ByteBuffer fb.put(vertices); // add the coordinates to the FloatBuffer fb.position(0); // set the buffer to read the first coordinate 这似乎是非常冗长和杂乱的东西,据我所知只是一个漂浮的花车包装周围的花车。 问题: […]
我正在寻找一些与GLSL合作的工具。 我想在WebGL应用程序中使用着色器进行实验,所以我正在寻找的就像RenderMonkey。 据我所知 – RenderMonkey不再支持,所以必须有一些其他的工具,把它的地方。 如果我能做RM这样的“效果组合”和原始的GLSL代码开发,那么最好的办法是。
我有一个开源的iOS应用程序,它使用自定义的OpenGL ES 2.0着色器来显示分子结构的三维表示。 它通过使用在矩形上绘制的程序生成的球体和圆柱体冒名顶替,而不是使用大量顶点构build的这些相同的形状。 这种方法的缺点是这些冒充者对象的每个片段的深度值需要在片段着色器中计算,以便在对象重叠时使用。 不幸的是,OpenGL ES 2.0 不会让你写入gl_FragDepth ,所以我需要输出这些值到一个自定义的深度纹理。 我使用framebuffer对象(FBO)对场景进行遍历,只渲染与深度值对应的颜色,并将结果存储到纹理中。 然后这个纹理加载到我的渲染过程的后半部分,在那里生成实际的屏幕图像。 如果该阶段的某个片段处于屏幕上该点的深度纹理中存储的深度级别,则会显示该片段。 如果不是,就扔掉。 有关过程的更多信息,包括图表,可以在我的文章中find 。 这种深度纹理的产生是我渲染过程中的一个瓶颈,我正在寻找一种使其更快的方法。 它似乎比应该慢,但我不明白为什么。 为了实现这种深度纹理的正确生成,禁用GL_DEPTH_TEST ,使用glBlendFunc(GL_ONE, GL_ONE)启用glBlendEquation() ,并将glBlendEquation()设置为GL_MIN_EXT 。 我知道以这种方式输出的场景并不是像iOS设备中的PowerVR系列那样基于瓦片的延迟渲染器上最快的,但我想不出一个更好的方法来做到这一点。 我的深度片段着色器(最常见的显示元素)看起来是这个瓶颈的核心(仪器中的渲染器利用率固定在99%,表明我受限于片段处理)。 目前看起来如下所示: precision mediump float; varying mediump vec2 impostorSpaceCoordinate; varying mediump float normalizedDepth; varying mediump float adjustedSphereRadius; const vec3 stepValues = vec3(2.0, 1.0, 0.0); const float scaleDownFactor = 1.0 / 255.0; […]
我正在研究各种游戏框架,并且是OpenGL的新手。 大多数书似乎没有给出一个非常明确的答案这个问题,我想在我的桌面上使用OpenGL开发,但在OpenGL ES 2.0环境中执行代码。 那么我的问题是双重的: 如果我将OpenGL的框架定位在桌面上,它会在OpenGL ES 2.0环境中运行吗? 如果没有,那么是否有一个好的模拟器,PC或Mac; 是否有一个脚本,我可以运行,将我的OpenGL代码转换成OpenGL ES代码,或标记的东西,将无法正常工作?
我正在尝试在linux上使用open gl来编写一个相当简单的程序,但是在编译时它说: 编译thumb:egl <= cuberenderer.c从/path/include/egl.h:36包含的文件中,从/path/cuberenderer.c:7:/path/include/eglplatform.h:89:22:error:X11 /Xlib.h:没有这样的文件或目录/path/include/eglplatform.h:90:23:错误:X11 / Xutil.h:没有这样的文件或目录 我对GL完全陌生,不知道有什么问题。
作为OpenGL ES 1.x的这个页面 ,我在这个页面上收集了Android设备的OpenGL ES 2.x扩展。 列表可以用我的基准工具gpubenchfind 。 这些信息可以帮助许多游戏开发者。 谢谢你的帮助,
我并不完全清楚启用顶点属性数组的范围。 我有几个不同的着色器程序,具有不同数量的顶点属性。 glEnableVertexAttribArray局部调用着色器程序还是全局? 现在我在创build着色器程序时启用了顶点attrib数组,并且从不禁用它们,而且似乎都可以工作,但好像我可能应该在绘制调用之前/之后启用/禁用它们。 这有没有影响? (我正在使用WebGL,所以我们真的在谈论gl.enableVertexAttribArray和gl.disableVertexAttribArray 。我还会注意到,这本橙色的书, OpenGL Shading Language对这些调用没有任何意义。)