directdraw - verzerrtes bild
-
Morgen
Weiß jemand, aus welchem Grund ddraw dieses bild nicht voll ausfüllt?
http://img252.imageshack.us/img252/475/ddrawcubedist.png
die auflösung ist 640 x 480 x 32, und die schleife läuft garantiert über soviele Elemente:
for (size_type i = 0; i < width * height; i++) p[i].r = 255;
wobei p der pointer auf DDSURFACEDESC::lpSurface ist und sizeof (p[0]) == 4.
Wenn jedoch sizeof (p[0]) == 5, wird das Bild voll ausgefüllt, was ziemlich bizarr ist. Jedenfalls gibt es aber auch dann keine korrekte darstellung.Initialisiere ich ddraw eventuell falsch?
HRESULT R; R = DirectDrawCreate (0, &Device, 0); if (R != DD_OK) return false; R = Device->SetCooperativeLevel (WindowHandle, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX); if (R != DD_OK) return false; R = Device->SetDisplayMode (Width, Height, Depth); if (R != DD_OK) return false; Description.dwSize = sizeof (Description); Description.dwFlags = DDSD_CAPS; Description.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; R = Device->CreateSurface (&Description, &Primary, 0); if (R != DD_OK) return false;
Ich vermute der fehler liegt bei mir, da dxdiag sagt dass ddraw aktiviert ist. Alternativ könnte es an windows 7 liegen, aber ich bin nicht sicher. Auf xp ging es noch.
-
Hast du den pitch beachtet?
Schön, wir haben den Grafikspeicher angefordert. Nur kann man damit nichts anfangen solange man die Position des Grafikspeichers im linearen 32Bit-Adressbereich nicht kennt. Ein simpler Aufruf der Lock-Funktion der Surface gibt die Adresse aus und erlaubt dem Programm, den Speicherbereich zu beschreiben. Ein weiterer Wert wird zurückgeliefert, der sogenannte Pitch. Er gibt die Anzahl von Bytes an, um die jede Bildschirmzeile verlängert ist bevor die neue Zeile anfängt. Den Pitch sollte man nicht beschreiben, da er ein Teil einer anderen Surface oder als Cache,... verwendet werden könnte.
-
nein, ich wusste nichts vom pitch. Danke.