думаю не составит труда допилить до нужного эффекта....
первым делом описываем прототип для функции:
Что нам будет нужно? Нам необходимо указывать положение в пространстве:
нужна возможность указывать свои размеры(высота\ширина):
необходимо выбирать цвета начального и конечного цветов:
D3DCOLOR Col_start, D3DCOLOR Col_end,
в задумке нужна возможность выбора ориентации заливки цветом, поэтому указываем "ссылку" на структуру, которую заведем немного позже:
Gradient_orientation orientation_Box ,
ну и конечно же указатель на наше устройство:
IDirect3DDevice9* pDevice
С аргументами для функции мы закончали))
перейдем непосредственно к самому описанию тела:
первым делом заводим структуру для буффера вершин:
static struct D3DVERTEX
{
int x,
y,
z;
D3DCOLOR color;
}
теперь описыываем сам буффер:
Buff_Vertex[4] = {
{0,0,0,1.0f,0},
{0,0,0,1.0f,0},
{0,0,0,1.0f,0},
{0,0,0,1.0f,0}};
заполняем буффер согласно нашей структуре:
Buff_Vertex[0].x = x;
Buff_Vertex[0].y = y;
Buff_Vertex[0].color = Col_start;
Buff_Vertex[1].x = x+w;
Buff_Vertex[1].y = y;
Buff_Vertex[1].color = orientation_Box == horizontal ? Col_end : Col_start;
Buff_Vertex[2].x = x;
Buff_Vertex[2].y = y+h;
Buff_Vertex[2].color = orientation_Box == horizontal ? Col_start : Col_end;
Buff_Vertex[3].x = x+w;
Buff_Vertex[3].y = y+h;
Buff_Vertex[3].color = Col_end;
немного поясню этот код, думаю многим из вас эта структура не известна:
orientation_Box == horizontal ? Col_end : Col_start;
эта запись равносильна этой:
if(a==b)
{
выполняем если условия соблюдены
}
else
{
выполняем если условия НЕ соблюдены
}
Теперь нарисуем созданный нами буффер вершин:
pDevice->SetTexture(0, NULL);
pDevice->SetPixelShader( 0 );
pDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE);
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
pDevice->SetRenderState(D3DRS_ZENABLE , FALSE);
pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,Buff_Vertex,sizeof(D3DVERTEX));
С самой функцией все)
теперь опишем структуру для направления заливки:
enum Gradient_orientation
{
horizontal,
vertical
};
использовать ее так:
Для горизонтальной заливки
Gradient_Box(.....,horizontal ,..... );
Для вертикальной заливки
Gradient_Box(.....,vertical ,..... );
Получается примерно следующее:
ЗЫ: Писал этот пост для другого сайта и с другой целью, но думаю будет в тему)