标签: opengl-es

OpenGL(适用于移动设备)初学者教程

我想成为iPhone,Java ME和Android等手机的OpenGL编程.有没有好的初学者教程开始?

opengl-es

14
推荐指数
1
解决办法
9281
查看次数

如何在Android上正确初始化和终止EGL

虽然有许多关于在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上工作(关于初始化/终止).

"适当"的方式应该提供:

  1. 启动任何使用EGL的第一个组件时的EGL初始化
  2. 完成使用EGL的最后一个组件时的EGL终止
  3. 多线程.不应仅限于来自主应用程序线程的EGL操作限制.

请注意,当没有使用EGL/OpenGL ES的活动实体时,(2)对于最小化应用程序的系统资源使用至关重要.

有任何想法吗?或许我忽略了Android上的EGL?

更新

还有一个有趣的相关问题:

由于每个线程只允许一个活动渲染上下文,因此同一时间只有一个Component可以正常使用主线程中的OpenGL ES.在同一时间运行的主线程中有多个使用OpenGL ES的组件会导致问题,因为最后一个组件调用eglMakeCurrent()会隐藏"替换"所有其他组件的上下文(这实际上将完全打破组件逻辑).

更新2(最终)

据透露(感谢Romain Guy)Android实际上有一个内部解决方案,用于EGL初始化/终止问题,以明确的形式(它违反EGL规范,在Android文档中没有提到)"引用计数"在eglInitialize内部( )eglTerminate().

android opengl-es

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

OpenGL ES 2.0 Shader最佳实践

我一直在寻找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中编写着色器的首选方法是什么?有最佳实践指南吗?有人可以提供一个顶点和片段着色器的例子,它是"怎样做"的光辉榜样?

谢谢.

shader opengl-es glsl

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

glOrthof和glViewPort之间的区别

在OpenGL-ES上,我对设置之间的区别感到困惑

glOrthof()  
glViewPort()
GLU.gluOrtho2D()
Run Code Online (Sandbox Code Playgroud)

用它的各自参数.因为我相信所有设置的部分你可以看到指定的坐标(宽度,高度).我应该使用哪个?

android 2d opengl-es orthographic

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

如何使用Android摄像头与OpenGL ES工作?

我想使用OpenGL ES进行Android相机预览并保存捕获的图像.

我喜欢在Android相机中使用OpenGL ES来为Android相机提供一些效果.所以请有人告诉我该怎么做?

shader android opengl-es android-camera opengl-es-2.0

14
推荐指数
1
解决办法
5016
查看次数

OpenGL vs Cocos2d:选择什么?

我知道cocos2d它是非常简单的API,我可以使用它来做简单而巨大的2D甚至有时3D游戏/应用程序.我也明白OpenGL它更复杂,它是更低级别的API等.

问题:
实施2D/3D游戏有什么好处?
如果我们有像cocos2d这样的简单框架,为什么我们需要学习OpenGL?
您可以使用cocos2d无法使用OpenGL做什么?

提前致谢!

xcode opengl-es cocos2d-iphone ios

14
推荐指数
2
解决办法
8675
查看次数

为什么UIScrollView会暂停我的CADisplayLink?

我有一个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.那是错的吗?

opengl-es uikit ios cadisplaylink caeagllayer

14
推荐指数
1
解决办法
2543
查看次数

处理Android的纹理大小限制

我需要在Android应用上显示一些大图像.现在我正在使用带有源位图的ImageView.据我所知,openGL对图像尺寸的大小有一定的设备无关限制,以便处理它.

是否有任何显示这些图像的方式(具有固定宽度,而不会裁剪)不管此限制,比分割图像分成多个ImageView的元件之外?

谢谢.

更新2013年4月1日 到目前为止仍然没有运气所有建议都是为了降低图像质量.有人建议可以通过使用CPU进行处理而不是使用GPU来绕过此限制(尽管可能需要更多时间来处理).我不明白,是否真的无法在不降低图像质量的情况下显示固定宽度的长图像?我敢打赌,如果有人至少指出我正确的方向,我会喜欢它.

感谢大家.

android opengl-es android-layout android-gui

14
推荐指数
1
解决办法
3885
查看次数

使用MediaCodec记录曲面

因此,在我的应用程序中,我能够使用GPUImage库向来自Camera的视频显示效果(如模糊滤镜,高斯).

基本上,我(库)将来自摄像机的输入,获得真实的原始字节的数据,将其转换为从YUV格式RGBA格式,然后应用上的影响到该图像和显示器SurfaceGLSurfaceView使用OpenGL.最后,对于用户来说,它看起来像是应用了效果的视频.

现在我想Surface使用MediaCodec API 将视频帧记录下来.

但是这个讨论说我们无法将预定义传递SurfaceMediaCodec.

我在bigflake看到了一些他正在Surface使用的样品,MediaCodec.createInputSurface()但对我来说,Surface来自于GLSurfaceView.

那么,我如何录制Surface视频的帧?

我将并行录制音频,使用FFMPEG合并该视频和音频,并作为应用效果的视频呈现给用户.

android ffmpeg opengl-es glsurfaceview mediacodec

14
推荐指数
1
解决办法
5078
查看次数

在swift中缺少GLKMatrix4(和其他类似的)?

我在使用swift创建一个4X4 openGL矩阵时遇到了问题.我导入了以下在Obj-C中使用的以下内容:

import UIKit
import GLKit
import OpenGLES
Run Code Online (Sandbox Code Playgroud)

GLKMatrix4不可用,但我可以访问其他GL数学资源,GLKMathDegreesToRadians()例如.

还有其他人遇到过这个问题吗?

opengl-es swift ios8

14
推荐指数
1
解决办法
893
查看次数