2010-05-18 4 views
6

За последний месяц или около того, я разорял себя, пытаясь изучить DirectX. Поэтому я смешался между DirectX 9 и 10. Один из основных изменений, которые я видел в этих двух, заключается в том, как обрабатывать векторы в графической карте.DirectX 9 HLSL против DirectX 10 HLSL: синтаксис такой же?

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

+0

FVF Не следует использовать в DX9, это просто слева от DX8, чтобы упростить перенос. Рекомендуется использовать массив D3DVERTEXELEMENT9 для описания расположения буфера (очень похоже на то, как это делает D3D10, за исключением того, что он использует фиксированный набор перечислений вместо строк для имен параметров) –

ответ

0

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

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

+0

Я не знал, что directx9 имеет фиксированные функции , Я думал, что фиксированные функции - это неспособность создавать свои собственные уникальные шейдеры. directx 9 позволяет создавать собственные шейдеры. – numerical25

+0

Я столкнулся с нулевыми учебниками, даже упомянул D3DVERTEXELEMENT9 – numerical25

+2

Исправлена ​​функция - возможность рендеринга без использования шейдеров вообще. Шейдеры являются необязательными в DirectX 9. – Alan

1

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

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

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

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

+0

Я тоже это замечаю – numerical25

+0

Ваш второй пункт фактически существует в большинстве реализаций DX9, он просто сидит на уровне драйвера. Это означает, что каждый раз, когда вы назначаете другой шейдер другому объявлению вершин, ему придется пересмотреть код двоичной ассемблера, чтобы соответствовать входным регистрам и где они используются в шейдере (что точно происходит в d3d10). Они в основном просто позволяли вам управлять им самим, поэтому вы не получаете дополнительный удар производительности (обычно не понимая этого). –

7

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

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

заметному различие:

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

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

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

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

  • System-Value Семантика: обобщение и расширения POSITION, DEPTH, COLOR семантика, которые теперь SV_Position, SV_Depth, SV_Target и добавить среднедушевых стадии новой семантики, как SV_InstanceID, SV_VertexId и т.д.

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

Смежные вопросы