Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Opengl 如何强制GLSL分支?_Opengl_Opengl Es_Glsl_Hlsl_Glsles - Fatal编程技术网

Opengl 如何强制GLSL分支?

Opengl 如何强制GLSL分支?,opengl,opengl-es,glsl,hlsl,glsles,Opengl,Opengl Es,Glsl,Hlsl,Glsles,我正在做一个片段着色器。它是可行的,但仍需要一些优化 据我所知,GLSL中的大多数案例分支都是扁平化的,因此这两个案例都被执行。我已经消除了大部分if-else条件,但其中有些条件必须保持不变,因为执行这两个分支的成本都很高。我知道,在HLSL中有一个[branch]关键字用于解决此问题。但是如何在GLSL中解决它呢 我的代码如下所示(条件不一致,其结果取决于着色器中的计算): 一个“昂贵的计算”可以修改条件所依赖的变量。可能会执行多个计算 我知道,有一些旧的或移动的GPU-s,它们根本不支持分

我正在做一个片段着色器。它是可行的,但仍需要一些优化

据我所知,GLSL中的大多数案例分支都是扁平化的,因此这两个案例都被执行。我已经消除了大部分if-else条件,但其中有些条件必须保持不变,因为执行这两个分支的成本都很高。我知道,在HLSL中有一个
[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...
}

...