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


Исправлена обработка вершин функции (Direct3D 9)

В конвейере вершин с фиксированной функцией при обработке вершин в буфере вершин применяются матрицы текущего преобразования для устройства. При необходимости также можно применить такие операции вершин, как освещение, создание флагов клипа и обновление экстентов. При использовании обработки вершин с фиксированной функцией изменение элементов в буфере вершин назначения управляется флагом D3DPV_DONOTCOPYDATA . Этот флаг применяется только к обработке вершин фиксированной функции. Интерфейс IDirect3DDevice9 предоставляет метод IDirect3DDevice9::P rocessVertices для обработки вершин. Вы обрабатываете вершины из вершинного шейдера в набор входных потоков данных, создавая один поток данных чередующихся вершин в буфере вершин назначения путем вызова метода IDirect3Ddevice9::P rocessVertices . Метод принимает пять параметров, описывающих расположение и количество вершин, целевых для метода, буфер конечных вершин и параметры обработки. После вызова буфер назначения содержит обработанные данные вершин.

Первый, второй и третий параметры, SrcStartIndex, DestIndex и VertexCount, отражают индекс первой загружаемой вершины, индекс в буфере назначения, в котором будут размещаться вершины, и общее количество вершин для обработки и размещения в целевом буфере соответственно. Четвертый параметр pDestBuffer должен иметь адрес интерфейса IDirect3DVertexBuffer9 объекта буфера вершин, который будет получать вершины источника. Параметр SrcStartIndex указывает индекс, с которого метод должен начать обработку вершин.

Окончательный параметр Flags определяет специальные параметры обработки для метода . Для этого параметра можно задать значение 0 для обработки вершин по умолчанию или для D3DPV_DONOTCOPYDATA для оптимизации обработки в некоторых ситуациях. Вы также можете объединить значение D3DPV_DONOTCOPYDATA с одним или несколькими значениями D3DLOCK , подходящими для буфера назначения. Если для флагов задано значение 0, компоненты вершин в формате вершин конечного буфера вершин, которые не затрагиваются операцией вершины, по-прежнему копируются из шейдера вершин или имеют значение 0. Однако при использовании D3DPV_DONOTCOPYDATA IDirect3DDevice9::P rocessVertices не перезаписывает сведения о координатах цвета и текстуры в целевом буфере, если только эти данные не созданы Direct3D. Диффузный цвет создается при включенном освещении, то есть D3DRS_LIGHTING имеет значение TRUE. Зеркальный цвет создается, когда освещение включено и включено, то есть D3DRS_SPECULARENABLE и D3DRS_LIGHTING имеют значение TRUE. Зеркальный цвет также создается при включении тумана. Координаты текстуры создаются при включении преобразования текстуры или создания текстуры. IDirect3DDevice9::P rocessVertices использует текущие состояния отрисовки, чтобы определить, какую обработку вершин следует выполнить.

Параметры использования FVF для буферов вершин назначения

Метод IDirect3DDevice9::P rocessVertices требует определенных параметров для D3DFVF целевого буфера вершин. Параметры использования FVF должны быть совместимы с текущими параметрами для обработки вершин.

Для обработки вершин с фиксированной функцией IDirect3DDevice9::P rocessVertices требуются следующие параметры FVF:

  • Тип позиции всегда D3DFVF_XYZRHW ; поэтому D3DFVF_XYZ и D3DFVF_XYZB1 D3DFVF_XYZB5 недопустимы.
  • Не следует задавать флаги D3DFVF_NORMAL, D3DFVF_RESERVED0 и D3DFVF_RESERVED2.
  • Флаг D3DFVF_DIFFUSE должен быть установлен, если операция ИЛИ следующих условий возвращает значение true:
    • Освещение включено; то есть D3DRS_LIGHTING имеет значение TRUE.
    • Освещение отключено, во входных потоках вершин присутствует рассеянный цвет, а D3DPV_DONOTCOPYDATA не задан.
  • Флаг D3DFVF_SPECULAR должен быть установлен, если операция ИЛИ для следующих условий возвращает значение true:
    • Включена подсветка и включен цвет зеркального освещения; то есть D3DRS_SPECULARENABLE имеет значение TRUE.
    • Освещение отключено, во входных потоках вершин присутствует зеркальный цвет, а D3DPV_DONOTCOPYDATA не задан.
    • Вершинный туман включен; то есть для D3DRS_FOGVERTEXMODE не задано значение D3DFOG_NONE.

Кроме того, количество координат текстуры должно быть задано следующим образом:

  • Если преобразование текстуры и создание текстуры отключены для всех активных этапов текстуры, а D3DPV_DONOTCOPYDATA не задана, число и тип выходных координат текстуры должны соответствовать координатам входной текстуры вершин. Если задано D3DPV_DONOTCOPYDATA, а преобразование текстуры и создание текстур отключены, выходные координаты текстур игнорируются.
  • Если для активных этапов текстуры включено преобразование текстуры или создание текстуры, выходная вершина может содержать больше наборов координат текстуры, чем входная вершина. Это связано с распространением координат текстуры из тех, которые создаются в результате создания текстуры или получены преобразованиями текстуры. Обратите внимание, что аналогичное увеличение координат текстуры происходит во время вызовов IDirect3Device9::D primitive , но невидимо для программиста приложения. В этом случае Direct3D создает новый набор координат текстуры. Новый набор координат текстуры получается путем пошагового прохождения этапов текстуры и анализа параметров создания текстуры, преобразования текстуры и индекса координат текстуры, чтобы определить, требуется ли уникальный набор координат текстуры для этого этапа. Каждый раз, когда требуется новый набор, он выделяется в порядке увеличения. Обратите внимание, что максимальное и типичное требование составляет один набор для каждого этапа, хотя это может быть меньше из-за совместного использования нетрансформированных координат текстуры через D3DTSS_TEXCOORDINDEX.

Таким образом, для каждого этапа текстуры создается новый набор координат текстуры, если текстура привязана к этой стадии и выполняется любое из следующих условий:

  • Для этого этапа включено создание текстур.
  • Преобразование текстуры включено для этого этапа.
  • Непереводимые входные координаты текстуры впервые ссылаются через D3DTSS_TEXCOORDINDEX.

Когда Direct3D создает координаты текстуры, приложение должно выполнять следующие действия:

  1. Используйте буфер вершин назначения с соответствующим использованием FVF.
  2. Перепрограммируйте D3DTSS_TEXCOORDINDEX этапа текстуры в соответствии с размещением координат постобработки текстуры. Обратите внимание, что перепрограммирование параметра D3DTSS_TEXCOORDINDEX происходит при использовании обработанного буфера вершин в последующих вызовах IDirect3DDevice9::D rawPrimitive и IDirect3DDevice9::D rawIndexedPrimitive .

Наконец, размерность координат текстуры (D3DFVF_TEX0 до D3DFVF_TEX8 ) должна быть задана следующим образом:

  • Для каждого набора координат текстуры, если преобразование текстуры и создание текстуры отключены, размерность выходной координаты текстуры должна соответствовать входным данным. Если преобразование текстуры включено, размерность выходных данных должна соответствовать количеству, определенному параметрами D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 или D3DTTFF_COUNT4. Если преобразование текстуры отключено и включено создание текстуры, то размерность выходных данных должна соответствовать параметрам режима создания текстуры; В настоящее время все режимы создают три значения с плавающей точкой.

Если IDirect3DDevice9::P rocessVertices завершается сбоем из-за несовместимого кода FVF буфера вершин назначения, ожидаемый код выводится в выходные данные отладки (только для отладочных сборок).

Буферы вершин