2017-02-10 22 views
2

У меня есть вопрос использования webGL.WebGL - рендеринг с двумя проходами

В последнее время мне пришлось визуализировать в режиме реального времени пост-обработанное изображение из заданной геометрии.

Мой навязчивого был:

  1. геометрия проецируются на экране с помощью вершинного шейдера
  2. первого фрагмента шейдер используется для отображения этой геометрии внеэкранного
  3. второго фрагмент шейдера после процесса этот внеэкранное изображение и отображение результата на холсте.

Как я реализовал это:

Я написал первый набор из двух шейдеров для закадрового рендеринга. Это помогает мне нарисовать геометрию текстуры, используя фреймбуфер.

Для второй части я создал вторую программу glsl. Здесь вершинный шейдер используется для проецирования прямоугольника, который охватывает весь экран. Фрагмент-шейдер выбирает соответствующий пиксель из внеэкранной текстуры с помощью sample2D и выполняет все свои последующие операции.

Это звучит странно для меня, для двоих думает:

  1. Для того, чтобы быть «отображаемый», закадровый текстура должна быть создана с размером двойки, и, таким образом, может быть значительно больше, чем сам холст.
  2. Использование второго вершинного шейдера кажется излишним. Можно ли пропустить этот шаг и напрямую перейти ко второму шейдеру фрагмента, чтобы нарисовать внеэкранную текстуру на холсте?

Итак, большой вопрос: какой правильный способ достичь этого? Что я делаю правильно, и что я делаю неправильно?

Спасибо за совет :)

ответ

2

In order to be 'renderable', the offscreen texture has to be created with a size power of two, and thus can be significantly larger than the canvas itself.

Нет, это не так, ему нужно только когда вам требуется мип сопоставляются фильтрации, создания и рендеринга в NPOT (Non мощь двух) текстур с LINEAR или NEAREST фильтры полностью прекрасны. Обратите внимание, что текстуры NPOT поддерживают только упаковку CLAMP_TO_EDGE.

Using a second vertex shader seems redundant. Is it possible to skip this step, and directly go to the second fragment shader, to draw the offscreen texture to the canvas?

К сожалению нет, вы могли использовать один и тот же вершинные шейдеры для обоих проходов визуализации, просто прикрепив ее к обеим программам. Однако для этого потребуется, чтобы ваша вершинная шейдерная логика применялась к обеим геометриям, что маловероятно + вы все равно переключаете программы, поэтому здесь нечего ничего выиграть.

+0

> создание и оказание NPOT (Бесконтактная мощность двух) текстур с линейными или БЛИЖАЙШИХ фильтрами абсолютно нормально Это странно ... Если удалить 'gl.texParameteri (gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, гл. ЛИНЕЙНАЯ); gl.texParameteri (gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); 'или если я не использую текстуру POT, я получил эту ошибку: ' [.Offscreen-For-WebGL-000001EA50628900] RENDER ПРЕДУПРЕЖДЕНИЕ: текстура, связанная с блоком текстуры 0, не является рендерируемой.Это может быть не-power-of-2 и иметь несовместимую фильтрацию текстур Что случилось? – paulinodjm

+0

Когда вы не устанавливаете фильтр мини-фильтрации, по умолчанию он имеет значение «NEAREST_MIPMAP_LINEAR», поэтому для него требуется сопоставление mip. Возможно, ваши режимы обертывания отключены, текстуры NPOT (в WebGL 1) не поддерживают упаковку «REPEAT» или «MIRROR», а только «CLAMP_TO_EDGE». –

+0

Действительно, я вручную задал параметры 'TEXTURE_WRAP_ *' 'CLAMP_TO_EDGE', и теперь он работает с текстурами NPOT. Итак, для второй части я должен использовать вторую сетку для проецирования текстуры на экран. Разве это не слишком много? – paulinodjm

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

  • Нет связанных вопросов^_^