Ресурсы текстур тома (Direct3D 9)

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

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

Тома упорядочены в срезы и могут рассматриваться как ширина х высоты 2D поверхностей, сложенных для создания тома глубины x ширины x высоты x. Каждый срез является одной строкой. Тома могут иметь последующие уровни, в которых размеры каждого уровня усечены до половины измерений предыдущего уровня. На следующей схеме показано, как выглядит текстура тома с несколькими уровнями.

схема текстуры тома с 8x2x4, 4x1x2 и 2x1x1 кубом

Создание текстуры тома

В приведенных ниже примерах кода показаны шаги, необходимые для использования текстуры тома.

Сначала укажите пользовательский тип вершины с тремя координатами текстуры для каждой вершины, как показано в этом примере кода.

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 }
};

Теперь создайте буфер вершин и заполните его данными из вершин.

Следующий шаг — использовать метод IDirect3Device9::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();
}

Текстуры Direct3D