Поделиться через


Ресурсы текстур тома (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 }
};

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

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

Текстуры Direct3D