首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HLSL的流量控制

HLSL的流量控制
EN

Stack Overflow用户
提问于 2019-11-15 21:15:47
回答 1查看 633关注 0票数 1

我最近读到了一篇关于射线云的文章(小心这是一个PDF格式,以防你不想要:http://www.diva-portal.org/smash/get/diva2:1223894/FULLTEXT01.pdf),作者在这里继续优化(第22页)。该算法通过重投影。他说,通过对每帧像素的1/16(选定的像素在4x4网格中跳跃)进行重新投影,他获得了大约10倍的性能提升。

我现在尝试实现这个,以及在虚幻引擎4(自定义HLSL着色器),我得到射线行进以及重新投影现在工作。然而,实际上,我只能在必要的像素上运行光线行进。据我所知,在HLSL中有任何分支,分支的两边都会被计算出来,其中一个会被丢弃。因此,不能在像素着色器中执行类似于伪代码的操作: if(!PixelReprojection) {返回0;} shader{返回雷(.)},因为它将计算雷,即使是被重新投影的像素。

但我看不出有什么其他方法能把这个归档.在HLSL中有什么分支允许这样做吗?它不可能是静态的,因为像素受到射线行进和重新投影改变每一帧。据我所知,我真的很好奇作者是如何在GPU上编写代码的时候,性能提高了十倍的。

我非常感谢这里的任何形式的投入。

你好,美食家

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-16 04:06:38

TLDR:在if语句前面使用[branch]属性。

据我所知,在HLSL中有任何分支,分支的两边都会被计算,其中一个会被丢弃。

这是不完全正确的。是的,分支可以是扁平的,这意味着双方都是按照您描述的那样计算的,但也可以是而不是平坦的(称为动态分支)。

现在,不将分支扁平化有一些缺点:如果同一波中的两个线程在分支中采用不同的路径,则必须生成第二次波,因为一个波中的所有线程都必须运行相同的代码(因此一些线程将被移动到新生成的wave中)。因此,在这种情况下,许多线程被“禁用”(这意味着它们与其wave中的其他线程运行相同的代码,但实际上没有将任何东西写入内存)。尽管如此,这种动态的分支可能仍然比运行分支的两边更快,但这取决于实际的代码。

我们甚至可以通过智能着色器设计来消除这一缺陷(即,确保树枝一侧的线程处于同一波中,因此在波浪中不会发生发散。然而,这需要对底层硬件有一定的了解,比如波形大小等等)

在任何情况下:如果没有其他说明,HLSL编译器将自行决定分支是使用动态分支还是扁平。然而,我们可以通过添加属性对if-语句执行这两种方法之一,例如:

代码语言:javascript
复制
//Enforce dynamic branching:
[branch] 
if (...) { ... }
else { ... }

//Enforce flattening of the branch:
[flatten]
if (...) { ... }
else { ... }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58884776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档