我刚看了Siggraph 2012的一篇非常令人印象深刻的演讲:
http://nvidia.fullviewmedia.com/siggraph2012/ondemand/SS106.html
我的问题是,这是一个专有的Nvidia扩展,在GPU上快速渲染Bezier路径的其他可能性是什么?或者,作为OpenGL标准的一部分,是否有任何希望最终?是否可以给出任何时间估计最终何时发生?
您是否了解处理GPU路径渲染的任何其他(最好是开源)项目?
编辑:现在原始论文有一个新的“附件”:
https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/nvpr_annex.pdf
答案 0 :(得分:16)
NanoVG (https://github.com/memononen/nanovg)似乎有一点牵引力(http://www.reddit.com/r/opengl/comments/28z6rf/whats_a_popular_vector_c_library_for_opengl/)。所以你可以看看它们的实现。我自己没有使用过NanoVG,而且我对它的内部结构几乎不熟悉;我所知道的是,他们特别拒绝使用NV_path_rendering
:https://github.com/memononen/nanovg/issues/25
正如我在上面的评论中已经提到的,NV_path_rendering现在已经在Skia中实现,并且似乎也被cairo追捧,请参阅下面的评论tjklemz以上关于这些细节的链接的回答。 NV_path_rendering的一个问题是它在某种程度上依赖于固定功能管道,所以有点与OpenGL ES 2.0不兼容。但是有https://code.google.com/p/chromium/issues/detail?id=344330
的解决方法我会远离任何与OpenVG相关的东西。致力于此的委员会已于2011年完成;它现在基本上是一个遗留产品/ API。 OpenVG的大多数实现(包括ShivaVG)也很古老,根据https://github.com/memononen/nanovg/issues/113使用固定功能的OpenGL如果你真的必须使用类似OpenVG的库,那么 MonkVG 似乎维护得最好[读取] as:最近被遗弃的免费之一(代码:https://github.com/micahpearlman/MonkVG; 2010年宣布http://www.khronos.org/message_boards/showthread.php/6776-MonkVG-an-OpenSource-implementation-available)。他们声称它可以通过OpenGL ES 1.1和2.0在Windows,MacOS X,iOS和Android上运行。 [相当大的]警告是MonkVG不是OpenVG的完整实现;看到" TODO"在他们的代码页上找到了缺失的部分。
我还发现一个开罗(& pango)开发者Behdad Esfahbod编写了一个新的字形(即字体)渲染库(https://code.google.com/p/glyphy/):" GLyphy 是使用OpenGL ES2着色语言的带符号距离场(SDF)文本渲染器。 [...] GLyphy [...]使用提交给GPU的实际向量表示SDF。这导致非常高质量的渲染。"据我所知,它尚未在开罗使用过。 (Behdad搬到谷歌[来自Red Hat]并且cairo在相当长的一段时间内没有看到发布,所以也许GLyphy会进入Skia,而不知道......)我不确定这是多么普遍解决方案是任意路径。 (另一方面,NV_path_rendering也可以渲染字体和字距,以防你不知道。)Linux.conf.au 2014上有一个演讲,如果你有兴趣的话你一定要看在GLyphy中:https://www.youtube.com/watch?v=KdNxR5V7prk如果您不熟悉(原始)SDF方法,请参阅http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf
我找到了一个Mozilla开发者的演讲,总结了今天使用的常用方法:https://www.youtube.com/watch?v=LZis03DXWjE#t=828(时间戳是跳过介绍部分,他告诉你GPU是什么。)
顺便说一下,很多路径渲染的东西都是命令/状态变化密集型的。我认为Mantle,DX12和OpenGL等价物(主要是扩展http://gdcvault.com/play/1020791/)可能会有所改善。
我想我还应该提一下,Nvidia已获得(至少)四项与NV_path_rendering相关的专利:
请注意,有超过17个USPTO docummets与这些相关联,因为"也发布为",其中大多数是专利申请,因此完全有可能从这些专利授予更多专利。对此进行更新:Google并未将所有链接在一起,因此还有一些已被授予肯定:
我不确定他们愿意以什么条款许可这些......
我找到了Kilgard自己的一个非常好的常见问题解答"关于矢量图形/路径渲染的特别之处"不幸的是,它被埋在OpenGL论坛的某个地方http://www.opengl.org/discussion_boards/showthread.php/175260-GPU-accelerated-path-rendering?p=1225200&viewfull=1#post1225200。对于任何考虑快速/黑客替代解决方案的人来说,这是非常有用的阅读。
Direct3D 11.1中还有一个新功能可能是有用的,因为微软在Windows 8中使用它来改进它的Direct2D实现;它被称为目标独立光栅化(TIR)。除了微软有专利申请之外,我不太了解它。 http://www.google.com/patents/US20120086715问题是,只有AMD GPU似乎实际上支持它#34;语言战争" http://www.hardwarecanucks.com/news/war-of-words-between-nvidia-and-amd-over-directx-11-1-support-continues/
关于NVpr什么时候被非Nvidia采用,我没有水晶球,但我认为他们正在努力推进它。 OpenGL 4.5 Nvidia presentation几乎被接管了 - 至少就演示而言,我认为这有点愚蠢(因为它不是OpenGL 4.5核心的一部分)。 Neil Trevett还多次报道NVpr(例如https://www.youtube.com/watch?v=eTdLwfOLoG0#t=2095)和Adobe Illustrator beta 2014 is using it以及Google的Skia。
答案 1 :(得分:4)
ShivaVG是路径渲染的开源替代方案。有关OpenVG实现的列表,请参阅此Stack Overflow问题:Best OpenVG Implemenatation
基本上,你有几个选择:使用 OpenVG 实现(比如 ShivaVG ),使用OpenGL实现或扩展(比如 NV_path_rendering ),或完全使用其他内容,例如 Direct2D 。
然而,NV_path_rendering的其他替代方法甚至无法接近其功能集及其渲染质量。 NV_path_rendering可以原生地处理字体(这是一个大交易 - 没有字体,你是吐司),缩放等等在真实的角度来看(在Illustrator中尝试!),与3D混合,使用sRGB ,使用片段着色器,并以非常快的速度完成所有这些。它还实现了用户交互,OpenVG没有指定AFAIK。
独特的是,NV_path_rendering 不发明了一个新标准。相反,它实现了几个行业标准,例如 PostScript 和 SVG ,重点关注质量和速度(很难同时拥有它们),这些标准目前无法在其他任何地方找到
(另外,Mark Kilgard是项目负责人。来吧。这家伙很棒。)
它会成为标准吗?很难知道。至于使用什么,这实际上取决于你的目的/需要。寻找应用程序的质量路径渲染? NV_path_rendering肯定。寻找应用程序中的基本分辨率独立图形(尤其是移动设备)? OpenVG可能会更好。 Nvidia的解决方案不是完全可移植的,这太糟糕了,但我不会羞于使用它。我更喜欢有一个高质量的解决方案;有时可移植性不是一切。
Nvidia将他们的解决方案与OpenVG进行了比较,发现不幸的是,OpenVG并没有提供太多的好处。所以,是的,它可能有希望成为一个标准。但是,既然根据IBM未来的所有内容都将被嵌入,也许最好希望它是开放的,而不是想要更多的标准。
“关于标准的好处是你有很多可供选择。” - Computer Networks,2nd ed。,p。 254
有关 NV_path_rendering功能的详情,建议您查看以下内容:An Introduction to NV_path_rendering。
答案 2 :(得分:0)
在GPU上快速渲染Bezier路径的其他可能性是什么?
使用镶嵌和/或几何着色器通过三角形船体将一组控制点原位镶嵌成凸形补片。然后将曲率参数传递给片段着色器,如果片段在每个片段的边界内,则执行每片段测试,否则丢弃它。
如果按顺序进行近似,则只需按顺序镶嵌成三角形网格。