Я взял на себя довольно сложную задачу для себя.В моей игре XNA я хочу реализовать NTSC-фильтр Blargg .Это библиотека C, которая преобразует растровое изображение, чтобы оно выглядело так, как будто оно было выведено на телевизоре с ЭЛТ и стандартом NTSC.Это довольно точно, правда.
Первое, что я попробовал некоторое время назад, было просто использовать саму библиотеку C, вызывая ее как dll.Здесь у меня было две проблемы: 1. Я не мог заставить некоторые данные правильно копировать, поэтому изображение было испорчено, но что более важно, 2. оно было очень медленным.Требовалось получить данные растрового изображения XNA Texture2D
, пропустить их через фильтр, а затем снова установить для текстуры текстуру.Частота кадров была разрушена, поэтому я не мог пойти по этому пути.
Теперь я пытаюсь перевести фильтр в пиксельный шейдер.Проблема здесь (если вам не терпится взглянуть на код - я использую SNES, потому что он простейший) в том, что он обрабатывает очень большие массивы и опирается на интересные операции с указателями.Я проделал большую работу по переписыванию алгоритма, чтобы он работал независимо для каждого пикселя, как того требует пиксельный шейдер.Но я не знаю, будет ли это когда-нибудь работать.Я пришел к вам, чтобы узнать, возможно ли даже завершить это.
- В него включен предварительно вычисленный массив, содержащий 1 048 576 целых чисел.Это одно за пределами для пиксельного шейдера?Его нужно устанавливать только один раз, а не один раз за кадр.
- Даже если это нормально, я знаю, что HLSL не может индексировать массивы по переменной.Он должен развернуть его в миллион операторов if, чтобы получить правильный элемент массива.Это убьет представление и сделает его бесплодным усилием снова?Существует несколько обращений к массиву на пиксель.
- Есть ли шанс, что мой первоначальный план использования библиотеки как есть, сработает?Мне просто нужно, чтобы это было быстро.
- Я никогда раньше не писал шейдеры.Есть ли что-то еще, о чем я должен знать?
edit: Добавление к # 2.Я просто где-то читал, что hlsl может не только не обращаться к массивам по переменным, но даже чтобы развернуть его, индекс должен вычисляться во время компиляции.Это правда, или «развёртывание» решает это?Если это правда, я думаю, что я облажался.Любой способ обойти это?Мой алгоритм в основном является прославленной версией «входной пиксель - это цвет, поэтому посмотрите значения моего выходного пикселя в этом гигантском массиве».