Я использую Direct3D 9 для рисования линий.
Вершины, которые я использую сейчас, имеют формат D3DFVF_XYZ|D3DFVF_DIFFUSE
и хранятся в буфере вершин. Они нарисованы с DrawPrimitive
как D3DPT_LINELIST
,
Как изменить нарисованный цвет целого буфера вершин или даже конкретной вершины, не блокируя буфер вершин для изменения его содержимого? Это должно быть сделано каждый кадр.
Возможно ли это с буфером вершин? Я бы предпочел решение без пользовательского шейдера (с использованием конвейера direct3d 9 по умолчанию).
Если это невозможно, что будет следующим лучшим решением для повышения производительности? Я могу думать только о блокировке буфера вершин или использовании DrawPrimitiveUP
, И то, и другое довольно ужасно.
Обновлено с кодом решения:
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CONSTANT);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CONSTANT);
m_pDevice->SetTextureStageState(0, D3DTSS_CONSTANT, D3DCOLOR_ARGB(120,0,255,0));
Вершины не нужны FVF_DIFFUSE
больше.
С конвейером фиксированной функции вы можете использовать SetTextureStageState
(доктор) указать постоянный цвет, который следует использовать с D3DTSS_CONSTANT
(доктор). С помощью этой опции вы можете установить цвет для всего вызова.
Других решений пока нет …