Поделиться через


Преобразование в Direct3D 9

В Microsoft Direct3D 9 были изменены следующие функции. Если вы используете эти функции, ознакомьтесь с приведенными ниже изменениями, которые помогут вам перенести приложение в Direct3D 9.

Изменения BaseVertexIndex

В DirectX 8.x для IDirect3Ddevice8::SetIndices требовался указатель на буфер индекса и BaseVertexIndex для начальной позиции в буфере вершин. Перед вызовом IDirect3DDevice8::D rawIndexedPrimitive, приложению, пакетирующее различные объекты в буфер вершин, необходимо было переключить буфер индекса (или выполнить вызов IDirect3Device8::D rawIndexedPrimitive.

В Direct3D 9 начальная позиция в буфере вершин BaseVertexIndex была перемещена в IDirect3Device9::D rawIndexedPrimitive, а его тип данных изменен с DWORD на INT.

HRESULT IDirect3DDevice9::DrawIndexedPrimitive( 
    D3DPRIMITIVETYPE PrimType, 
    INT BaseVertexIndex, 
    UINT minIndex, 
    UINT NumVertices, 
    UINT startIndex, 
    UINT primCount); 

HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData); 

CreateImageSurface Changes

IDirect3DDevice8::CreateImageSurface переименован в CreateOffscreenPlainSurface. Добавлен дополнительный параметр, принимаюющий тип D3DPOOL. D3DPOOL_SCRATCH возвращает поверхность, которая имеет идентичные характеристики поверхности, созданной IDirect3Device8::CreateImageSurface. D3DPOOL_DEFAULT является подходящим пулом для использования с StretchRect и ColorFill.

Изменения D3DENUM_NO_WHQL_LEVEL

Теперь приложениям приходится явно запрашивать Лаборатории качества оборудования Microsoft Windows (WHQL), так как ответ занимает относительно много времени (несколько секунд). D3DENUM_NO_WHQL_LEVEL удалена и добавлена D3DENUM_WHQL_LEVEL.

Создание изменений ресурсов

Дескриптор был добавлен в несколько методов и должен иметь значение NULL. К затронутым методам относятся:

Изменения EnumAdapterModes

EnumAdapterModes теперь принимает D3DFORMAT.

HRESULT IDirect3D9::EnumAdapterModes( 
       UINT Adapter, 
       D3DFORMAT Format, 
       UINT Mode, 
       D3DDISPLAYMODE *pMode); 

Формат поддерживает расширяющийся набор режимов отображения. Чтобы защитить приложения от перечисления форматов, которые не были изобретены при отправке приложения, приложение должно сообщить Direct3D формат для режимов отображения, которые должны быть перечислены. Результирующий массив режимов отображения будет отличаться только по ширине, высоте и частоте обновления.

Приложение задает формат пикселей, а перечисление ограничивается теми режимами отображения, которые точно соответствуют формату. Ниже приведен список разрешенных форматов.

  • D3DFMT_A1R5G5B5
  • D3DFMT_A2B10G10R10
  • D3DFMT_A8R8G8B8
  • D3DFMT_R5G6B5
  • D3DFMT_X1R5G5B5
  • D3DFMT_X8R8G8B8

Перечисление эквивалентно для альфа- и неальфаковых версий одного формата. Возвращаемый формат Format всегда будет заполнен тем же форматом, который предоставляется приложением.

Этот метод обрабатывает 565 и 555 как эквивалентные значения и возвращает правильную версию в формате. Разница возникает только в том случае, если приложение блокирует задний буфер, и для этого приложение должно установить явный флаг.

Изменения Get/SetStreamSource

Один параметр добавлен в методы GetStreamSource и SetStreamSource . Смещение — это число байтов между началом потока и началом данных вершины. Измеряется в байтах. Это позволяет конвейеру поддерживать смещения потоков. Чтобы узнать, поддерживает ли устройство смещение потоков, см. D3DDEVCAPS2_STREAMOFFSET.

HRESULT GetStreamSource(
    UINT StreamNumber,
    IDirect3DVertexBuffer9 **ppStreamData,
    UINT *pOffsetInBytes,
    UINT *pStride);

Изменения качества с несколькими выборками

