Текстуры с фиксированной функцией DirectX 9 - PullRequest
2 голосов
/ 09 марта 2011

Используя конвейер рендеринга с фиксированными функциями в DirectX 9, довольно легко установить текстуру и вершины рендеринга, выполнив следующие действия:

struct vert { float x, y, z, u, v; };

device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1);
device->SetTexture(0, MyTexture);

//Draw vertices here

Однако я хотел бы добавить дополнительное значение с плавающей запятой к каждой вершине, которое затем умножается на результирующий цвет, выводимый из текстуры. (Таким образом, значение будет между 0 и 1)

EG (псевдокод) Colour = TextureColour(u, v) * CustomFloat

Я думаю, что есть способ использовать device->SetTextureStageState, но я не уверен, как это сделать ... Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Вы можете установить 1D линейную текстуру в градациях серого как вторую текстуру, настроенную для модуляции первой. Затем отправьте одну текстурную координату для второй текстуры (я думаю, указав для нее D3DFVF_TEXCOORDSIZE1). Размышляя здесь - не пробовал сам.

Перефразируя ваш псевдокод: Colour = Texture0Colour(u0, v0) * Texture1Colour(u1)

Редактировать Я думаю, вам нужно:

device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX2 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE1(1)) 

MSDN также имеет аналогичный пример .

0 голосов
/ 09 марта 2011

Можно надеяться, что вы начнете: Состояние цвета для каждой вершины (Direct3D 9) .

Вам нужно использовать FVF так:

D3DFVF_XYZ|D3DFVF_TEX1|D3DFVF_DIFFUSE

и включить использование цвета вершины с помощью:

m_pDevice9->SetRenderState(D3DRS_COLORVERTEX, TRUE);

m_pDevice9->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);

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

...