Перевод C на C # и HLSL: возможно ли это?

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

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

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

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

edit: Дополнение к №2. Я только что где-то читал, что hlsl не только может не обращаться к массивам по переменной, но даже чтобы развернуть его, индекс должен быть вычислен во время компиляции. Это правда, или " должен выдать

BARN

(с необычными цветами для каждого символа), но вместо этого он выдает:

B A R N

ПРИМЕР A


    B
    A
    R
    N

Что дает желаемый результат, однако:

ПРИМЕР B


    BARN

Глупо, а? Во всяком случае, это задокументировано @ Различия в обработке XAML между Silverlight 3 и Silverlight 4 в разделе Обработка пробелов , где говорится:

Silverlight 3 больше обрабатывает пробелы буквально в более широком диапазоне, в том числе некоторые случаи, когда рассматривается CLRF существенный. Иногда это приводило к XAML файлового формата с опущенным CRLF в чтобы избежать нежелательных пробелов в презентация, но которой не было человекочитаемый при редактировании среды. Silverlight 4 использует более интуитивно понятный значащий пробел модель, похожая на WPF. Эта модель сворачивается при форматировании файла пробелы в большинстве случаев с исключение некоторых CLR-атрибутов контейнеры, которые обрабатывают все пробелы столь же значительный. Эта модель пробелов дает больше возможностей для редактирования свобода вводить пробелы, которые может улучшить форматирование кода XAML. Также Silverlight 4 имеет текстовые элементы. которые позволяют еще больший контроль над Проблемы с представлением пробелов.

Отлично, но я не использую SL4, потому что я создаю приложение WP7 программно. Да, мой XAML создан. Использование XML-литералов. Затем отправляется в строку. Примерно так:

Dim r1 As XElement = B
Dim r2 As XElement = A
Dim r3 As XElement = R
Dim r4 As XElement = N
Dim tb = 
             <%= r1 %><%= r2 %><%= r3 %><%= r4 %>
         
Dim result = tb.ToString

После всего этого возникает мой вопрос: как я могу создать образец B вместо образца A. Этот текстовый блок станет частью большего количества элементов на странице XAML, поэтому .ToString часть не совсем точна в этом месте - это происходит, когда весь XAML для страницы пользовательского управления выгружается в файл.


РЕДАКТИРОВАТЬ (6 мая 2011 г.): Небольшой прогресс и награда


I ' Мы добились небольшого прогресса, как показано ниже, но здесь я сталкиваюсь с мысленным препятствием, касающимся того, как выполнить необычное разделение и обработку XML для вывода строки. Возьмем этот новый пример:


  
    
      
      
      
    
    
      
      
      
    
  
  
    
      
      
      
      
    
    
      
      
      
      
      
    
  

Я хочу, чтобы выходная строка была:


  
    
      
    
    
      
    
  
  
    
      
      
    
    
      
      
      
      
    
  

I ' мы просматривали XMLWriter и XMLWriterSettings , основанные на сообщении Эрика Уайта , которое кажется хорошим началом для прогонов (не включая потенциал ] еще, что меня тоже ставит в тупик). Примерно так:

Sub Main()
    Dim myXML As XElement = 
                                
                                    
                                        
                                        
                                        
                                    
                                    
                                        
                                        
                                        
                                    
                                
                            
    Console.Write(ToXMLString(myXML))
    Console.ReadLine()
End Sub
Public Function ToXMLString(xml As XElement) As String
    Dim tb As XElement = xml.Elements..FirstOrDefault
    Dim xmlWriterSettings As New XmlWriterSettings
    XmlWriterSettings.NewLineHandling = NewLineHandling.None
    XmlWriterSettings.OmitXmlDeclaration = True
    Dim sb As New StringBuilder
    Using xmlwriter As XmlWriter = xmlwriter.Create(sb, XmlWriterSettings)
        tb.WriteTo(xmlwriter)
    End Using
    Return sb.ToString
End Function

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

12
задан Jeff Mercado 6 May 2011 в 21:56
поделиться