Ранее существовало только перечисление D3DMULTISAMPLE_TYPE. Direct3D 9 сохраняет это перечисление и добавляет представление об уровне качества для каждого элемента перечисления. Уровень качества указывает на компромисс между качеством визуализации и производительностью, указывая количество маскируемых выборок (в смысле D3DRS_MULTISAMPLEMASK).

Приложение должно выбрать необходимое количество маскируемых примеров, а затем обратиться к pQualityLevels. Если значение не равно нулям, это значение указывает количество уровней качества, которые приложение может передать различным функциям создания через MultiSampleQuality. Так как драйверы предоставляют все свои схемы с несколькими выборками в качестве уровней качества на D3DMULTISAMPLE_NONMASKABLE, вы можете перечислить все доступные схемы с несколькими выборками с помощью этого типа, если приложению не нужно маскировать примеры.

Бит D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE caps прекращен. Этот бит означало, что метод multisampling не поддерживает маски записи и не может быть включен и отключен между BeginScene и EndScene. Такие немаскируемые методы теперь предоставляются через D3DMULTISAMPLE_NONMASKABLE.

HRESULT CheckDeviceMultiSampleType( 
       UINT Adapter, 
       D3DDEVTYPE DeviceType, 
       D3DFORMAT SurfaceFormat, 
       BOOL Windowed, 
       D3DMULTISAMPLE_TYPE MultiSampleType, 
       DWORD * pQualityLevels); 

Для каждого числа маскируемых выборок используется разные максимальные значения. Например, D3DMULTISAMPLE_4_SAMPLES может иметь три уровня качества, а D3DMULTISAMPLE_2_SAMPLES — только один. Существует не более восьми уровней качества для каждого количества маскируемых образцов (драйвер не может выразить больше). Качество варьируется от нуля до (*pQualityLevels - 1).

Изменения ResourceManagerDiscardBytes

ResourceManagerDiscardBytes заменен на IDirect3DDevice9::EvictManagedResources. Он может исключить все ресурсы, как Direct3D, так и ресурсы драйверов.

Теперь с диспетчером ресурсов обращаются, когда не удается создать ресурс (управляемый или неуправляемый) из-за нехватки видеопамять. Руководителю будет автоматически предложено освободить достаточно ресурсов для успешного создания. В DirectX 8.0 этот процесс не был автоматизирован.

SetSoftwareVertexProcessing Changes

Приложение может создать устройство в смешанном режиме для использования программной и аппаратной обработки вершин.

Чтобы переключиться между двумя режимами обработки вершин в DirectX 8.x, вызовите метод IDirect3Device8::SetRenderState. Он был заменен на SetSoftwareVertexProcessing , чтобы упростить проблемы, вызванные блоками состояний. Этот новый метод не записывается блоками состояний.

Изменения в выборке текстур

Direct3D 9 поддерживает до шестнадцати поверхностей текстур за один проход с использованием модели пиксельного шейдера 2_0; однако количество координат текстуры остается ограниченным до восьми. Состояние этапа текстуры связано с поверхностями, наборами координат, обработкой вершин и обработкой пикселей. Чтобы управлять этими различиями во время компиляции, SetTextureStageState был разбит на два метода:

  • IDirect3DDevice9::SetTextureStageState по-прежнему будет использоваться для состояния координат текстуры, например режимов переноса и создания координат текстуры.
  • SetSamplerState добавлен и теперь будет использоваться для фильтрации, облицовки, зажимовки, MIPLOD и т. д. Это будет работать для шестнадцати выборок.

Изменения SetTextureStageState

Теперь IDirect3DDevice9::SetTextureStageState задает следующие состояния:

  • Исправлено состояние обработки вершин функции. Это состояние управляет обработкой координат текстуры D3DTSS_TEXTURETRANSFORMFLAGS и D3DTSS_TEXCOORDINDEX. Можно задать до восьми из них (так как всегда поддерживаются восемь координат текстур). D3DTSS_TEXCOORDINDEX — это состояние обработки вершин фиксированной функции. Если используется программируемый шейдер вершин, это состояние игнорируется.

  • Исправлено состояние шейдера пикселей функции (устаревшая версия TextureStageState).

    • D3DTSS_ALPHAARG0
    • D3DTSS_ALPHAARG1
    • D3DTSS_ALPHAARG2
    • D3DTSS_ALPHAOP
    • D3DTSS_BUMPENVLOFFSET
    • D3DTSS_BUMPENVLSCALE
    • D3DTSS_BUMPENVMAT00
    • D3DTSS_BUMPENVMAT01
    • D3DTSS_BUMPENVMAT10
    • D3DTSS_BUMPENVMAT11
    • D3DTSS_COLORARG0
    • D3DTSS_COLORARG1
    • D3DTSS_COLORARG2
    • D3DTSS_COLOROP
    • D3DTSS_RESULTARG

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

