gpt4 book ai didi

android - vec4 add fragment 着色器中的 GLSL 性能问题

转载 作者:行者123 更新时间:2023-11-29 01:53:49 26 4
gpt4 key购买 nike

我有一个相当简单的 fragment 着色器,用于处理多灯的情况(为清楚起见,下面的代码被删减,只显示了两盏灯)。

总体思路是对每个 fragment 的各种照明贡献求和,它工作正常,但我发现它在我的硬件 (Android HTX Desire X) 上不稳定。

测量 FPS,很明显有一个 vec4 添加行导致 FPS 下降 10。

是什么导致这种看似简单的操作出现性能下降?

void main (void)
{
vec4 v = u_ViewModelMatrix * vec4(v_Vertex, 1.0);
vec3 nv = normalize(-v.xyz);
vec3 normalVector = normalize((u_ViewModelTransposeMatrix * vec4(normalize(v_Normal), 0.0)).xyz);

vec4 finalColour = vec4(0.0, 0.0, 0.0, 1.0);

// LIGHT 0
lightPosition = vec4(u_LightData[2], u_LightData[3], u_LightData[4], 1);
lightColour = vec4(u_LightData[5], u_LightData[6], u_LightData[7], 1.0) * u_LightData[0];

lightVector = normalize((u_ViewMatrix * lightPosition).xyz - v.xyz);
halfwayVector = normalize(lightVector + nv);

facing = dot(normalVector, lightVector);
if (facing >= 0.0) {
finalColour = finalColour + diffuseColour * facing * lightColour;
}

// LIGHT 1
lightPosition = vec4(u_LightData[LIGHTS_FLOATS_PER_LIGHT*1+2],
u_LightData[LIGHTS_FLOATS_PER_LIGHT*1+3],
u_LightData[LIGHTS_FLOATS_PER_LIGHT*1+4],
1);
lightColour = vec4(u_LightData[LIGHTS_FLOATS_PER_LIGHT*1+5],
u_LightData[LIGHTS_FLOATS_PER_LIGHT*1+6],
u_LightData[LIGHTS_FLOATS_PER_LIGHT*1+7],
1.0) * u_LightData[LIGHTS_FLOATS_PER_LIGHT*1];

lightVector = normalize((u_ViewMatrix * lightPosition).xyz - v.xyz);
halfwayVector = normalize(lightVector + nv);

facing = dot(normalVector, lightVector);
if (facing >= 0.01) {
vec4 qwe = diffuseColour * facing * lightColour;
// HERE .............
finalColour = finalColour + qwe; // takes 10 fps
// HERE ^^^^^^^^^^^^^
}

gl_FragColor = finalColour;
}

最佳答案

分支导致了这个。避免使用 ifs 和 for 循环。替换

if (facing >= 0.0) {
finalColour = finalColour + diffuseColour * facing * lightColour;
}

finalColour += max(0.0, facing) * diffuseColour * lightColour;

if (facing >= 0.01) {
vec4 qwe = diffuseColour * facing * lightColour;
// HERE .............
finalColour = finalColour + qwe; // takes 10 fps
// HERE ^^^^^^^^^^^^^
}

finalColour += step(0.01, facing) * facing * diffuseColour * lightColour;

即使您不需要计算某些值,也不要担心。由于着色器是并行执行的,因此您无法比最慢的实例快多少。

此外,您应该将尽可能多的东西移至顶点着色器,因为对于 fragment 着色器中的每个顶点和每个像素,它只会执行一次;基本上,您计算在顶点着色器中(三)插值良好的所有内容并将其作为变量传递:

  • 灯光的位置和颜色
  • 向量 L、V 和 H(至少在本例中)

关于android - vec4 add fragment 着色器中的 GLSL 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483190/

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