DirectX 9 HLSL против DirectX 10 HLSL: синтаксис одинаков? - PullRequest
6 голосов
/ 18 мая 2010

В течение последнего месяца или около того я пытался изучить DirectX. Итак, я переключался между DirectX 9 и 10. Одно из основных изменений, которые я видел в этих двух, - это обработка векторов в видеокарте.

Одно из кардинальных изменений, которое я заметил, это то, как вы заставляете GPU распознавать ваши структуры. В DirectX 9 вы определяете гибкие форматы вершин.

Ваша типичная настройка была бы такой:

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

В DirectX 10, я полагаю, эквивалентно описание входной вершины:

D3D10_INPUT_ELEMENT_DESC layout[] = {
    {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT, 0 , 0,
        D3D10_INPUT_PER_VERTEX_DATA, 0},
    {"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT, 0 , 12,
        D3D10_INPUT_PER_VERTEX_DATA, 0}
};

Я заметил в DirectX 10, что это более наглядно. Помимо этого, какие были сделаны радикальные изменения, и является ли синтаксис HLSL одинаковым для обоих?

Ответы [ 3 ]

7 голосов
/ 18 мая 2010

Я бы сказал, что нет радикальных изменений в самом синтаксисе HLSL между DX9 и DX10 (и расширением DX11).

Как сказала Codeka, изменения - это скорее вопрос очистки API и пути к обобщению (ради GPGPU). Но есть действительно заметные различия:

Заметные различия:

  • Чтобы передать константу шейдерам, вы Теперь нужно пройти через постоянные буферы.

  • Ядро общего шейдера: все типы шейдеры имеют доступ к одному и тому же набору внутренние функции (за некоторыми исключениями, например, для стадии GS). Целочисленные и побитовые операции теперь полностью совместимы с IEEE (и не эмулируются через плавающую точку). Теперь у вас есть доступ к двоичным приведениям, чтобы интерпретировать int как float, float как uint и т. Д.

  • Текстуры и пробоотборники были разобщены. Теперь вы используете синтаксис g_myTexture.Sample( g_mySampler, texCoord ) вместо tex2D( g_mySampledTexture, texCoord )

  • Буферы: новый тип ресурсов для доступа к данным, которые не требуют фильтрации в режиме произвольного доступа, с использованием новой функции Object.Load.

  • Системная семантика значения: обобщение и расширение семантики POSITION, DEPTH, COLOR, которые теперь являются SV_Position, SV_Depth, SV_Target и добавление каждой новой семантики как SV_InstanceID, SV_VertexId и т. д.

Это все, что я вижу сейчас. Если у меня возникнет что-то новое, я обновлю свой ответ.

1 голос
/ 18 мая 2010

Самое большое изменение, которое я заметил между DX9 и DX10, это то, что в DX10 вам нужно установить целый блок визуализации, где в DX9 вы можете изменять отдельные состояния. Это несколько нарушило мою архитектуру, потому что я скорее полагался на возможность внести небольшое изменение и оставить все остальные состояния одинаковыми (это действительно становится проблемой, когда вы устанавливаете состояния из шейдера).

Другим большим изменением является тот факт, что в DX10 объявления вершин связаны с скомпилированным шейдером (в CreateInputLayout). Под DX9 это было не так. Вы просто устанавливаете объявление и устанавливаете шейдер. Под DX10 вам нужно создать шейдер, а затем создать макет ввода , прикрепленный к данному шейдеру.

Как указывает Codeka, D3DVERTEXELEMENT9 был рекомендованным способом создания сигнатур шейдеров с момента появления DX9. FVF уже амортизируется, и с помощью FVF вы не можете делать такие вещи, как установка касательной базы. Вершинные слои гораздо более мощные и не заставляют вас фиксироваться на макете. Вы можете размещать элементы вершин где угодно.

Если вы хотите узнать больше о входных раскладках DX9, тогда я предлагаю начать с MSDN .

0 голосов
/ 18 мая 2010

FVFs (вроде) были объявлены устаревшими в пользу D3DVERTEXELEMENT9 (он же объявлений вершин ), что в любом случае очень похоже на D3D10_INPUT_ELEMENT_DESC. На самом деле, большинство из того, что есть в DirectX 10, очень похоже на то, что было в DirectX 9 , за исключением конвейера с фиксированными функциями .

Самым большим изменением между DirectX9 и DirectX10 стала очистка API (с точки зрения разделения проблем, прояснения того, что происходит на каком этапе конвейера и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...