Количество выборок текстур, доступных приложению, определяется версией шейдера пикселей, как показано в следующей таблице.

Имя Число
ps_1_1 ps_1_3 4 образца текстуры
ps_1_4 6 образцов текстур
ps_2_0 16 образцов текстур
конвейер фиксированной функции Выборки текстур MaxTextureBlendStages/MaxSimultaneousTextures

 

Устройства, поддерживающие сопоставление смещения в Direct3D 9, будут поддерживать дополнительный выборщик (D3DDMAPSAMPLER), который отбирает карты смещения в блоке tessellator.

Изменения SetSamplerState

IDirect3DDevice9::SetSamplerState задает состояние выборки (включая то, которое используется в блоке tessellator для выборки карт смещения). Они были переименованы с помощью префикса D3DSAMP_, чтобы включить обнаружение ошибок во время компиляции при переносе из DirectX 8.x. К состояниям относятся:

  • D3DSAMP_ADDRESSU
  • D3DSAMP_ADDRESSV
  • D3DSAMP_ADDRESSW
  • D3DSAMP_BORDERCOLOR
  • D3DSAMP_MAGFILTER
  • D3DSAMP_MAXANISOTROPY
  • D3DSAMP_MAXMIPLEVEL
  • D3DSAMP_MINFILTER
  • D3DSAMP_MIPFILTER
  • D3DSAMP_MIPMAPLODBIAS

Изменения объявления вершин

Объявления вершин теперь отделены от создания вершинного шейдера. Объявления вершин теперь используют интерфейс COM.

Для DirectX 8.x объявления вершин привязаны к вершинным шейдерам.

  • Для конвейера фиксированной функции вызовите Метод SetVertexShader с кодом гибкого формата вершин (FVF) буфера вершин.
  • Для вершинных шейдеров вызовите IDirect3DDevice9::SetVertexShader с дескриптором для созданного ранее шейдера вершин. Шейдер включает объявление вершины.

Для Direct3D 9 объявления вершин отделяются от вершинных шейдеров и могут использоваться как с конвейером фиксированной функции, так и с шейдерами.

  • Для конвейера фиксированной функции нет необходимости вызывать IDirect3DDevice9::SetVertexShader. Если вы хотите переключиться на конвейер фиксированной функции и ранее использовали вершинный шейдер, вызовите метод IDirect3Device9::SetVertexShader(NULL). После этого вам по-прежнему потребуется вызвать SetFVF , чтобы объявить код FVF.
  • При использовании вершинных шейдеров вызовите IDirect3DDevice9::SetVertexShader с объектом вершинного шейдера. Кроме того, вызовите IDirect3DDevice9::SetFVF, чтобы настроить объявление вершины. При этом используются неявные сведения в FVF. Метод SetVertexDeclaration можно вызвать вместо IDirect3Device9::SetFVF, так как он поддерживает объявления вершин, которые не могут быть выражены с помощью FVF.

Интервалы и Изменения swapEffects

Были внесены некоторые изменения, чтобы предоставить пользователю больший контроль над частотой обновления монитора, частотой презентации и интерфейсным буфером по сравнению с рисованием в обратном буфере. Вот они:

  • Удален один эффект подкачки, D3DSWAPEFFECT_COPY_VSYNC и одна частота презентации D3DPRESENT_RATE_UNLIMITED.
  • Переименован D3DPRESENT_PARAMETERS. FullScreen_PresentationInterval в PresentationIntervals.
  • Добавлен D3DPRESENT_INTERVAL_IMMEDIATE, что означает, что презентация не синхронизирована с вертикальной синхронизацией. Как и в DirectX 8.x, D3DPRESENT_INTERVAL_DEFAULT определяется как нуль и эквивалентен D3DPRESENT_INTERVAL_ONE. D3DPRESENT_INTERVAL_DEFAULT удобно инициализировать D3DPRESENT_PARAMETERS до нуля.

Подробное описание поддерживаемых режимов и интервалов см. в разделе D3DPRESENT.

Графика Direct3D 9