我正在尝试在 GLSL 中编写一个光线投射着色器,而且速度慢得令人难以忍受。于是我安装了AMD的“GPU Shader Analyzer”,这样我就可以看看实际生成了什么。我已经将它从 2 FPS 提高到 12 FPS,但这仍然不是很棒。
我觉得我可以改进它,但我被困在三个点上。
奇怪的下划线:我明白了什么
ADD R1.x, R0.x, -C6.x
;从 R0.x 中减去 C6.x,并将其存储在 R1.x 中。ADD R4.x, R1.x, R2.w, R4.x
与;类似 将 R1.x 和 R2.w 相乘,再加上 R4.x,然后存储在 R4.x 中。但有时我会接到类似的电话,但我无法弄清楚下划线的含义。MUL __, PV16.x, C1.x
尾随“E”:通常我的乘法会变成
MUL a, b, c
. 但有时我会看到MUL_e a, b, c
。这也发生在SQRT_e
,RSQ_e
和RCP_e
上。魔术师:我就是不明白这些指示。
LOOP_DX10 i0 FAIL_JUMP_ADDR(10) VALID_PIX
开始循环。但是参数是什么?ALU_BREAK: ADDR(48) CNT(3)
不知道。SETGT_INT R0.y, 350, R3.y
我的 for 循环 i < 350,但其他的是什么?PREDNE_INT __, R0.y, 0.0f
也许将 i 设置为 0?但为什么是浮点 0?ALU_PUSH_BEFORE: ADDR(51) CNT(34)
推让我想到堆栈?PREDGT __, R0.x, R3.x
没有线索。JUMP POP_CNT(1) ADDR(8) VALID_PIX
无条件跳转,但 POP_CNT 是什么?ALU: ADDR(85) CNT(1)
嗖。BREAK ADDR(9)
跳到9?POP (1) ADDR(8)
从堆栈中删除框架?为什么是8?ENDLOOP i0 PASS_JUMP_ADDR(2)
结束从 LOOP_DX10 开始的循环。CNDE_INT R0.x, R2.z, 0.0f, 1065353216
x = q ? a : b,但我不知道哪个变量是哪个。
有人可以解释这些吗?我找不到前两个的任何文档,我不理解最后一个文档。不幸的是,我以前从未做过任何组装。