繁体   English   中英

iOS上的片段着色器行为

[英]Fragment shader behavior on iOS

我正在对iOS应用程序的片段着色器进行一些基本的优化。 我想将几种颜色之一分配给gl_FragColor 我的第一次尝试是使用三元运算符。 这可以在模拟器和iPhone 5C上正确显示内容:

lowp float maxC = max(color.r, max(color.g, color.b);
lowp float minC = min(color.r, min(color.g, color.b);
gl_FragColor.rgb = (maxC > 1.0 ? result0 : (minC < 0.0 ? result1 : result2));

我尝试用mixstep的组合替换三元运算符,以查看是否可以用更少的分支来复制上述逻辑。 不幸的是,这在模拟器中有效,但在iOS设备上无效:

  lowp float step0 = step(0.0, minC);
  lowp float step1 = step(1.001, maxC);
  lowp vec3 mix0 = mix(result1, result2, step0);
  gl_FragColor.rgb = mix(mix0, result0, step1);

具体来说,在模拟器中正确绘制的屏幕的某些白色区域被错误地绘制为设备上的黑色区域。 其他一切看起来都很好。

以上stepmix无法产生与使用三元运算符的方法相同的结果的原因有哪些?

OpenGL着色器中浮点运算的确切细节可能很难理解。 可能发生的情况是,GLSL编译器正在将三元运算符优化为乘以零运算。 请查看避免着色器条件,以获取有关如何将条件条件折叠为乘法或其他简单操作的信息。 最有用的实用程序功能是:

float when_eq(float x, float y) {
  return 1.0 - abs(sign(x - y));
}

使用的一个例子是:

float comp = 0.0;
comp += when_eq(vTest, 0.0) * v1;
comp += when_eq(vTest, 1.0) * v2;

上面的代码将根据vTest的当前值将comp设置为v1或v2。 一定要测试此显式实现与编译器生成的三元隐式测试,以查看哪种更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM