OpenGL Постобработка с использованием силы двух текстур - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь выполнить некоторую постобработку в OpenGL ES, поэтому я решил использовать мощность двух размеров текстур, чтобы быть в безопасности.Однако исходное изображение имеет прямоугольную форму и не совсем вписывается в текстуру PoT, поэтому я уменьшаю масштаб и рисую его в буфере кадров (без растяжения, я вернусь к нему позже), как на этом рисунке: enter image description here

Таким образом, в текстуре есть пробел / пустая область черного или любого другого цвета, к которому я ее очищаю.Затем это становится исходной текстурой, которую я использую, и я пинг-понг много раз, чтобы применить эффект.Я попытался обрисовать проблему, с которой, я думаю, я столкнусь на картинке.В основном пиксели на краю будут сэмплировать из пустой области, когда я использую шейдер типа размытия или цветения, который сэмплирует с соседних пикселей.Если бы я использовал текстуру npot или растянул ее, CLAMP_TO_EDGE избавил бы меня от этого, но я не могу понять, как это сделать в моем случае.Вот некоторые идеи, которые я придумала:

  • Растянуть изображение, чтобы заполнить всю текстуру: я чувствую, что некоторые шейдеры, такие как определение краев и т. Д., Могут вызвать дисбаланс в растянутых и не растянутых осяхв финальном изображении.Я хочу, чтобы это работало для всех типов шейдеров.Я ошибаюсь в этом предположении?
  • Попробуйте вручную эмулировать CAMP_TO_EDGE, заполнив пустую область цветами границ исходного изображения: кажется громоздким, и это нужно делать на каждом этапе пинг-понга.
  • Зафиксируйте координаты текстуры в фрагментном шейдере (например, горизонтальный 0,7 - это максимум): я думаю, что это будет тяжело в шейдере, особенно при выборке нескольких координат.

Итак, есть ли способ, которым я могусделать это эффективно, например, установить координату текстуры как край или что-то в этом роде?Я знаю, что текстуры NPoT значительно облегчили бы эту задачу, но сначала я хочу изучить свои возможности с помощью PoT.И поскольку даже настольные графические процессоры вначале не были дружественными по отношению к NPoT, я чувствую, что это должно быть уже решенной проблемой, и для этого должны быть некоторые рекомендации.

1 Ответ

0 голосов
/ 04 января 2019

Вы можете эмулировать зажим к краю при генерации POT-версии текстуры.

При генерации кадрового буфера POT, а не просто рендеринг части кадрового буфера, которая соответствует исходной текстуре, визуализируйте что-то немного увеличенного (например, достаточно дополнительных пикселей, чтобы покрыть ширину ядра вашего фильтра).Если вы визуализируете это с помощью CLAMP_TO_EDGE на исходном прочтении текстуры NPOT, вы просто расширите край исходной текстуры в область переполнения вашего ядра.

Затем вы можете прочитать это как обычно с диапазоном координат, который вы планировали, и все должно работать так, как если бы вы читали исходную текстуру с применением CLAMP_TO_EDGE.Хотя зажим дешевый, я бы ожидал, что он будет дешевле ...

...