Ресурсы текстур тома (Direct3D 9)
Текстуры тома — это трехмерные коллекции пикселей (тексели), которые можно использовать для рисования двумерного примитива, например треугольника или линии. Координаты текстуры из трех элементов требуются для каждой вершины примитива, которая должна быть текстурирована с объемом. При рисовании примитива каждый содержащийся пиксель заполняется значением цвета из некоторого пикселя в пределах громкости в соответствии с правилами, аналогичными двумерному регистру текстуры. Тома не отрисовываются напрямую, так как с их помощью нет трехмерных примитивов.
Вы можете использовать текстуры объема для специальных эффектов, таких как пятнистый туман, взрывы и т. д.
Тома организованы в срезы и могут рассматриваться как 2D-поверхности ширины x высоты, сложенные для создания тома ширины x высоты x глубины. Каждый срез представляет собой одну строку. Тома могут иметь последующие уровни, в которых размеры каждого уровня усекаются до половины измерений предыдущего уровня. На следующей схеме показано, как выглядит текстура тома с несколькими уровнями.
Создание текстуры тома
В приведенных ниже примерах кода показаны шаги, необходимые для использования текстуры тома.
Сначала укажите пользовательский тип вершины с тремя координатами текстуры для каждой вершины, как показано в этом примере кода.
struct VOLUMEVERTEX
{
FLOAT x, y, z;
DWORD color;
FLOAT tu, tv, tw;
};
#define D3DFVF_VOLUMEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|
D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE3(0))
Затем заполните вершины данными.
VOLUMEVERTEX g_vVertices[4] =
{
{ 1.0f, 1.0f, 0.0f, 0xffffffff, 1.0f, 1.0f, 0.0f },
{-1.0f, 1.0f, 0.0f, 0xffffffff, 0.0f, 1.0f, 0.0f },
{ 1.0f,-1.0f, 0.0f, 0xffffffff, 1.0f, 0.0f, 0.0f },
{-1.0f,-1.0f, 0.0f, 0xffffffff, 0.0f, 0.0f, 0.0f }
};
Теперь создайте буфер вершин и заполните его данными из вершин.
Следующим шагом является использование метода IDirect3DDevice9::CreateVolumeTexture для создания текстуры тома, как показано в этом примере кода.
LPDIRECT3DVOLUMETEXTURE9 pVolumeTexture;
d3dDevice->CreateVolumeTexture( 8, 4, 4, 1, 0, D3DFMT_R8G8B8,D3DPOOL_MANAGED,
&pVolumeTexture );
Перед отрисовкой примитива задайте для текущей текстуры созданную выше текстуру тома. В приведенном ниже примере кода показан весь процесс отрисовки для полосы треугольников.
if( SUCCEEDED( d3dDevice->BeginScene() ) )
{
// Draw the quad, with the volume texture.
d3dDevice->SetTexture( 0, pVolumeTexture );
d3dDevice->SetFVF( D3DFVF_VOLUMEVERTEX );
d3dDevice->SetStreamSource( 0, pVB, sizeof(VOLUMEVERTEX) );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);
// End the scene.
d3dDevice->EndScene();
}
Связанные темы