我在WebGL中有很长的着色器管道,每个着色器从输入纹理读取,渲染到另一个纹理,最后一个纹理包含所需的结果。
我可以在管道中重用纹理,就像同步运行一样吗?
// ... init texA to contain input ...
shader1.samplingFrom(texA).renderTo(texB);
shader2.samplingFrom(texB).renderTo(texA);
shader3.samplingFrom(texA).renderTo(texB);
return readPixels(texB); // Always the same answer?
就此而言,我是否可以在下一阶段开始之前依赖着色器完成?
// ... init texA to contain input ...
shader1.samplingFrom(texA).renderTo(texB);
shader2.samplingFrom(texB).renderTo(texC);
shader3.samplingFrom(texC).renderTo(texD);
return readPixels(texD); // Always the same answer?
我最初认为我可以重复使用纹理,但是我注意到如果我停止管道(意味着某种竞争条件),奇怪的行为会消失,所以现在我不确定提供了什么保证。
答案 0 :(得分:1)
是的,您可以重复使用纹理。在OpenGL / WebGL中你可以做什么,在同一个绘图调用中读取并渲染到相同的纹理。
同样着色器一个接一个地运行,而不是并行运行,至少在OpenGL中运行。单个着色器可以在内部并行执行某些操作,但结果必须与串行运行的结果相同。