Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在iPhone上使用汇编手动编码着色器而不是使用GLSL?_Iphone_Glsl_Shader - Fatal编程技术网

有没有办法在iPhone上使用汇编手动编码着色器而不是使用GLSL?

有没有办法在iPhone上使用汇编手动编码着色器而不是使用GLSL?,iphone,glsl,shader,Iphone,Glsl,Shader,我想使用手工编码的汇编语言顶点和片段着色器,以便在使用OpenGL ES 2.0的iPhone上编程非常优化的着色器 我在谷歌上搜索了一下,但我找不到一个例子,甚至找不到苹果sdk是否允许的例子 我想使用手工编码的汇编语言顶点和片段着色器,以便在使用opengl es 2.0的iphone上编程非常优化的着色器 为什么??你不相信编译器能完成它的工作?你真的认为你对所讨论的GPU有足够的了解,能够始终如一地击败编译器吗 无论如何,你不能。在桌面OpenGL中也无法实现这一点。ARB程序集着色器与

我想使用手工编码的汇编语言顶点和片段着色器,以便在使用OpenGL ES 2.0的iPhone上编程非常优化的着色器

我在谷歌上搜索了一下,但我找不到一个例子,甚至找不到苹果sdk是否允许的例子

我想使用手工编码的汇编语言顶点和片段着色器,以便在使用opengl es 2.0的iphone上编程非常优化的着色器

为什么??你不相信编译器能完成它的工作?你真的认为你对所讨论的GPU有足够的了解,能够始终如一地击败编译器吗

无论如何,你不能。在桌面OpenGL中也无法实现这一点。ARB程序集着色器与硬件的距离并不比GLSL近多少;它们都通过内部编译器进行编译和优化


最终,你只需要相信GPU的开发者所开发的编译器。现在没有其他人对此有问题。

我非常理解您的观点:您希望看到生成的程序集源代码,并可能对其进行修改

事实上,与HLSL编译器相比,GLSL编译器并没有得到优化。为了说服自己,只需比较在ShaderAnalyzer中为GLSL和HLSL中的同一着色器生成的程序集;您将立即看到,它们根本没有给出相同的优化

即使对于一些琐碎的优化,比如分解if()条件,大多数GLSL编译器也不做这项工作


我真的很想看到苹果编译器生成的ASM(特别是对于iOS平台)。如果您知道获取程序集的方法,我对该过程非常感兴趣。

在iPhone上,无法手动调整着色器。值得注意的是,特别是在iPhone上,没有编译器无法完成的优化。这就是说,GLSL编译器可能会击败或匹配您的手动调整程序集

然而,在PC机上,我个人并不相信驱动程序知道循环着色器应该使用更少的寄存器和更多的指令,以便通过更高的占用率实现更大的吞吐量。驱动程序根本没有足够的上下文来始终做出正确的选择。特定于数据的编译时优化就是这个问题的一个很好的例子

作为一个实际查看了GLSL编译器的汇编输出并试图玩编译器的寄存器分配策略的人,我可以告诉你,没有汇编访问绝对会影响性能(在PC上,NVidia和AMD提供了一些公开的工具,允许你这样做)。使用assembly的权衡是,每个着色器都需要针对每个受支持的零件进行手动调整,以实现尽可能高的性能。虽然这有点极端,但如果我想投入自己的时间为我的产品支持的每个视频卡微调渲染后端,那么我应该能够做到。一个更实际的例子是手动调整低端视频卡,但让GLSL编译器在更多高端视频卡上完成它的工作

此外,脱机编译器提供了一种安全机制。如今,许多视频游戏都依赖于驱动程序来模拟现代图形API中的许多可用功能。作为一个游戏开发者,在PC机的GAME-AS-A服务空间中工作,我可以告诉你,在一个新发布的图形驱动程序中,由于一个小的GLSL错误,在半夜接到一个电话是非常令人不安的。驱动程序错误严重影响玩家的整体体验。大多数玩家只是认为你的游戏被破坏了,结果你可能会失去玩家(我们可能已经失去了)。在这方面,能够为每个支持的视频卡编译一次并在事后手动调谐将是一个巨大的胜利。这仅仅意味着司机将不得不做更少的工作。代码是邪恶的,所以执行的代码越少越好=)

作为旁注,我使用“编译”-“查看程序集”-“修改”-“重复”方法进行了以下演示:。我可以百分之百肯定地告诉你,我可以用汇编语言进一步改进这种光线跟踪器的性能,而且AFAIK,它是最快的体素光线跟踪器,它的存在已经发布(截至2012年3月,情况就是这样,但可能不再如此)。毫不奇怪,每次新的驱动程序出现时,我都会看到这个演示的性能从125-130 fps下降到30 fps——这一切都是因为驱动程序不知道如何正确优化我的着色器。这意味着每次有新的驱动程序出现时,我都必须重复我的优化过程,这导致我只是将项目封存(确认!)。尽管我的体素光线跟踪器可以以高性能的方式支持多种硬件,但驱动程序目前无法在完整的产品中支持这项技术。我根本没有能力将这项技术付诸实施,因为这需要驱动程序供应商知道优化我的着色器的方法。如果我们能够直接访问组件着色器,那么还有多少其他技术是可能的?这意味着缺少程序集访问实际上是一项严重的成本。对于其他处于这种地位的人,我建议如下:在可能的情况下使用NVidia的汇编语言,在不可能的情况下使用GLSL。如果我们展示了汇编相对于GLSL的优势,那么我们很有希望从所有供应商那里获得一流的汇编支持=)

最后,我不想挑其他作者的毛病,但我想指出,尼科尔·博拉斯的观点几乎完全是错误的(对不起,尼科尔,我对你没有任何异议,但我想指出一些流行的观点,它们根本经不起道德测试)。请注意,一个谬误的论点并不意味着一个特定的结论是错误的——只是假定的论点只是谬误的

“为什么?你不信任编译器来完成它的工作?你真的认为你可以吗?”