DirectX 9 HLSL по сравнению с DirectX 10 HLSL: синтаксис то же?

В течение прошлого месяца или так, я арестовывал мой позади попытки изучить 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 является тем же для обоих?

6
задан paxdiablo 18 May 2010 в 01:13
поделиться

3 ответа

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

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

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

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

1
ответ дан 16 December 2019 в 21:36
поделиться

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

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

0
ответ дан 16 December 2019 в 21:36
поделиться

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

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

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

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

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

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

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

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

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

7
ответ дан 16 December 2019 в 21:36
поделиться