我有一个动画透明的OpenGL ES子视图(Apple的模板EAGLView类的修改),它绘制一个旋转的球体.就像Apple的例子一样,CADisplayLink用在可用的设备上.
在同一屏幕上,有一个UIScrollView包含可以选择的UIButtons.当用户滚动UIScrollView时,我的EAGLView的动画会冻结.此行为在iPhone 2G设备上的iOS模拟器4.2和iPhone OS 3.1.3上重现.
除了编写自己的滚动视图之外,还有任何关于如何防止EAGLView暂停的想法?
如果我在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获得同样的效果呢?
我正在尝试使用以下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) 什么是加快OpenGL ES 1.x速度的最快方法?
让我们假设我对OpenGL一无所知(这不完全正确,但自从我上次使用OpenGL以来已经有一段时间了).我最感兴趣的是学习这个与iPhone相关的开发,但我也有兴趣了解它在其他平台上是如何工作的.
我找到了OpenGL ES 2.0编程指南这本书,但我担心它可能不是最好的方法,因为它侧重于2.0而不是1.x. 我的理解是2.0不与1.x向后兼容,所以我可能会错过一些重要的概念.
注意:有关学习一般OpenGL的答案,请参阅/sf/ask/4377831/
我找到的一些资源:
我正在编写一个使用OpenGL ES(GLSurfaceView和GLSurfaceView.Renderer)的Android应用程序.问题是当用户切换应用程序然后切换回我的应用程序时,GLSurfaceView会破坏并重新创建GL上下文.这是根据文档应该做的,但有没有办法防止这种情况发生?
将纹理加载到上下文中需要很长时间,我想防止重新加载它们.
什么是最好的方法?如果我使用drawarrays,或者我使用drawelements?有什么不同的?
我需要在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中进行平面剪裁?
我要为Android编写游戏,我必须在Canvas或OpenGL之间进行选择以进行绘制.我已经读过Canvas没有很好的帧速率,但有什么好处?想象一下,你打算写一个愤怒的小鸟类游戏,Canvas帧速率是否足够?
我对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中的含义是什么?
我有一些简单的多边形(少于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 ×10
android ×5
glsl ×2
iphone ×2
3d ×1
canvas ×1
clipping ×1
frame-rate ×1
graphics ×1
mediacodec ×1
opengl ×1
shader ×1
uikit ×1
uiscrollview ×1