Articles of opengl es

GLSurfaceView不断呈现,尽pipe改变渲染模式

我正在尝试创build一个显示游戏区域的地图的GLSurfaceView。 当玩家移动时,游戏活动调用highlightSpot,这反过来会触发渲染请求。 我只想重新画一个视图的时候是玩家移动的时候。 但是,在我目前的实现中,尽pipe在我的GLSurfaceView上调用了setRenderMode(RENDERMODE_WHEN_DIRTY) ,但它的渲染模式似乎仍然是连续的。 为了检查,我在我的onDrawFrame方法中抛出了一个println语句,当我运行我的应用程序时,输出很快就填满了我的logcat而没有播放器移动一次 – 显然这不是我想要的。 还有什么我需要做的,以使视图渲染只有当被问及? (这段代码的大部分源自http://insanitydesign.com/wp/projects/nehe-android-ports/上的教程,为了简洁起见,省略了我的onDrawFrame,OnSurfaceChanged和onSurfaceCreated方法,因为我是不改变渲染模式或者在这些方法的任何地方请求渲染,如果有人认为它可能是相关的,我也可以发布。) public class SurfaceViewClass extends GLSurfaceView implements Renderer { public SurfaceViewClass(Context context) { super(context); … this.setRenderer(this); this.setRenderMode(RENDERMODE_WHEN_DIRTY); } public void highlightSpot(int x, int y) { /* change some variables here */ … this.requestRender(); } }

TwoPassFilter GPUImage实际上做了什么?

我正尝试从GPUImage(ios) for Android重新创buildGPUImageTwoPassFilter。 我正在为在这里完成的GPUImage的Android端口工作。 该港口实际上对许多filter很好。 我已经移植了许多着色器,基本排队,取得了巨大的成功。 问题是要移植一些filter,你必须从GPUImage的GPUImageTwoPassFilter扩展,这个android版本的作者还没有实现。 我想刺探一下,但不幸的是,iOS版本没有文档,所以我不太确定TwoPassfilter应该做什么。 有没有人有任何提示去做这个? 我对openGL有一定的了解,但对Android和iOS非常了解。 我肯定在这里寻找一个非常psudocode的说明

在Android上零拷贝相机处理和渲染stream水线

我需要在实时摄像机数据(仅来自Y平面)上执行CPU端只读过程,然后在GPU上进行渲染。 在处理完成之前不应该渲染帧(所以我不总是想渲染摄像机的最新帧,只是CPU端已经完成处理的最新帧)。 渲染与摄像机处理是分离的,即使摄像机帧的速率低于60帧,其目标也是60帧/秒。 有一个相关的,但更高层次的问题在: 最低的开销摄像头CPU到GPU的方法在Android上 要更详细地描述当前的设置:我们有一个应用程序端的缓冲池用于摄像机数据,其中缓冲区是“空闲”,“正在显示”或“正在显示”。 当来自摄像机的新帧到达时,我们抓取一个空闲的缓冲区,在那里存储帧(或者如果实际数据在系统提供的缓冲池中的引用),执行处理并将结果存入缓冲区,然后设置缓冲区“等待显示”。 在渲染器线程中,如果在渲染循环的开始处有任何缓冲区“暂挂显示”,我们将其locking为“正在显示”中的一个,渲染相机,并使用从相同的计算得到的已处理信息渲染其他内容相机框架。 感谢@ fadden对上面提到的问题的回应我现在明白android camera2 API的“并行输出”function可以在各种输出队列之间共享缓冲区,所以不应该涉及数据上的任何副本,至less在现代的android上。 在评论中有一个build议,我可以同时lockingSurfaceTexture和ImageReader输出,只是“坐在缓冲区”,直到处理完成。 不幸的是,我不认为这适用于我的情况,因为我们仍然希望以60 FPS的速度进行分离渲染,并且仍然需要访问前一帧,而新的一个正在处理,以确保事情不会得到不同步。 想到的一个解决scheme是拥有多个SurfaceTextures – 每个应用程序端缓冲区都有一个(我们目前使用3个)。 有了这个scheme,当我们得到一个新的相机帧,我们将从我们的应用程序池获得一个免费的缓冲区。 然后我们调用ImageReader的acquireLatestImage()来获取数据进行处理,并在空闲缓冲区的SurfaceTexture上调用updateTexImage() 。 在呈现的时候,我们只需要确保“显示”缓冲区中的SufaceTexture是绑定到GL的那个,并且大部分时间应该是同步的(@fadden评论说在调用updateTexImage()和acquireLatestImage()但那个时间窗口应该足够小,使得它很less见,也许使用缓冲区中的时间戳是可以解决的。 我在文档中注意到updateTexImage()只能在SurfaceTexture绑定到GL上下文时调用,这意味着我需要在相机处理线程中使用GL上下文,因此相机线程可以在SurfaceTexture上执行updateTexImage()在“空闲”缓冲区中,而渲染线程仍然能够从“显示”缓冲区中的SurfaceTexture渲染。 所以,对于这个问题: 这似乎是一个明智的做法? SurfaceTextures基本上是共享缓冲池的简单包装,还是消耗一些有限的硬件资源,应该谨慎使用? SurfaceTexture的调用是否足够便宜,以至于复制数据仍然是一个巨大的胜利? 是计划有两个不同的GL上下文线程与不同的SurfaceTexture绑定在每个可能的工作,或者我要求一个痛苦和越野车司机的世界? 这听起来很有希望,我会去给它一个去; 但是如果有人(基本上@fadden!)知道我忽视了哪些内部细节,这会让这个主意变得糟糕,那么在这里值得问一下。

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

如果我按下了我的android手机上的电源button(或等待它超时),手机进入hibernate状态,醒来后,屏幕宽高比全是怪事。 截图: 破碎 正确 在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 […]

通过SurfaceTexture在GLSurfaceView上显示相机stream

我试图通过传递给OpenGL ES 2.0着色器的SurfaceTexture在GLSurfaceView中显示相机stream。 我从这篇文章中获得灵感。 图像是完整的,但没有正确显示在我的平板电脑上。 屏幕似乎分成2个部分。 图像显示在左上部分,而其他三个部分是黑色的。 我怀疑这个问题来自于我使用这里logging的顺序返回的变换matrix updateTexImage(); getTransformMatrix(…); 我在顶点着色器中传输这个matrix来生成片段着色器的纹理坐标。 顶点着色器: 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 […]

提高Android上OpenGL ES填充率的技巧

在我的dynamic壁纸,我正在绘制覆盖整个屏幕的3纹理四边形。 在Nexus One上,我得到了40fps。 我正在寻找提高性能的方法。 四边形被混合在一起,纹理从RGB_8888位图加载。 1024×1024是纹理。 我有 glDisable(GL_DITHER); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); glDisable(GL10.GL_LIGHTING); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 我试过的东西都是40fps: 将纹理尺寸减小到512×512和256×256 使用draw_texture扩展 禁用混合 将纹理过滤从GL_LINEAR更改为GL_NEAREST 使用VBOs(绝望的尝试,因为只有三个四边形…) 在独立活动中运行绘图代码(如果某个活动壁纸会影响性能) 如果我画2层而不是3层,fps上升到45左右,然后画1层看到fps上升到55.我想我受限于填充率,因为closures和潜在的昂贵的function导致相同的FPS,而似乎改善FPS的唯一的东西只是画less… 我正在考虑纹理压缩的想法,但支持不同的压缩格式似乎并不好玩。 ETC1没有我需要的alpha通道,我不确定是否PVRTC和ATITC甚至可以从Java和OpenGL ES 1.0或1.1中使用。 我很乐意听到有关其他方面的想法。 如果有用的话,我可以指出当前版本的壁纸和截图。

Android上的OpenGL仅使用C ++

我正在开发Android 2.1的Android应用程序。 我试图用C ++编写OpenGL的东西。 你知道一个教程或一篇文章展示如何做到这一点的例子吗? 更新 : 对不起,我忘了说我将使用Java家庭应用程序来启动主要活动。 我想说如果我必须在Java glSurfaceView代码或此语句必须在C ++代码。 好了,最好解释一下:如果我在C ++上有一个完整的openGl,可能需要修改C ++代码吗? 谢谢。

iOS OpenGl ES和Android OpenGl Es的区别

我想知道在Android的OpenGl ES和iOS的OpenGl ES中有什么区别(如果有的话)

获取OpenGL-ES模板缓冲区工作

在Android的opengl-es模板缓冲区,我只是试图屏蔽画面的一部分。 我想我已经把它设置了正确,但是它并没有掩盖没有被污染的部分。 下面是我正在做的代码的提取。 gl.glEnable(GL10.GL_STENCIL_TEST); gl.glClearStencil(0); gl.glClear(GL10.GL_STENCIL_BUFFER_BIT); gl.glColorMask(false, false, false, false); gl.glDepthMask(false); gl.glStencilFunc(GL10.GL_ALWAYS, 1, 1); gl.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE); drawMask(); //I have confirmed this draws to the correct location by allowing colour to show. Trust that this draws the mask to the correct location. gl.glColorMask(true, true, true, true); gl.glDepthMask(true); gl.glStencilFunc(GL10.GL_EQUAL, 1, 1); gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP); drawItems(); //Draw […]

噪音algorithm在三星Galaxy SIII(GLES)

我正在努力获得在三星Galaxy SIII工作的下一个简单的algorithm float rand(vec2 co) { return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); } …. vec3 color = texture2D(u_texture, v_texcoord); gl_FragColor.rgb = color + vec3(rand(gl_FragCoord.xy + time / 1000.0)); …. 该代码在三星Galaxy S1和谷歌Nexus S完美地产生了预期的噪音。但是在使用ARM的Mali-400 / MP4的新款智能手机中完全失败。 任何人都可以发现这个algorithm有什么问题? 或者也许理解为什么它会失败?