标签: opengl-es

在iPhone上拖动UIScrollView时,OpenGL ES视图中的动画会冻结

我有一个动画透明的OpenGL ES子视图(Apple的模板EAGLView类的修改),它绘制一个旋转的球体.就像Apple的例子一样,CADisplayLink用在可用的设备上.

在同一屏幕上,有一个UIScrollView包含可以选择的UIButtons.当用户滚动UIScrollView时,我的EAGLView的动画会冻结.此行为在iPhone 2G设备上的iOS模拟器4.2和iPhone OS 3.1.3上重现.

除了编写自己的滚动视图之外,还有任何关于如何防止EAGLView暂停的想法?

iphone opengl-es uiscrollview uikit

22
推荐指数
1
解决办法
9455
查看次数

使用OpenGL-ES绘制线条的最简单方法是什么(android)

如果我在opengl-es中准备了自定义渲染器:

public void onDrawFrame(GL10 gl)
{
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    // here i want to draw line from [0, 0, 0] to [1, 0, 0]
}
Run Code Online (Sandbox Code Playgroud)

绘制线条最简单,最简单的方法是什么?

在普通的OpenGL中它是:

glBegin(GL_LINES);
    glVertex3f(0, 0, 0);
    glVertex3f(1, 0, 0);
glEnd();
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用OpenGL ES获得同样的效果呢?

android opengl-es

22
推荐指数
2
解决办法
3万
查看次数

SurfaceTexture的onFrameAvailable()方法总是被调用太晚了

我正在尝试使用以下MediaExtractor示例:

http://bigflake.com/mediacodec/ - ExtractMpegFramesTest.java(需要4.1,API 16)

我遇到的问题是outputSurface.awaitNewImage(); 似乎总是抛出RuntimeException("frame wait timed out"),每当mFrameSyncObject.wait(TIMEOUT_MS)调用超时时抛出它.无论我设置什么TIMEOUT_MS,onFrameAvailable()总是在超时发生后立即调用.我尝试了50毫秒和30000毫秒,它是相同的.

似乎onFrameAvailable()在线程繁忙时无法进行调用,并且一旦超时发生并结束线程代码执行,它就可以解析onFrameAvailable()调用.

有没有人设法让这个例子工作,或者知道MediaExtractor应该如何使用GL纹理?

编辑:在使用API​​ 4.4和4.1.1的设备上尝试了这一点,两者都发生了同样的情况.

编辑2:

得益于fadden 4.4.问题是ExtractMpegFramesWrapper.runTest()调用的方法th.join();阻塞了主线程并阻止了onFrameAvailable()调用的处理.一旦我评论th.join();它就适用于4.4.我想也许ExtractMpegFramesWrapper.runTest()本身应该在另一个线程上运行,所以主线程没有被阻止.

4.1.2调用时还有一个小问题codec.configure(),它给出了错误:

A/ACodec(2566): frameworks/av/media/libstagefright/ACodec.cpp:1041 CHECK(def.nBufferSize >= size) failed.
A/libc(2566): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 2625 (CodecLooper)
Run Code Online (Sandbox Code Playgroud)

通过在通话前添加以下内容我解决了这个问题:

format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
Run Code Online (Sandbox Code Playgroud)

然而,我现在在4.1.1(Galaxy S2 GT-I9100)和4.1.2(三星Galaxy Tab GT-P3110)上的问题是它们都始终将info.size设置为0以用于所有帧.这是日志输出:

loop
input buffer not available
no output from decoder available
loop
input …
Run Code Online (Sandbox Code Playgroud)

android opengl-es mediacodec mediaextractor

22
推荐指数
1
解决办法
1万
查看次数

学习OpenGL ES 1.x

什么是加快OpenGL ES 1.x速度的最快方法?

让我们假设我对OpenGL一无所知(这不完全正确,但自从我上次使用OpenGL以来已经有一段时间了).我最感兴趣的是学习这个与iPhone相关的开发,但我也有兴趣了解它在其他平台上是如何工作的.

我找到了OpenGL ES 2.0编程指南这本书,但我担心它可能不是最好的方法,因为它侧重于2.0而不是1.x. 我的理解是2.0不与1.x向后兼容,所以我可能会错过一些重要的概念.

注意:有关学习一般OpenGL的答案,请参阅/sf/ask/4377831/


我找到的一些资源:

iphone 3d opengl-es

21
推荐指数
2
解决办法
9825
查看次数

防止onPause破坏OpenGL Context

我正在编写一个使用OpenGL ES(GLSurfaceView和GLSurfaceView.Renderer)的Android应用程序.问题是当用户切换应用程序然后切换回我的应用程序时,GLSurfaceView会破坏并重新创建GL上下文.这是根据文档应该做的,但有没有办法防止这种情况发生?

将纹理加载到上下文中需要很长时间,我想防止重新加载它们.

android opengl-es

21
推荐指数
2
解决办法
2万
查看次数

Android openGL ES glDrawArrays还是glDrawElements?

什么是最好的方法?如果我使用drawarrays,或者我使用drawelements?有什么不同的?

