我正在写一个实现开放式VG和OpenGL的| ES中去,这两者取决于Khronos的EGL API,据说是为了便于携带,我猜.
出于乐趣和教育原因,我正在OpenGL ES上编写一个OpenVG实现 - 我没有做过很多渲染工作,我想了解更多有关开放API和实践明确标准的实践(更容易看看我是否得到了正确的结果).
据我了解,EGL提供了一个标准API,用于检索绘图上下文(或者它正确调用的内容),而不是使用多个OS提供的API之一(GLX,WGL等)
我很难相信Khronos会经历这样的努力并将标准OpenGL从循环中移开但事实是,我还没有发现OpenGL(真正的交易)如何或者是否与EGL接口或者它是否只是OpenGL ES.如果OpenGL ES可以使用EGL的绘图上下文,标准OpenGL是否也可以使用?
我对这一切都很陌生,这就是为什么我很兴奋,但我正在做的真正项目是一个Go小部件工具包,它利用OpenVG进行绘图操作,并尽可能使用硬件加速.
如果OpenVG,OpenGL和OpenGL ES依赖于EGL,我认为我的问题可以用"是"或"否"来回答.请记住,我昨晚首先进入了这个主题.
OpenGL使用或依赖于EGL吗?
关闭主题,但没有EGL标记.应该有吗?
我目前正试图在我的桌面上启动并运行OpenVG.问题出现在这里:我/将要开发一个Windows CE设备的应用程序(带有.NET紧凑框架),它具有硬件加速的OpenGL ES 2.0和OpenVG 1.0.1(基于TI OMAP35x,如果你有兴趣的话) ).该应用程序肯定会使用OpenVG进行绘制,如果OpenVG不提供它们(即模糊),可能会使用OpenGL进行某些效果.
现在我想在没有模拟器的桌面上开发(参见这个问题).所以我想我只是用P/Invoke导入OpenVG,这非常简单,因为OpenVG人员将他们的常量变成了真正的枚举,虽然是一个程序性的C API,但它很好地转换为面向对象的形式(带有Graphics类)用于绘制和路径,绘画,描边和图像对象).我还设法使用不同名称的DLL和入口点.哦,我导入了EGL 1.3,也很容易转换为面向对象的API.
在此之前,它听起来相当不错.我以为我只是使用Khronos的OpenVG参考实现,但速度很慢.真的很慢.你知道,像清除表面以字面上一个第二个!所以我认为,很好,OpenVG是一个标准,我将采取其他一个实现.其中大多数都基于OpenGL,这就是我想要的.或者不是吗?
不,这不对.使用EGL 1.3(随OpenGL ES 2.0的PowerVR Windows Emulation SDK提供)创建OpenGL ES 2.0表面与我尝试的任何OpenVG实现都不兼容.其中一些需要传统的OpenGL(AmanithVG GLE),PowerVR提供的EGL版本不支持OpenVG.大多数实现甚至没有EGL并使用一些奇怪的函数来初始化上下文 - 所有这些都假设已经创建了OpenGL上下文.OpenGL,而不是OpenGL ES.叹.
我能够工作的唯一一个是AmanithVG SRE,它对于软件实现非常快,并且不依赖于OpenGL或EGL.它可以工作,但它对于实时动画来说仍然太慢了.
我无法相信这些事情是如此错误.我真的很想使用WindowsMobile.DirectX.Direct3D,PowerVR为桌面Windows提供仿真层,希望最终的Board支持包能够提供Direct3D作为OpenGL ES包装器,就像它似乎在许多设备.
那么,问题,最后:
是否有适用于OpenGL ES 2.0的Windows桌面系统的OpenVG实现?如果使用PowerVR的OpenGL ES 2.0仿真和提供的EGL 1.3,它可以顺利运行.
或者我应该尝试在桌面上使用传统的OpenGL 2.0实现?但他们通常也不提供EGL.我不想有两个初始化层(EGL和WGL).或者我应该?
注意:这不是.NET问题,因为如果没有.NET,问题就是一样.
我正在开发一个iOS应用程序,需要实时绘制Bézier曲线以响应用户的输入.起初,我决定尝试使用CoreGraphics,它具有出色的矢量绘图API.然而,我很快就发现性能很痛苦,极其缓慢,在我的视网膜iPad上只有一条曲线,帧速率开始严重下降.(不可否认,这是一个代码效率低下的快速测试.例如,曲线每帧都重新绘制.但是今天的计算机确实足够快,每隔1/60秒处理一条简单的曲线,对吧?!)
在这个实验之后,我切换到OpenGL和MonkVG库,我感到非常高兴.我现在可以在没有任何帧速率下降的情况下同时渲染HUNDREDS曲线,对保真度的影响很小(对于我的用例).
更新:
我编写了一个快速测试应用程序来更准确地衡量性能.下面是我的自定义CALayer子类的代码.
将NUM_PATHS设置为5并将NUM_POINTS设置为15(每个路径5个曲线段),代码在非视网膜模式下以20fps运行,在iPad 3上以视网膜模式运行6fps.分析器将CGContextDrawPath列为拥有96%的CPU时间.是的 - 显然,我可以通过限制我的重绘矩形进行优化,但如果我真的需要60fps的全屏矢量动画呢?
OpenGL在早餐时吃这个测试.矢量绘图怎么可能这么慢?
#import "CGTLayer.h"
@implementation CGTLayer
- (id) init
{
self = [super init];
if (self)
{
self.backgroundColor = [[UIColor grayColor] CGColor];
displayLink = [[CADisplayLink displayLinkWithTarget:self selector:@selector(updatePoints:)] retain];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
initialized = false;
previousTime = 0;
frameTimer = 0;
}
return self;
}
- (void) updatePoints:(CADisplayLink*)displayLink
{
for (int i = 0; i < NUM_PATHS; i++)
{
for (int j = 0; j < NUM_POINTS; …
Run Code Online (Sandbox Code Playgroud) 我认为这应该很容易,但是...... geesh!供应商给了我一个相当简单的演示程序,旨在展示一些琐碎的图标动画.目标平台是嵌入式系统(MX51),具有加速的OpenGL ES 2.0/OpenVG和EGL支持.
不幸的是,该演示还对一些Qt实用程序类(例如,QImage)具有恼人的依赖性.如果不是这种依赖,我会编译/运行目标上的东西.但我不喜欢交叉编译Qt只是为了运行这个小小的演示 - 即使嵌入式电路板上有足够的空间.
我希望我能够在标准(ish)Ubuntu 10.04 VM上运行应用程序,并开始遵循这些指示来实现它.我实际上管理了 - 比如,10小时后 - 编译所有内容并获得演示程序的可运行二进制文件.但是,当我运行它时,我看到以下错误:
eglCreateWindowSurface: egl error "EGL_BAD_CONFIG" (0x3005)
Run Code Online (Sandbox Code Playgroud)
叹.在我付出努力之后,这不是我想要看到的.这似乎比应该更困难.
嵌入式GL环境真的是如此贫民窟,我必须使用一些供应商提供的BSP在目标上运行甚至是微不足道的程序吗?从对这个家伙的问题缺乏回应来判断,我认为答案可能是肯定的.但我甚至不关心加速度.我只是想在桌面PC上运行最愚蠢的OpenGL ES 2/OpenVG程序,并了解它的外观.(对我而言,PC是运行Linux还是Windows并不重要.)人们如何做这类事情?