我想成为iPhone,Java ME和Android等手机的OpenGL编程.有没有好的初学者教程开始?
虽然有许多关于在Android上使用OpenGL ES的样本,但在EGL的初始化/终止方面,所有这些似乎都是不正确的(甚至是Android SDK/NDK附带的).问题的根源在于Android应用程序模型,它正确地使用了EGL怪异的东西.
在所有Android样本甚至GLSurfaceView(实际上大多数样本只使用它)中,EGL初始化每个操作系统进程的真正问题涉及每个组件(Activity或WallpaperService)的EGL初始化/终止.这是完全错误的,因为所有组件都在同一个进程中运行!如果应用程序只包含一个组件,则没有问题,但如果应用程序中有多个组件且每个组件都使用OpenGL ES,则会出现问题.
只考虑使用OpenGL ES的两个应用程序组件同时运行并且其中一个组件完成的情况.完成这样的组件将调用eglTerminate()(在GLSurfaceView源代码中查看我正在谈论的内容),这将终止整个过程的EGL !从这一刻开始,来自另一个已在运行的组件的任何EGL调用都将失败!
我检查了大量的示例,并且所有示例都初始化并终止每个组件的EGL(实际上没有人看到我做过与GLSurfaceView不同的事情,其中大多数只是GLSurfaceView内部的副本).
而现在我很有兴趣找到一种"正确"的方式来使用EGL在Android上工作(关于初始化/终止).
"适当"的方式应该提供:
请注意,当没有使用EGL/OpenGL ES的活动实体时,(2)对于最小化应用程序的系统资源使用至关重要.
有任何想法吗?或许我忽略了Android上的EGL?
还有一个有趣的相关问题:
由于每个线程只允许一个活动渲染上下文,因此同一时间只有一个Component可以正常使用主线程中的OpenGL ES.在同一时间运行的主线程中有多个使用OpenGL ES的组件会导致问题,因为最后一个组件调用eglMakeCurrent()会隐藏"替换"所有其他组件的上下文(这实际上将完全打破组件逻辑).
据透露(感谢Romain Guy)Android实际上有一个内部解决方案,用于EGL初始化/终止问题,以明确的形式(它违反EGL规范,在Android文档中没有提到)"引用计数"在eglInitialize内部( )和eglTerminate().
我一直在寻找OpenGL着色器的例子,我看到了一些不同的风格.一些着色器专门使用内置类型(即gl_Vertex)与应用程序代码和着色器之间传输数据.
一些着色器使用变化类型将数据从顶点传输到片段着色器而不是gl_Position和gl_FragColor.
一些着色器使用前缀'in'和'out'来指定数据传输:
in vec3 vertex;
void main() {
gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
...而其他人使用属性:
attribute vec4 vertex_attrib;
attribute vec4 tex_coord_attrib;
attribute vec4 color_attrib;
uniform mat4 mvp_matrix;
uniform mat4 texture_matrix;
varying vec4 frag_color;
varying vec2 tex_coord;
void main(void)
{
gl_Position = mvp_matrix * vertex_attrib;
vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib;
tex_coord = transformed_tex_coord.st / transformed_tex_coord.q;
frag_color = color_attrib;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,GLES 2.0中编写着色器的首选方法是什么?有最佳实践指南吗?有人可以提供一个顶点和片段着色器的例子,它是"怎样做"的光辉榜样?
谢谢.
在OpenGL-ES上,我对设置之间的区别感到困惑
glOrthof()
glViewPort()
GLU.gluOrtho2D()
Run Code Online (Sandbox Code Playgroud)
用它的各自参数.因为我相信所有设置的部分你可以看到指定的坐标(宽度,高度).我应该使用哪个?
我想使用OpenGL ES进行Android相机预览并保存捕获的图像.
我喜欢在Android相机中使用OpenGL ES来为Android相机提供一些效果.所以请有人告诉我该怎么做?
我知道cocos2d它是非常简单的API,我可以使用它来做简单而巨大的2D甚至有时3D游戏/应用程序.我也明白OpenGL它更复杂,它是更低级别的API等.
问题:
实施2D/3D游戏有什么好处?
如果我们有像cocos2d这样的简单框架,为什么我们需要学习OpenGL?
您可以使用cocos2d无法使用OpenGL做什么?
提前致谢!
我有一个CAEAGLLayer支持的视图,它位于UIScrollView中.当我开始滚动时,调用openGL视图的-draw方法的CADisplayLink停止被调用.
我确认滚动时不会调用我的runloop启动/停止方法.一旦滚动开始,-draw方法就不会被调用,并且一旦滚动结束就恢复调用.
滚动开始后,UIKit是否会停止触发CADisplayLink?
显示链接被添加到运行循环中,如下所示:
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
也许这个运行循环模式和UIScrollView存在冲突?是否存在其他运行循环模式或替代解决方案,即使在UIScrollView滚动时也能保持CADisplayLink触发?
我认为在任何应用程序中都不只有一个CADisplayLink.那是错的吗?
我需要在Android应用上显示一些大图像.现在我正在使用带有源位图的ImageView.据我所知,openGL对图像尺寸的大小有一定的设备无关限制,以便处理它.
是否有任何显示这些图像的方式(具有固定宽度,而不会裁剪)不管此限制,比分割图像分成多个ImageView的元件之外?
谢谢.
更新2013年4月1日 到目前为止仍然没有运气所有建议都是为了降低图像质量.有人建议可以通过使用CPU进行处理而不是使用GPU来绕过此限制(尽管可能需要更多时间来处理).我不明白,是否真的无法在不降低图像质量的情况下显示固定宽度的长图像?我敢打赌,如果有人至少指出我正确的方向,我会喜欢它.
感谢大家.
因此,在我的应用程序中,我能够使用GPUImage库向来自Camera的视频显示效果(如模糊滤镜,高斯).
基本上,我(库)将来自摄像机的输入,获得真实的原始字节的数据,将其转换为从YUV格式RGBA格式,然后应用上的影响到该图像和显示器Surface的GLSurfaceView使用OpenGL.最后,对于用户来说,它看起来像是应用了效果的视频.
现在我想Surface使用MediaCodec API 将视频帧记录下来.
但是这个讨论说我们无法将预定义传递Surface给MediaCodec.
我在bigflake看到了一些他正在Surface使用的样品,MediaCodec.createInputSurface()但对我来说,Surface来自于GLSurfaceView.
那么,我如何录制Surface视频的帧?
我将并行录制音频,使用FFMPEG合并该视频和音频,并作为应用效果的视频呈现给用户.
我在使用swift创建一个4X4 openGL矩阵时遇到了问题.我导入了以下在Obj-C中使用的以下内容:
import UIKit
import GLKit
import OpenGLES
Run Code Online (Sandbox Code Playgroud)
GLKMatrix4不可用,但我可以访问其他GL数学资源,GLKMathDegreesToRadians()例如.
还有其他人遇到过这个问题吗?
opengl-es ×10
android ×5
ios ×2
shader ×2
2d ×1
android-gui ×1
caeagllayer ×1
ffmpeg ×1
glsl ×1
ios8 ×1
mediacodec ×1
orthographic ×1
swift ×1
uikit ×1
xcode ×1