Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Wie Pixel in C DirectDraw zeichnen?

BloodC@ / 2 Antworten / Baumansicht Nickles

Hi,

wie zeichnet man ein Pixel an der Position x, y mit der und der Farbe auf ein Surface in DirectDraw mit C ? Wie man alles initialisiert weiß ich. Das ganze sollte sehr schnell sein, da ich jedes Pixel bei 640*480 einzeln ansprechen will (gibt so ne Art 3D Engine).

bei Antwort benachrichtigen
BloodC@ Nachtrag zu: „Wie Pixel in C DirectDraw zeichnen?“
Optionen

Hmm irgendwie hat er das PlusPlus bei C verschluckt -_-

bei Antwort benachrichtigen
Dreamforger BloodC@ „Wie Pixel in C DirectDraw zeichnen?“
Optionen

Ich habe nur mit Dx7 gearbeitet, aber das Konzept wird sich nicht so stark geändert haben.

1. Surface Lock
Zuerst rufst du Lock für die ganze Surface die du beschreiben willst auf. Du kannst zwar auch nur teile der Surface Lock-en aber probiers erstmal so.

2. Pointer auf die Oberfläche
Beim Lock bekommst du eine DDSURFACEDESC struct zurück. Da ist ein Feld lpvoid lpSurface drin. Dieser Pointer zweigt auf das erste Pixel oben links (0,0).

3a. Welches Pixel (Zeile)?
Jetzt wirds ein bischen haarig: die Zeilen sind jeweils 'pitch' bytes ausseinander. Den pitch Wert bekommst du aus derselben DDSURFACEDESC struktur. Das heist um in die 4te Zeile zu kommen muss der surface-pointer auf LPBYTE gecasted werden und dann um 4*pitch erhöht werden. 4*pitch weil die oberste Zeile die 0 ist.

3b. Welches Pixel (Spalte)?
Nachdem jetzt der Pointer auf der richtigen Zeile steht muss er noch in die richtige Spalte. Je nachdem welche Farbtiefe du verwendest muss der Pointer entsprechend weiterbewegt werden. Nachdem du das Pixel nachher auch wieder beschreiben willst solltest du den Pointer gleich entsprechend umcasten. dh für 16 Bit auf LPWORD und für 32 Bit auf LPDWORD. Diesen neuen Pointer verschiebst du dann um soviele Spalten wie nötig. Durch den richtigen Datentyp von LPWord oder LPDWORD geht das einfach mittels +spalte

4. Und was schreiben wir da jetzt rein?
Jetzt schauen wir uns mal das Pixelformat der Surface an. Da sind für R(ed), G(reen) und B(lau) jeweils eine BitMask. Du musst jetzt die Farbe (in RGB) zusammenquetschen sodass sie in diese Bitmasks passen und danach die gequetschten Farbanteile mit Bitweisem Oder (|) verknüpfen.
Wie quetscht man? zuerst bestimmst du die Anzahl der Bits in der Maske. Ich geh das mal am Beispiel von Rot im normalen 16 Bit Modus ( 5:6:5) durch. Deine Farbkomponente von Rot wurde inter mit 8 Bit berechnet (behaupte ich mal). Das heist du musst Rot runterrechnen, und zwar um 8-5=3 Bit. Das geht am besten mittels Bitschift rechts (>>). Als nächstes schiebst du die verblieben Bits nach links bis sie in der Bitmaske liegen. In diesem Fall um 5(für blau) + 6(für grün) = 11 Bits. Wieder am besten mittels Bitschift nur diesmal nach links (
5. Surface wieder freigeben
Mittels Unlock

Bemerkung:
Punkt 4 ist ziemlich ätzend und auf dauer auch noch zeitaufwendig. Da sich das Pixelformat jedoch nicht wärend der Anwendung ändert kannst ud den größten Teil beim erschaffen der Surface vorbereiten.

Bemerkung 2:
Den Surface-Pointer kannst du dir nicht aufheben! Der ist nur vom Lock bis zum Unlock gültig

Bemerkung 3:
Willst du nicht vieleicht gleich Direct 3D verwenden? Nicht das damit ganz drumrum kommst mit Pixeln zu arbeiten, aber eine 3D Engine ist da schon leichter zu schreiben

Viel Spass

bei Antwort benachrichtigen