В течение прошлого месяца или так, я арестовывал мой позади попытки изучить 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 является тем же для обоих?
Самым большим изменением, которое я заметил между DX9 и DX10, является тот факт, что в DX10 вам нужно установить весь блок состояния рендеринга, а в DX9 вы можете изменять отдельные состояния. Это несколько нарушило мою архитектуру, потому что я скорее полагался на то, что смогу внести небольшое изменение и оставить все остальные состояния такими же (это действительно становится проблемой только тогда, когда вы устанавливаете состояния из шейдера).
Другим большим изменением является тот факт, что в DX10 объявления вершин привязаны к скомпилированному шейдеру (в CreateInputLayout). Под DX9 этого не было. Вы просто устанавливаете объявление и устанавливаете шейдер. В DX10 вам нужно создать шейдер, а затем создать макет ввода , прикрепленный к данному шейдеру.
Как указывает кодека, D3DVERTEXELEMENT9 был рекомендуемым способом создания сигнатур шейдеров с момента появления DX9. FVF уже обесценился, и через FVF вы не можете делать такие вещи, как создание касательной основы. Макеты вершин намного мощнее и не заставляют вас фиксироваться на макете. Вы можете размещать вершинные элементы где угодно.
Если вы хотите узнать больше о схемах ввода DX9, я предлагаю вам начать с MSDN .
FVF были (как бы) устаревшими в пользу D3DVERTEXELEMENT9 (также известного как Vertex декларации ) - который в любом случае очень похож на D3D10_INPUT_ELEMENT_DESC
. Фактически, большая часть того, что было в DirectX 10, удивительно похоже на то, что было в DirectX 9 , за исключением конвейера фиксированных функций .
Самым большим изменением между DirectX9 и DirectX10 была очистка API (с точки зрения разделения задач, что сделало более ясным, что происходит с какой стадией конвейера и т. Д.).
Я бы сказал, что в самом синтаксисе 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
и т. Д.
Это все, что я сейчас вижу . Если что-то новое всплывет у меня в голове, я обновлю свой ответ.