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
-
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*)