Opengl 如何强制GLSL分支?
我正在做一个片段着色器。它是可行的,但仍需要一些优化 据我所知,GLSL中的大多数案例分支都是扁平化的,因此这两个案例都被执行。我已经消除了大部分if-else条件,但其中有些条件必须保持不变,因为执行这两个分支的成本都很高。我知道,在HLSL中有一个Opengl 如何强制GLSL分支?,opengl,opengl-es,glsl,hlsl,glsles,Opengl,Opengl Es,Glsl,Hlsl,Glsles,我正在做一个片段着色器。它是可行的,但仍需要一些优化 据我所知,GLSL中的大多数案例分支都是扁平化的,因此这两个案例都被执行。我已经消除了大部分if-else条件,但其中有些条件必须保持不变,因为执行这两个分支的成本都很高。我知道,在HLSL中有一个[branch]关键字用于解决此问题。但是如何在GLSL中解决它呢 我的代码如下所示(条件不一致,其结果取决于着色器中的计算): 一个“昂贵的计算”可以修改条件所依赖的变量。可能会执行多个计算 我知道,有一些旧的或移动的GPU-s,它们根本不支持分
[branch]
关键字用于解决此问题。但是如何在GLSL
中解决它呢
我的代码如下所示(条件不一致,其结果取决于着色器中的计算):
一个“昂贵的计算”可以修改条件所依赖的变量。可能会执行多个计算
我知道,有一些旧的或移动的GPU-s,它们根本不支持分支。在这种情况下,与此问题无关GLSL没有强制分支(或强制展平分支)的机制。您已经排除了针对您的案例的大多数简单优化技术。我认为你必须彻底反思,这将是一件棘手的事情。显示您正在进行哪种昂贵的计算可能会有进一步的帮助。如果我执行诸如光线跟踪或光线跟踪之类的操作,我无法避免分支现代GPGPU的工作方式要求它们按顺序执行给定if语句的所有分支(可能同时导致一组内核空闲)。不幸的是,这是一个无法消除的限制。正如@codetiger正确地指出的,这里可能没有简单的解决方案,但您应该尝试找到一个(或近似值)。。。其他计算…,计算是否也会在执行return语句之后进行?这取决于。核心通常以组的形式组织,这些组共享执行代码,但对不同的数据段应用它们的操作。因此,如果只有一个核心需要执行else子句,而所有其他课程都在执行“if”子句,那么所有核心都需要等待,直到一个特定的核心完成。return语句也是如此。因此,分支可以让一些内核闲置,等待其他内核完成。因此,仅仅插入return语句并不能期望加速。从这个意义上讲,GPU的工作方式与CPU完全不同。
if( condition ) {
expensive calculations...
}
if( condition2 ) {
expensive calculations...
}
if( condition3 ) {
expensive calculations...
}
...