在 WebGL 或 OpenGL 中,将输出片段变量用作临时存储是否不好?

In WebGL or OpenGL is it bad to use an output fragment variable as temp storage?

忽略编码模式和代码 clarity/quality:

这是一个问题,我只是不知道它本身是不好的还是无关紧要的。我找不到足够的关于分配的内部工作原理:gl_FragColor 在 WebGL 1.0 中或在 WebGL 2 中的输出变量(布局(位置= 0)输出 vec4 颜色)。

做这样的事情是否有一些固有的额外性能成本:

void main() {
  gl_FragColor = vec4(0., 0., 0., 1.);
  vec4 val = gl_FragColor * something;
  ...
  gl_FragColor = val;
}

还是完全使用临时声明的变量然后一次分配给输出值更好?

void main() {
  vec4 thing = vec4(0., 0., 0., 1.);
  vec4 val = thing * something;
  ...
  gl_FragColor = val;
}

我只是猜测答案是“否”,没有任何后果。驱动程序可以做任何事情 wants/needs 以获得正确答案。如果 gl_FragColor 是特殊的,驱动程序可以制作自己的临时文件。 GPU 供应商争夺性能。着色器被翻译成 GPU 本身的汇编语言,所以它不太可能 gl_FragColor 是特殊的,除非它是一种告诉编译器在完成计算时实际输出哪个值的方法。

我一直这样做。 three.js 和 an example

一样