2016-03-30 3 views
0

У меня длинный конвейер шейдеров в WebGL, где каждый шейдер читает из входной текстуры, отображает другую текстуру, а к концу последняя текстура содержит желаемый результат.Повторное использование текстур в 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. Один шейдер может делать некоторые вещи внутри себя параллельно, но результат должен быть таким же, как если бы он выполнялся последовательно.

Смежные вопросы