Um den Bildbuffer direkt zu manipulieren, muss man erstmal wissen, wie der aufgebaut ist.
Der Buffer besteht aus zeilen und spalten, dabei hat jedes Pixel der gewählten farbtiefe entsprechen viele Bytes platz, in denen die Farbinformation gespeichert ist.
Chematisch:
-------------------------------------------------------------
zeile | Pixel || Pixel |
| Byte 1 | byte 2 | byte 3 || Byte 1 | byte 2 | byte 3| . . .
| Rot | Grün | Blau || Rot | Grün | Blau |
-------------------------------------------------------------
zeile | Pixel || Pixel |
| Byte 1 | byte 2 | byte 3 || Byte 1 | byte 2 | byte 3| . . .
| Rot | Grün | Blau || Rot | Grün | Blau |
-------------------------------------------------------------
zeile | Pixel || Pixel |
| Byte 1 | byte 2 | byte 3 || Byte 1 | byte 2 | byte 3| . . .
| Rot | Grün | Blau || Rot | Grün | Blau |
-------------------------------------------------------------
Um die Farbinformation zu Manipulieren muss man mit dem befehl
erstmal wissen, wo überhaupt der Drawingbuffer anfängt, wenn der wert nicht 0 ergibt, kann man andere benötigte informationen bedenkenlos einsetzen, wenn der wert 0 ergibt, ging irgentetwas schief und man kann nicht direkt auf den Buffer zugreifen !
Andere benötigte informationen:
Das Format, in dem die Farbinformationen abgelegt werden.
Die länge in bytes einer Zeile.
Beachte:
Mit den Hier genannten Methoden wird der Backbuffer beschrieben !
Die genanten Befehle müssen nach dem Starten des Zeichenforgangs auf den Gewünschten Bildschirm ausgeführt werden !
Das Pixelformat der Drawingbuffers kann folgende werte annehmen:
#PB_PixelFormat_8Bits
Format:
Nach der gewählten Farbpalette
#PB_PixelFormat_15Bits
Format:
5 Bit: Rot
5 Bit: Grün
5 Bit: Blau
#PB_PixelFormat_16Bits
Ist im forum genau beschrieben
#PB_PixelFormat_24Bits_RGB
8 Bit: Rot
8 Bit: Grün
8 Bit: Blau
#PB_PixelFormat_24Bits_BGR
8 Bit: Blau
8 Bit: Grün
8 Bit: Rot
#PB_PixelFormat_32Bits_RGB
? : Ist irgentwo im forum beschrieben
Fermutet (einfachste lösung):
8 Bit: Rot
8 Bit: Grün
8 Bit: Blau
rest : ?
#PB_PixelFormat_32Bits_BGR
? : Ist irgentwo im Forum beschrieben
Vermutet (einfachste lösung):
8 Bit: Blau
8 Bit: Grün
8 Bit: Rot
rest : ?
Und noch etwas code zu verdeutlichung:
Code: Alles auswählen
Structure Buffer
xauf.l
yauf.l
tiefe.l
titel.s
bufferadresse.l
bufferzeile.l
bufferformat.l
EndStructure
;werte initialisieren:
aktuell.Buffer\xauf = 800
aktuell.Buffer\yauf = 600
aktuell.Buffer\tiefe = 32
aktuell.Buffer\titel = "Buffer"
;initialisiering:
If InitSprite() = 0
MessageRequester("Fehler !", "Konnte die DirectX 7.0 anzeige-umgebung nicht initialisieren !")
End
EndIf
;Öffnen des Bildschirmes:
If OpenScreen(aktuell.Buffer\xauf,aktuell.Buffer\yauf,aktuell.Buffer\tiefe,aktuell.Buffer\titel) = 0
MessageRequester("Fehler !", "Konnte einen Bildschirm mit den Massen: "+Str(aktuell.Buffer\xauf)+"x"+Str(aktuell.Buffer\yauf)+"x"+Str(aktuell.Buffer\tiefe)+" nicht öffnen !")
End
EndIf
If StartDrawing(ScreenOutput()) = 0
MessageRequester("Fehler !","Konnte auf den Bildschirm nicht zeichnen !")
End
Else
;adresse initialisieren :
aktuell.Buffer\bufferadresse = DrawingBuffer()
;andere Benötigte daten holen:
aktuell.Buffer\bufferformat = DrawingBufferPixelFormat() ;müsste 7 ergeben
aktuell.Buffer\bufferzeile = DrawingBufferPitch()
StopDrawing()
EndIf
;überprüfen:
If aktuell.Buffer\bufferadresse = 0
MessageRequester("Fehler !","Konnte Den Bildschirmspeicher nicht initialisieren !")
End
EndIf
;format überprüfen(testweise):
If aktuell.Buffer\bufferformat <> 7
MessageRequester("Fehler !","Falsches Faerbformat !")
End
EndIf
;debugen:
Debug aktuell.Buffer\bufferadresse
Debug aktuell.Buffer\bufferformat
Debug aktuell.Buffer\bufferzeile
;Initialisierung beendet !
;======================================================================================
;Die Praxis:
;blau schreiben:
PokeB(aktuell.Buffer\bufferadresse,255)
;nächste zeile:
PokeB(aktuell.Buffer\bufferadresse + aktuell.Buffer\bufferzeile,255)
FlipBuffers()
Delay(8000)
End
PS: Es konnen noch stellenweise Falsche informationen forliegen, dh.: alles ohne Gewähr !