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


Буферы вершин (Direct3D 9)

Буферы вершин, представленные интерфейсом IDirect3DVertexBuffer9 , являются буферами памяти, содержащими данные вершин. Буферы вершин могут содержать любой тип вершин — преобразованный или нетрансформированный, освещенный или неосветленный, который можно отрисовывать с помощью методов отрисовки в интерфейсе IDirect3Device9 . Вершины в буфере вершин можно обрабатывать для выполнения таких операций, как преобразование, освещение или создание флагов кадрирования. Преобразование выполняется во всех случаях.

Гибкость буферов вершин делает их идеальным механизмом промежуточного хранения для многократного использования преобразованной геометрии. Можно создать один буфер вершин, преобразовать, осветить и кадрировать вершины в нем, а затем отрисовать модель в сцене столько раз, сколько нужно, — без повторного ее преобразования, даже если отрисовка перемежается с изменениями состояния отрисовки. Это удобно делать при отрисовки моделей, в которых используется множество текстур: геометрия преобразовывается только один раз, после чего ее части можно отрисовывать по необходимости, перемежая отрисовку необходимыми изменениями текстур. Изменения состояния отрисовки, происходящие после обработки вершин, вступают в силу при следующей обработке вершин.

Описание

Буфер вершин описывается с точки зрения его возможностей: если он может существовать только в системной памяти, если он используется только для операций записи, а также тип и количество вершин, которые он может содержать. Все эти черты находятся в D3DVERTEXBUFFER_DESC структуре.

Элемент Format имеет значение D3DFMT_VERTEXDATA, чтобы указать, что это буфер вершин. Тип определяет тип ресурса буфера вершин. Элемент структуры использования содержит общие флаги возможностей. Флаг D3DUSAGE_SOFTWAREPROCESSING указывает, что буфер вершин используется для программной обработки вершин. Наличие флага D3DUSAGE_WRITEONLY в разделе Использование указывает, что память буфера вершин используется только для операций записи. Это освобождает драйвер от размещения данных вершин в лучшем расположении памяти, чтобы обеспечить быструю обработку и отрисовку. Если флаг D3DUSAGE_WRITEONLY не используется, драйвер с меньшей вероятностью помещает данные в место, которое неэффективно для операций чтения. Это приносит в жертву некоторую скорость обработки и отрисовки. Если этот флаг не указан, предполагается, что приложения выполняют операции чтения и записи с данными в буфере вершин.

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

Член Size хранит размер данных буфера вершин в байтах. Член FVF содержит комбинацию D3DFVF , которая определяет тип вершин, содержащихся в буфере.

Пул памяти и использование

Буферы вершин можно создать с помощью метода IDirect3DDevice9::CreateVertexBuffer , который принимает параметры пула (класс памяти) и параметры использования. IDirect3DDevice9::CreateVertexBuffer также можно создать с указанным кодом FVF для использования в обработке вершин фиксированной функции или в качестве выходных данных вершин процесса. Дополнительные сведения см. в разделе Буферы вершин FVF (Direct3D 9).

Флаг D3DUSAGE_SOFTWAREPROCESSING можно установить, если для этого устройства включена обработка вершин в смешанном режиме или программном режиме (D3DCREATE_MIXED_VERTEXPROCESSING или D3DCREATE_SOFTWARE_VERTEXPROCESSING). D3DUSAGE_SOFTWAREPROCESSING необходимо задать, чтобы буферы использовались при программной обработке вершин в смешанном режиме, но это не должно быть задано для достижения максимальной производительности при использовании аппаратной обработки вершин в смешанном режиме. (D3DCREATE_HARDWARE_VERTEXPROCESSING). Однако настройка D3DUSAGE_SOFTWAREPROCESSING является единственным вариантом, если один буфер должен использоваться как с аппаратной, так и с программной обработкой вершин. D3DUSAGE_SOFTWAREPROCESSING разрешено как для смешанных, так и для программных устройств.

Буферы вершин и индексов можно принудительно поместить в системную память, указав D3DPOOL_SYSTEMMEM, даже если обработка вершин выполняется на оборудовании. Это способ избежать слишком больших объемов памяти, заблокированной страницей, когда драйвер помещает эти буферы в память AGP.

В этом разделе представлены основные понятия, необходимые для понимания и использования буферов вершин в приложении Direct3D. Сведения делятся на следующие разделы.

Ресурсы Direct3D

Отрисовка из буферов вершин и индексов (Direct3D 9)

Буферы индексов (Direct3D 9)