gpt4 book ai didi

opengl - GLSL 分支行为

转载 作者:行者123 更新时间:2023-12-04 04:24:53 26 4
gpt4 key购买 nike

我有一个相当简单的带有分支的片段着色器,我有点不确定 GLSL 编译器如何处理它以及它如何影响性能。

uniform sampler2D sampler;
uniform vec2 texSize;
uniform vec2 targetSize;

void main()
{
vec4 color;
if(texSize == targetSize)
color = texture2DNearest(sampler, gl_TexCoord[0]);
else
color = texture2DBicubic(sampler, gl_TexCoord[0]);
gl_FragColor = color;
}

我读过 AMDs document有时两个分支都被执行,在这种情况下这不是一个好主意。没有进一步的信息,也没有反汇编的权限,我不确定该怎么想,如果这是一个问题,如何避免它?

而且根据我的理解,基于统一变量的分支不会产生任何显着的开销,因为它在一次传递中是恒定的?

最佳答案

给你:

il_ps_2_0
dcl_input_generic_interp(linear) v1
dcl_resource_id(0)_type(2d)_fmtx(float)_fmty(float)_fmtz(float)_fmtw(float)
eq r2.xy__, c1.xyyy, c0.xyyy
imul r5.x___, r2.x, r2.y
mov r1.x___, r5.x
if_logicalnz r1.x
sample_resource(0)_sampler(0) r6, v1.xyyy
mov r7, r6
else
sample_resource(0)_sampler(0) r8, v1.xyyy
mov r7, r8
endif
mov r9, r7
mov oC0, r9
endmain

重新表述一下 Kos 所说的,重要的是在执行之前知道守卫条件是否可以知道。这是自 c1 以来的情况和 c0寄存器是常量(常量寄存器以字母 'c' 开头), r1.x 也是如此寄存器值。

这意味着该值对于所有调用的片段着色器都是相同的,因此不会发生线程分歧。

顺便说一句,我正在使用 AMD GPU ShaderAnalyser用于将 GLSL 转换为 IL。
还可以生成特定代的原生GPU汇编代码(范围从HD29xx到HD58xx)。这真是个好工具!

关于opengl - GLSL 分支行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com