HILFE! Surfaces und ihre kleinen Geheimnisse...



  • Pitch braucht man um zB einen Pixel innerhalb eines Speicher-Arrays richtig zu adressieren...

    da das ziemlich abstrakt ist, mal'n beispiel 🙂

    Zeilenbreite(dwWidth): 640
    Zeilenhöhe: 480

    so, jetzt hat man bei einer Farbtiefe von 16 Bit zB einen Zeiger aufs Videomemory:

    USHORT* pVideoMem;

    Um jetzt einen Pixel zu schreiben, könnte man denken, macht man des so:

    pVideoMem[XPos+YPos*dwWidth]=FARBE;

    das kann zwar richtig funktionieren bei manchen Grafikkarten, muss es aber nicht!

    warum? es kann sein, daß der Pitch, also der Speicherbedarf pro Speicherzeile des Videomemorys nicht 2(Byte Farbtiefe)*640 ist, sondern etwas größer.

    Wenn das der Fall ist ist die Adressierung pVideoMem[XPos+YPos*dwWidth] für den Pixel (XPos,YPos) nicht mehr korrekt!

    für jede Grafikkarte kompatibel ist dieser Code:

    pVideoMem[XPos+YPos*(Pitch/BytesProPixelFarbtiefe)]=FARBE;

    Die Variablennamen erklären sich hoffentlich von selber;)

    [ Dieser Beitrag wurde am 03.02.2003 um 14:22 Uhr von crass editiert. ]



  • pVideoMem[XPos+YPos*(Pitch/BytesProPixelFarbtiefe)]=FARBE;

    Könnte die Variable FARBE also einfach ein integer sein?
    ODer muss es ein 2Byte-Wert sein?

    PH



  • In jedem Fall wird der Wert in ein USHORT(2Byte) konvertiert(weiß nicht sicher ob man casten muß oder ob es automatisch gemacht wird) Es werden also nur 2 Bytes geschrieben und wenn der int eine Zahl ist die nicht in die 2 Bytes von USHORT reinpasst (zB 1.000.000.000), kommt ein falscher Wert bei raus

    [ Dieser Beitrag wurde am 03.02.2003 um 14:41 Uhr von crass editiert. ]



  • Ich würde mal sagen, das hängt davon ab, mit welcher Farbtiefe du arbeitest!
    Wie du den Farbwert konvertieren muss, hängt vom gewählten Modus ab (Palette, 16bit (x555 od. a555 od. 565 usw.), 24bit (888), 32bit (a888))



  • ja natürlich, die Frage bezog sich ja auf 16 Bit und einen Zeiger USHORT pVideoMem;



  • Ganz generell der Datentyp auf den pVideoMem zeigt, muß der für die einzelnen Pixel sein...falls es da jetzt Mißverständnisse gab



  • Hi!
    ICh wiß nicht wie es euch geht. Aber ich hab es nicht verstanden ?
    jeder Pixel hat einen Speicherbereich von 4Bye bei 32Bit Farbtiefe.
    Was hat das mit der Breite und Höhe zu tun ?



  • vielleicht hilft diese überlegung:

    wenn man sich den videospeicher der grafikkarte als 2dimensonales Abbild vorstellt, ähnlich wie der Computerbildschirm, ist unter Umständen ein Stück des rechten Teils dieses Abbilds außerhalb des rechten Bilschirmrandes. Breite in Pixel gibt nun den sichtparen Bereich in Pixeln an. Pitch gibt die Breite in Bytes an, einschließlich dieses Offscrenn-Bereichs

    [ Dieser Beitrag wurde am 04.02.2003 um 10:04 Uhr von crass editiert. ]



  • Hi!
    Ok, das klingt logisch. Aber der Zusammenhang ist mir´irgentwie nicht klar.



  • Du meinst den Zusammenhang mit der Pixeladressierung?

    Naja ..du hast zB Grafikmoudes 640*480*8

    der Zeiger BYTE* pVideo zeigt auf den Anfang des Videospeichers.

    Ein Byte is bei dem Beispiel gleichwertig mit einem Pixel...die Einheit von dwWidth und Pitch is also gleich groß...

    der Pitch is jetz aber aus welchem Grund auch immer ned 640, sondern zB 666.

    bei der Adressierung pVideo[1000];

    welcher Pixel wird angesprochen?

    Man könnte denken der mit den Koordinaten ( 360 | 1) -> 1*640 + 360 = 1000

    stimmt aber nich, weil man den Pitch nehmen muß, weil dieser wie ich oben erklärt hab das Offscreen-Stück des Speicherabbilds beinhaltet was bei der Speicheradressierung auch mitgerechnet wird.

    deshelb ist pVideo[1000] der Pixel mit den Koordinaten ( 334 | 1) -> 1*666+334 = 1000

    kurz gesagt man braucht den Pitch und nicht die Screenbretie um von einer Speicheradressierung auf einen bestimmten Pixel zu kommen...hoffe jeder Rest von KLarheit beseitigt 😃

    [ Dieser Beitrag wurde am 04.02.2003 um 15:47 Uhr von crass editiert. ]


Anmelden zum Antworten