OpenGl Farben

  • Hallo,
    ich bräuchte eure Hilfe, und zwar werden die Farben in OpenGl etwas anders angegeben als bei GDI+
    Normalerweise ist es ja RGB und dann von 00 bis FF pro Farbton.
    Bei OpenGl ist es ähnlich, jedoch mit dem Unterschied, dass es hier von 0.0 - 1.0 geht.

    Nun möchte ich normale Farben (0x000000 - 0xFFFFFF) in OpenGl Farben umwandeln.

    Von Gl nach RGB ist es ja kein Problem, jedoch zurück und ich find den Fehler nicht.
    Mein Anfang sieht so aus:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Color2 = _RGBToGL("0xFFFFFF")
    ConsoleWrite($Color2 & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _RGBToGL($Color)
    $nColor = StringTrimLeft($Color, 2)

    [/autoit] [autoit][/autoit] [autoit]

    $aColor = StringSplit($nColor, "")
    $R = $aColor[1] & $aColor[2]
    $G = $aColor[3] & $aColor[4]
    $B = $aColor[5] & $aColor[6]

    [/autoit] [autoit][/autoit] [autoit]

    $Para1 = _HexToDecimal("0x0000" & $R)
    $Para2 = _HexToDecimal("0x0000" & $G)
    $Para3 = _HexToDecimal("0x0000" & $B)

    [/autoit] [autoit][/autoit] [autoit]

    Return ($Para1 / 255) & "|" & ($Para2 / 255) & "|" & ($Para3 / 255)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GLToRGB($Para1, $Para2, $Para3)
    $R = StringTrimLeft(Hex(255 * $Para1), 6)
    $G = StringTrimLeft(Hex(255 * $Para2), 6)
    $B = StringTrimLeft(Hex(255 * $Para3), 6)
    Return "0x" & $R & $G & $B
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _HexToDecimal($iHex)
    If StringLeft($iHex, 2) = "0x" Then $iHex = StringMid($iHex, 3)
    If StringIsXDigit($iHex) = 0 Then
    SetError(1)
    MsgBox(0,"Error","Wrong input, try again ...")
    Return ""
    EndIf
    Local $ret="", $hx_count=0, $hx_array = StringSplit($iHex, ""), $Ii, $hx_tmp
    For $Ii = $hx_array[0] To 1 Step -1
    $hx_tmp = StringInStr($iHex, $hx_array[$Ii]) - 1
    $ret += $hx_tmp * 16 ^ $hx_count
    $hx_count += 1
    Next
    Return $ret
    EndFunc ;==>_HexToDec()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;GLtoRGB:

    [/autoit] [autoit][/autoit] [autoit]

    ;Parameter * 255
    ;Das in Hex wandeln
    ;6 Stellen von links kappen
    ;R G B zusammenfügen
    ;0x dranhängen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;RGBtoGL:

    [/autoit] [autoit][/autoit] [autoit]

    ;0x kappen
    ;R G B trennen
    ;6Stellen dranfügen
    ;Das in Dezimal wandeln
    ; Durch 255 teilen

    [/autoit]


    Unten im Script seht ihr den Ablauf.


    2. Frage:

    Wie bekomm ich die Hintergrundfarbe eines Fensters?
    _WinAPI_GetSysColor($COLOR_WINDOW) geht ja nur bei Fenster, die aktiv sind und den Fokus besitzen. Optimal wäre es, wenn ich die Farbe per Handle bekomme...


    MfG

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Color2 = _RGBToGL("0xFFFFFF")
    ConsoleWrite($Color2 & @CRLF)
    $Color2 = _RGBToGL("0x7700FF")
    ConsoleWrite($Color2 & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _RGBToGL($Color)
    $nColor = StringTrimLeft($Color, 2)

    [/autoit] [autoit][/autoit] [autoit]

    $aColor = StringSplit($nColor, "")
    $R = $aColor[1] & $aColor[2]
    $G = $aColor[3] & $aColor[4]
    $B = $aColor[5] & $aColor[6]

    [/autoit] [autoit][/autoit] [autoit]

    $Para1 = dec($R)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Para1 = ' & $Para1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $Para2 = dec ($G)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Para2 = ' & $Para2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $Para3 = dec($B)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Para3 = ' & $Para3 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    Return ($Para1 / 255) & "|" & ($Para2 / 255) & "|" & ($Para3 / 255)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GLToRGB($Para1, $Para2, $Para3)
    $R = StringTrimLeft(Hex(255 * $Para1), 6)
    $G = StringTrimLeft(Hex(255 * $Para2), 6)
    $B = StringTrimLeft(Hex(255 * $Para3), 6)
    Return "0x" & $R & $G & $B
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _HexToDecimal($iHex)
    If StringLeft($iHex, 2) = "0x" Then $iHex = StringMid($iHex, 3)
    If StringIsXDigit($iHex) = 0 Then
    SetError(1)
    MsgBox(0,"Error","Wrong input, try again ...")
    Return ""
    EndIf
    Local $ret="", $hx_count=0, $hx_array = StringSplit($iHex, ""), $Ii, $hx_tmp
    For $Ii = $hx_array[0] To 1 Step -1
    $hx_tmp = StringInStr($iHex, $hx_array[$Ii]) - 1
    $ret += $hx_tmp * 16 ^ $hx_count
    $hx_count += 1
    Next
    Return $ret
    EndFunc ;==>_HexToDec()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;GLtoRGB:

    [/autoit] [autoit][/autoit] [autoit]

    ;Parameter * 255
    ;Das in Hex wandeln
    ;6 Stellen von links kappen
    ;R G B zusammenfügen
    ;0x dranhängen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;RGBtoGL:

    [/autoit] [autoit][/autoit] [autoit]

    ;0x kappen
    ;R G B trennen
    ;6Stellen dranfügen
    ;Das in Dezimal wandeln
    ; Durch 255 teilen

    [/autoit]
    • Offizieller Beitrag

    Achja, RGB to GL geht natürlich auch wesentlich unkomplizierter. ;)

    [autoit]

    Func _RGB2GL($RGB)
    Local $R = Dec(StringMid("0x" & Hex($RGB,6), 3, 2)) / 255
    Local $G = Dec(StringMid("0x" & Hex($RGB,6), 5, 2)) / 255
    Local $B = Dec(StringRight("0x" & Hex($RGB,6), 2)) / 255
    Return $R & '|' & $G & '|' & $B
    EndFunc

    [/autoit]
  • Du kannst den Code noch kürzen

    [autoit]

    Func _HexToDecimal($iHex)
    If StringLeft($iHex, 2) = "0x" Then $iHex = StringMid($iHex, 3)
    If StringIsXDigit($iHex) = 0 Then
    SetError(1)
    MsgBox(0,"Error","Wrong input, try again ...")
    Return ""
    EndIf
    Local $ret="", $hx_count=0, $hx_array = StringSplit($iHex, ""), $Ii, $hx_tmp
    For $Ii = $hx_array[0] To 1 Step -1
    $hx_tmp = StringInStr($iHex, $hx_array[$Ii]) - 1
    $ret += $hx_tmp * 16 ^ $hx_count
    $hx_count += 1
    Next
    Return $ret
    EndFunc ;==>_HexToDec()

    [/autoit]

    geht auch mit Int

  • Nur noch eine kleine Anmerkung zum Thema:
    glColor3ub($R, $G, $B) nimmt Werte von 0 bis 255.
    Die Umrechnung übernimmt dann die Dll, sollte schneller sein.
    Lg

    Eine Funktion wie glColor3ub - oder was du auch immer damit meinst^^ - gibt es nicht. Alle Farben werden von 0.0 - 1.0 angegeben.

    Nun bleibt noch die Frage:

    Zitat

    2. Frage:

    Wie bekomm ich die Hintergrundfarbe eines Fensters?
    _WinAPI_GetSysColor($COLOR_WINDOW) geht ja nur bei Fenster, die aktiv sind und den Fokus besitzen. Optimal wäre es, wenn ich die Farbe per Handle bekomme...

    DAnke schonmal für die Beantwortung der Ersten :)