如何阅读着色器的汇编代码(一)

译文正文

当我开始图像编程时,像 HLSL 和 GLSL 这样的着色语言在游戏开发中还不流行,着色器是用汇编直接开发出来的。 当 HLSL 被引入时,我记得我们为了好玩,试图通过手工生成更短、更紧凑的汇编代码来击败编译器,这并不难。 从那时起,着色器编译技术就有了巨大的进步,现在,在大多数情况下,手工生成更好的汇编代码是相当困难的(而且着色器已经变得如此庞大和复杂,无论如何,它不再是划算的了)。

即使现在没有人直接用汇编编写着色器,对于图形程序员来说,能够阅读和理解编译器产生的着色器汇编(ISA)代码仍然是有用的。 首先,它帮助你理解编译器是如何解释高级着色器指令的。 有些指令,如 tan()整数除法 不能直接映射到硬件,可以扩展成许多汇编指令。 其次,它可以帮助理解 GPU 如何工作,如何请求数据,执行分支,写入输出等。 第三,当实际的着色器代码不可用时,它可以帮助调试着色器。 虽然我们通常不再手动调优着色器的汇编代码,但理解它可以帮助我们做出更好的高级着色器编写决策,这可以导致更高性能的汇编代码。 最后,对我个人来说,有时不带抽象层的阅读代码,能对代码的作用有一个清晰的理解,并尽可能直捣黄龙地接近它的本质。

在这篇博文中,我们将讨论一点着色器汇编,并提供一些如何阅读它的指引。 本讨论主要集中在 DirectX 和 HLSL ,类似的想法将适用于其他 API /着色语言。 同样在例子中,我使用的是 AMD 的着色器

猜你喜欢

转载自blog.csdn.net/panda1234lee/article/details/125234607