Sumber Daya Tekstur Volume (Direct3D 9)

Tekstur volume adalah koleksi piksel tiga dimensi (texel) yang dapat digunakan untuk melukis primitif dua dimensi seperti segitiga atau garis. Koordinat tekstur tiga elemen diperlukan untuk setiap puncak primitif yang akan diteksur dengan volume. Saat primitif digambar, masing-masing piksel yang terkandung diisi dengan nilai warna dari beberapa piksel dalam volume, sesuai dengan aturan yang dianalogikan dengan huruf tekstur dua dimensi. Volume tidak dirender secara langsung karena tidak ada primitif tiga dimensi yang dapat dicat dengannya.

Anda dapat menggunakan tekstur volume untuk efek khusus seperti kabut patchy, ledakan, dan sebagainya.

Volume diatur ke dalam irisan dan dapat dianggap sebagai lebar x permukaan tinggi 2D yang ditumpuk untuk membuat lebar x tinggi x volume kedalaman. Setiap ikatan adalah satu baris. Volume dapat memiliki tingkat berikutnya di mana dimensi setiap tingkat dipotong menjadi setengah dimensi dari tingkat sebelumnya. Diagram berikut menunjukkan seperti apa tekstur volume dengan beberapa tingkatan.

diagram tekstur volume dengan representasi kubus 8x2x4, 4x1x2, dan 2x1x1

Membuat Tekstur Volume

Contoh kode di bawah ini menunjukkan langkah-langkah yang diperlukan untuk menggunakan tekstur volume.

Pertama, tentukan jenis verteks kustom yang memiliki tiga koordinat tekstur untuk setiap puncak, seperti yang ditunjukkan dalam contoh kode ini.

struct VOLUMEVERTEX
{
    FLOAT x, y, z;
    DWORD color;
    FLOAT tu, tv, tw;
};

#define D3DFVF_VOLUMEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|
                             D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE3(0))

Selanjutnya, isi simpul dengan data.

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

Sekarang, buat buffer vertex dan isi dengan data dari simpul.

Langkah selanjutnya adalah menggunakan metode IDirect3DDevice9::CreateVolumeTexture untuk membuat tekstur volume, seperti yang ditunjukkan dalam contoh kode ini.

LPDIRECT3DVOLUMETEXTURE9 pVolumeTexture;
d3dDevice->CreateVolumeTexture( 8, 4, 4, 1, 0, D3DFMT_R8G8B8,D3DPOOL_MANAGED, 
                                &pVolumeTexture );

Sebelum merender primitif, atur tekstur saat ini ke tekstur volume yang dibuat di atas. Contoh kode di bawah ini menunjukkan seluruh proses penyajian untuk strip segitiga.

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

Tekstur Direct3D