Перевод C на C # и HLSL: это будет возможно? - PullRequest
7 голосов
/ 18 апреля 2011

Я взял на себя довольно сложную задачу для себя.В моей игре XNA я хочу реализовать NTSC-фильтр Blargg .Это библиотека C, которая преобразует растровое изображение, чтобы оно выглядело так, как будто оно было выведено на телевизоре с ЭЛТ и стандартом NTSC.Это довольно точно, правда.

Первое, что я попробовал некоторое время назад, было просто использовать саму библиотеку C, вызывая ее как dll.Здесь у меня было две проблемы: 1. Я не мог заставить некоторые данные правильно копировать, поэтому изображение было испорчено, но что более важно, 2. оно было очень медленным.Требовалось получить данные растрового изображения XNA Texture2D, пропустить их через фильтр, а затем снова установить для текстуры текстуру.Частота кадров была разрушена, поэтому я не мог пойти по этому пути.

Теперь я пытаюсь перевести фильтр в пиксельный шейдер.Проблема здесь (если вам не терпится взглянуть на код - я использую SNES, потому что он простейший) в том, что он обрабатывает очень большие массивы и опирается на интересные операции с указателями.Я проделал большую работу по переписыванию алгоритма, чтобы он работал независимо для каждого пикселя, как того требует пиксельный шейдер.Но я не знаю, будет ли это когда-нибудь работать.Я пришел к вам, чтобы узнать, возможно ли даже завершить это.

  1. В него включен предварительно вычисленный массив, содержащий 1 048 576 целых чисел.Это одно за пределами для пиксельного шейдера?Его нужно устанавливать только один раз, а не один раз за кадр.
  2. Даже если это нормально, я знаю, что HLSL не может индексировать массивы по переменной.Он должен развернуть его в миллион операторов if, чтобы получить правильный элемент массива.Это убьет представление и сделает его бесплодным усилием снова?Существует несколько обращений к массиву на пиксель.
  3. Есть ли шанс, что мой первоначальный план использования библиотеки как есть, сработает?Мне просто нужно, чтобы это было быстро.
  4. Я никогда раньше не писал шейдеры.Есть ли что-то еще, о чем я должен знать?

edit: Добавление к # 2.Я просто где-то читал, что hlsl может не только не обращаться к массивам по переменным, но даже чтобы развернуть его, индекс должен вычисляться во время компиляции.Это правда, или «развёртывание» решает это?Если это правда, я думаю, что я облажался.Любой способ обойти это?Мой алгоритм в основном является прославленной версией «входной пиксель - это цвет, поэтому посмотрите значения моего выходного пикселя в этом гигантском массиве».

1 Ответ

2 голосов
/ 18 апреля 2011

Из моего ограниченного понимания языков шейдеров, ваша проблема может быть легко решена с помощью текстуры вместо массива.

  1. Создайте его на CPU, а затем сохраните как текстуру. 1024x1024 в вашем случае.
  2. Используйте стандартные функции доступа к текстуре, как если бы текстура была массивом. Возможно использование ближайшего соседа для ограничения наложения отдельных пикселей.
  3. Я не думаю, что это возможно, если вы хотите скорость.
...