Direct3D9 - Textur generieren



  • Hey,

    ich möchte eine Lightmap generieren in Direct3D 9.
    Die Farbdaten liegen in einem [128][128][3] Byte Array vor (RGB).

    Ich nehme mal an, dass ich mittels CreateTexture eine Textur erstellen muss. Aber wie kann ich in diese dann schreiben?

    Vielen Dank


  • Mod

    was stimmt denn mit dem texture tutorial aus dem directX sdk nicht?



  • kurzform:
    IDirect3DDevice9::CreateTexture liefert IDirect3DTexture9*
    IDirect3DTexture9::LockRect liefert D3DLOCKED_RECT
    in D3DLOCKED_RECT::pBits schreiben und D3DLOCKED_RECT::Pitch beachten.
    IDirect3DTexture9::UnlockRect



  • rapso schrieb:

    was stimmt denn mit dem texture tutorial aus dem directX sdk nicht?

    Eh wo gibts denn da eins, wie man Texturen generiert? also nicht einfach nur läd

    @hellihjb: merci, wunderbar



  • dazu brauchst du die funktion D3DXCreateTextureFromFileInMemoryEx (EX weils nix besseres gib :D)

    zuerst brauchste aber ne richtige header structur ... ohne die ist es "sinnlos":

    struct s_bmpheader
    {
        unsigned short  wegdamit; //hatte nen problem und das war die lösung *G*
        unsigned short  type;                //"BM"	
        DWORD    size;                       //grösse der "datei" inkl header also höhe mal breite mal bytes/pixel + 54
        DWORD    reserved;                   // auf 0
        DWORD    bitmap_offset;	             // beginnt in der regel ab 54 bzw 0x36
        DWORD    header_size;                // pi mal daum 40 bzw 0x28
        DWORD    xsize;                      // width bzw breite
        DWORD    ysize;                      // heigth bzw höhe
        unsigned short   planes;             //anzahl der bilder ... 1
        unsigned short   bits_per_pixel;     //steht schon da ;)
        DWORD    compression;                // BMP wtf?! 0
        DWORD    bitmap_size;                //höhe*breite*bytes/pixel
        DWORD    horizontal_resolution;      //... wozu ... 2834 ist "standard"
        DWORD    vertical_resolution;        //... wozu ... 2834 ist "standard"
        DWORD    num_colors;                 //0
        DWORD    num_important_colors;       //0
    };
    

    so nun brauchste noch einen Puffer wo die daten, bis zum erstellen der textur, abgelegt werden. Grösse is hier das was beim header in size eingetragen wird.

    zB so:

    LPVOID *buffer = malloc(size);
    

    anschliessend kopierst du die structur in den Puffer:

    s_bmpheader bmph;
    //hier kommen dann die zuweisungen und erstellen des buffers hin
    memcpy(buffer,&bmph.type,size);
    

    anschliessend kannst du die daten eben so "rein kopieren"
    und am ende ...:

    D3DXIMAGE_INFO di;
    di.Depth =....;
    di.Format = D3DFMT_.....; //das format per strg+leertaste
    di.Height = ....;
    di.ImageFileFormat = D3DXIFF_BMP;
    di.MipLevels=0;
    di.ResourceType = D3DRTYPE_TEXTURE;
    di.Width=....;
    HRESULT hr;
    hr=D3DXCreateTextureFromFileInMemoryEx(d3dDevice,&buffer,
                                           size,xsize,ysize,1,0,D3DFMT_A8R8G8B8,
                                           D3DPOOL_DEFAULT,D3DX_DEFAULT,					  D3DX_DEFAULT,0,&di,NULL,&textur);
    if(hr!=S_OK)
    {
        //fehler behandeln etc....
    }
    

    hat heute bei mir wunderbar gefunzt 😃

    schätze ma da war MS zu faul in die Dou zunehmen (wäre ja zuviel vorteil für die anderen *G*)


Anmelden zum Antworten