Исправлена обработка вершин функции (Direct3D 9)
В конвейере вершин фиксированной функции обработка вершин в буфере вершин применяет текущие матрицы преобразования для устройства. Операции вершин, такие как освещение, создание флагов клипа и обновление экстентов, также могут применяться при необходимости. При использовании обработки вершин фиксированной функции изменение элементов в целевом буфере вершин управляется флагом D3DPV_DONOTCOPYDATA. Этот флаг применяется только к фиксированной обработке вершин функции. ИнтерфейсIDirect3Device9предоставляет метод IDirect3Device9::P rocessVertices для обработки вершин. Вершины от вершинного шейдера обрабатываются в набор входных потоков данных, создавая один поток переплетированных данных вершин в буфер вершин назначения путем вызова метода IDirect3Device9::P rocessVertices. Метод принимает пять параметров, описывающих расположение и количество вершин, целевых объектов метода, буфера вершин назначения и параметров обработки. После вызова целевой буфер содержит обработанные данные вершин.
Первые, второй и третий параметры, SrcStartIndex, DestIndex и VertexCount отражают индекс первой вершины для загрузки, индекс в целевом буфере, на котором будут размещены вершины, а также общее количество вершин для обработки и размещения в целевом буфере соответственно. Четвертый параметр pDestBuffer должен быть задан в адрес интерфейса IDirect3DVertexBuffer9 объекта буфера вершин, который получит исходные вершины. Параметр SrcStartIndex указывает индекс, с которого метод должен начать обработку вершин.
Окончательный параметр, флаги, определяет специальные параметры обработки для метода. Этот параметр можно задать значение 0 для обработки вершин по умолчанию или D3DPV_DONOTCOPYDATA для оптимизации обработки в некоторых ситуациях. Можно также объединить значение D3DPV_DONOTCOPYDATA с одним или несколькими значениями D3DLOCK, подходящими для целевого буфера. Если присвоить флагам значение 0, компоненты вершинного буфера конечной вершины, не затронутые операцией вершин, по-прежнему копируются из шейдера вершин или имеют значение 0. Однако при использовании D3DPV_DONOTCOPYDATA IDirect3Device9::P rocessVertices не перезаписывает сведения о координатах цветов и текстур в буфере назначения, если только эти данные не создаются Direct3D. Диффузный цвет создается при включении освещения, то есть D3DRS_LIGHTING задано значение TRUE. Зрительного цвета создается при включении освещения и включена спецификация, то есть для D3DRS_SPECULARENABLE и D3DRS_LIGHTING задано значение TRUE. Зриемый цвет также создается при включении тумана. Координаты текстур создаются при включении преобразования текстур или создания текстур. IDirect3Device9::P rocessVertices использует текущее состояние отрисовки, чтобы определить, какую обработку вершин следует выполнить.
Параметры использования FVF для целевых буферов вершин
Метод IDirect3Device9::P rocessVertices требует определенных параметров для D3DFVF целевого буфера вершин. Параметры использования FVF должны быть совместимы с текущими параметрами обработки вершин.
Для обработки вершин фиксированной функции IDirect3Device9::P rocessVertices требуются следующие параметры FVF:
- Тип позиции всегда D3DFVF_XYZRHW; поэтому D3DFVF_XYZ и D3DFVF_XYZB1 через D3DFVF_XYZB5 недопустимы.
- Флаги D3DFVF_NORMAL, D3DFVF_RESERVED0 и D3DFVF_RESERVED2 не должны быть заданы.
- Флаг D3DFVF_DIFFUSE должен быть задан, если операция OR следующих условий возвращает значение true:
- Освещение включено; то есть D3DRS_LIGHTING TRUE.
- Освещение отключено, диффузный цвет присутствует в входных потоках вершин, и D3DPV_DONOTCOPYDATA не задано.
- Флаг D3DFVF_SPECULAR должен быть задан, если операция OR следующих условий возвращает значение true:
- Освещение включено, а цвет с зеркальным цветом включен; то есть D3DRS_SPECULARENABLE TRUE.
- Освещение отключено, спектрулярный цвет присутствует в входных потоках вершин, и D3DPV_DONOTCOPYDATA не заданы.
- Включено туман вершины; то есть D3DRS_FOGVERTEXMODE не задано значение D3DFOG_NONE.
Кроме того, счетчик координат текстуры должен быть задан следующим образом:
- Если преобразование текстуры и создание текстур отключены для всех активных этапов текстуры, а D3DPV_DONOTCOPYDATA не задано, то для соответствия координатам входной вершины требуется число и тип координат выходной текстуры. Если D3DPV_DONOTCOPYDATA задано, а преобразование текстур и создание текстур отключены, то координаты выходных текстур игнорируются.
- Если преобразование текстуры или создание текстур включено для любых активных этапов текстуры, выходные вершины могут содержать больше наборов координат текстур, чем входная вершина. Это связано с распространением координат текстуры от тех, которые создаются с помощью создания текстуры или производных от преобразований текстур. Обратите внимание, что аналогичное распространение координат текстур происходит во время вызовов IDirect3DEvice9::D rawPrimitive, но не отображается программисту приложений. В этом случае Direct3D создает новый набор координат текстур. Новый набор координат текстуры является производным путем пошагового прохождения этапов текстуры и анализа параметров для создания текстуры, преобразования текстуры и индекса координат текстуры, чтобы определить, требуется ли для этого этапа уникальный набор координат текстуры. Каждый раз, когда требуется новый набор, он выделяется в растущем порядке. Обратите внимание, что максимальное и типичное требование составляет один набор на каждый этап, хотя это может быть меньше из-за общего доступа к нетрансформированных координатам текстуры через D3DTSS_TEXCOORDINDEX.
Таким образом, для каждого этапа текстуры создается новый набор координат текстуры, если текстура привязана к этой стадии, и любое из следующих условий имеет значение true:
- Для этого этапа включено создание текстур.
- Преобразование текстур включено для этого этапа.
- Координаты нетрансформированных входных текстур ссылаются через D3DTSS_TEXCOORDINDEX в первый раз.
Если Direct3D создает координаты текстур, приложение требуется для выполнения следующих действий:
- Используйте буфер вершин назначения с соответствующим использованием FVF.
- Перепрограммируйте D3DTSS_TEXCOORDINDEX этапа текстуры в соответствии с размещением координат после обработки текстуры. Обратите внимание, что перепрограммирование параметра D3DTSS_TEXCOORDINDEX происходит при использовании обработанного буфера вершин в последующих вызовах IDirect3Device9::D rawPrimitive и IDirect3Device9::D rawIndexedPrimitive.
Наконец, размерность координат текстуры (D3DFVF_TEX0 через D3DFVF_TEX8) должна быть задана следующим образом:
- Для каждого набора координат текстуры, если преобразование текстур и создание текстур отключены, то размерность выходной текстуры должна соответствовать входным данным. Если преобразование текстуры включено, то размерность выходных данных должна соответствовать количеству, определенному параметрами D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 или D3DTTFF_COUNT4. Если преобразование текстуры отключено и включено создание текстур, выходные измерения должны соответствовать параметрам режима создания текстур; В настоящее время все режимы создают три значения с плавающей запятой.
Если IDirect3Device9::P rocessVertices завершается ошибкой из-за несовместимого конечного буфера FVF конечного буфера вершин, ожидаемый код выводится в выходные данные отладки (только сборки отладки).
Связанные разделы