android opengl-es

21
推荐指数
2
解决办法
2万
查看次数

OpenGL ES 2.0中的剪切平面

我需要在OpenGL ES 2.0中的剪切平面下剪切几百个对象,并且会欣赏那些对这个OpenGL子集更有经验的人的想法.

在OpenGL ES 1.x中有glClipPlane.在桌面上,您在着色器中有glClipPlane或gl_ClipDistance.这两者都不适用于OpenGL ES 2.0.似乎这种功能完全消失了2.0.

似乎唯一的方法是:A)在片段着色器中运行平面方程,或者B)编写一个非常复杂的顶点着色器,如果它们位于平面后面,则将它们定位在平面上.

(a)与glClipPlane相比会很慢,因为在顶点着色器之后和片段着色器之前进行"常规"剪辑,每个片段仍然必须被部分处理和丢弃.

(B)很难在着色器之间进行兼容,因为我们不能丢弃顶点,我们必须将它们与平面对齐并调整那些"切割"的属性.如果不在纹理中发送所有顶点并对其进行采样,则无法在着色器中的顶点之间进行插值,这将非常昂贵.通常,无论如何都可能无法正确地插入数据.

我还想过将近平面与剪切平面对齐,这将是一种有效的解决方案.

在渲染整个场景并检查深度失败后绘制平面也不起作用(除非您看起来接近垂直于平面).

对单个对象起作用的是将平面绘制到深度缓冲区,然后使用glDepthFunc(GL_GREATER)渲染对象,但正如预期的那样,当其中一个对象位于另一个对象后面时,它不起作用.我试图建立在这个概念的基础上,但最终得到了与阴影卷非常相似的东西,同样昂贵.

那我错过了什么?你会如何在OpenGL ES 2.0中进行平面剪裁?

opengl-es clipping opengl-es-2.0

21
推荐指数
3
解决办法
1万
查看次数

Android游戏:Canvas还是OpenGL?

我要为Android编写游戏,我必须在Canvas或OpenGL之间进行选择以进行绘制.我已经读过Canvas没有很好的帧速率,但有什么好处?想象一下,你打算写一个愤怒的小鸟类游戏,Canvas帧速率是否足够?

android frame-rate canvas opengl-es

21
推荐指数
2
解决办法
2万
查看次数

GL_ARRAY_BUFFER目标在glBindBuffer中的含义是什么?

我对VBO很困惑,

glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
Run Code Online (Sandbox Code Playgroud)

除了GL_ARRAY_BUFFER,还有其他目标类型:GL_ATOMIC_COUNTER_BUFFER,GL_COPY_READ_BUFFER ......

但是,Opengl手册没有提到这些目标的含义.我检查了glew.h:

#define GL_ARRAY_BUFFER 0x8892
Run Code Online (Sandbox Code Playgroud)

这是否意味着目标(如GL_ARRAY_BUFFER)是地址?

目标 - GL_ARRAY_BUFFER在glBindBuffer中的含义是什么?

opengl graphics shader opengl-es glsl

21
推荐指数
1
解决办法
2万
查看次数

使用片段着色器在2d多边形上绘制边框

我有一些简单的多边形(少于20个顶点)在一个简单的xy平面上渲染平面,使用GL_TRIANGLES和一个平面颜色,一个2d模拟.

我想为这些多边形添加可变厚度和不同颜色的边框.我有一些使用相同顶点和glLineWidth/GL_LINE_LOOP实现的东西,它起作用,但是是另一个渲染过程并重复所有顶点变换.

我想我应该能够使用gl_FragCoord和顶点数据和/或纹理坐标在片段着色器中完成此操作,但我不确定,我的天真尝试显然是不正确的.

我想象下面的东西.

uniform vec2 scale;  // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;

varying vec4 vertex; // in world coords

void main()
{
    if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
    {
        // we're close to the edge the polygon, so we're the border.
        gl_FragColor = border_color;
    }
    else
    {
        gl_FragColor = fill_color;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的部分是distance_from_edge函数 - 如何计算?使用gl_FragCoord是错误的方法 - 我应该使用某种纹理映射吗?

作为一个实验,我尝试用缩放将顶点转换为像素空间,然后以像素为单位计算它与gl_FragCoord之间的距离,但这会产生我并不真正理解的奇怪结果.另外我需要到边缘的距离,而不是顶点,但我不知道如何得到它.

有任何想法吗?

编辑:根据尼科尔的回应,我的问题变成:

假设我有一个三角形,其中3个角顶点标记为边缘顶点,并且中间的一个顶点标记为非边缘(因此总共渲染了3个三角形),那么如何在片段着色器中插值以绘制给定边框厚度?我假设我将边缘标志传递给片段着色器,以及所需的线条粗细,并进行一些插值计算以计算边缘与非边缘顶点之间的距离,并将颜色阈值设置为适当的边界/填充?

opengl-es glsl vertex-shader fragment-shader opengl-es-2.0

21
推荐指数
1
解决办法
2万
查看次数