rgb zu hsv und zurück beschleunigen?

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von The_Dark_Zim-.- »

Hm hm hm. Okey bevor ich mich da nu wieder durchwusel, einfache frage: Kann ich damit folgendes resultat erziehlen?
Bild
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von STARGÅTE »

Gegenfrage: Dieses Resultat bekommst du doch aber nicht, wenn du eine einfache Farbrotation durchführst?
Denn dann würden ja die roten Rückblenden auch grün werden.

Zu deiner Frage: Nein, mit Sprite3DColor kann nur das gesamte Sprite gefärbt werden, das heißt, du musst u.u. zwei Sprites nutzen: Eins für das Auto im Normalzustand (normale Farben, Rückblenden, Metall) und eins (Graustufen) für alle Lackteile, dass du dann aber mit Sprite3DColor() einfärben kannst.

Aber noch eine Frage: Sind das Texturen für echte Meshs?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von The_Dark_Zim-.- »

Die Rückblenden werden im nachhineinen eingefügt "DrawAlphaImage(ImageID(3), 0, 0)" ;)

Die Textur ist von einem Mesh, aber das habe ich jetzt nur als Beispiel genommen. Bin gerade dabei ein eigenes Mesh zu machen. Ist garnicht so einfach :bluescreen:
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von NicTheQuick »

Man könnte aber doch ein graues Auto als Textur nehmen und das dann in jede beliebige Farbe transformieren, oder?
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von STARGÅTE »

Jo, dann auch mit der direkten Funktion: Sprite3DColor()

Dan muss das Auto nur aus 2 Sprites2D bestehen, dem was unverändert ist (mit allem was keine Farbänderung hat) und eins was gerade die Farbe aufträgt.

Aber die frage ist ja immer noch: Baust du ein 3D-Spiel oder nur 2D?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von The_Dark_Zim-.- »

Eigentlich wird es 3D, aber man kann sowas ja auch in anderen Anwendungen verwenden.
Für diese Projekt hatte ich mir schon gedacht das ich es jetzt so lasse, da ich dann mit *.Material ja einzelnen bereichen Texturen zuordnen kann. Eine Textur von 64*64 als Lack z.B. reicht ja und das lässt sich ja schnell genug umrechnen.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von STARGÅTE »

Wenns 3D ist, kannst du doch aber direkt die 3D-Befehle dafür nutzen:
MaterialAmbientColor()
MaterialDiffuseColor()
MaterialSelfIlluminationColor()
MaterialSpecularColor()
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von The_Dark_Zim-.- »

Ich bekomme aber nicht die Lichteffekte hin die ich haben möchte. Außerdem darum werde ich eh mit *.Material arbeiten müssen um Shader verwenden zu können.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von Thorium »

NicTheQuick hat geschrieben:Man könnte aber doch ein graues Auto als Textur nehmen und das dann in jede beliebige Farbe transformieren, oder?
Hervoragende Idee. Das kann man dann auch direkt im RGB-System machen. Ich ess jetzt erstmal was und dann bastel ich das mal. Stargates Variante mittels DirectX sollte aber dennoch um einiges schneller sein.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: rgb zu hsv und zurück beschleunigen?

Beitrag von Thorium »

So hier ist es. Mit Vergleichstest.

ColorizeGreyscale erwartet ein Graustufen 24bit Image und gibt ein 32bit Sprite zurück. Image damit es nicht erst aus dem VRAM geladen werden muss und da es sowieso nur als Blueprint für die fertigen Texturen gild brauchen wir es auch sowieso nicht als Sprite.
Es ist sehr viel schneller, getestet mit einem Bild 2048x1536.

Auf meinem System folgende Messung:
Dein ChangeColor: 527ms
Mein ColorizeGreyscale: 65ms

Und da ist immernoch Optimierungspielraum, z.B. durch Parallelisierung.

Code: Alles auswählen

Global H.d,S.d,V.d

Structure Pixel
  Pixel.l
EndStructure

Structure Pixel_BGRA
  Blue.a
  Green.a
  Red.a
  Alpha.a
EndStructure

Procedure RGB_To_HSV(ColorRed.d,ColorGreen.d,ColorBlue.d)
 
  MinColor.d
  MaxColor.d
 
  ColorRed / 255
  ColorGreen / 255
  ColorBlue / 255
 
  If ColorRed < ColorGreen
    MinColor = ColorRed
  Else
    MinColor = ColorGreen
  EndIf
  If MinColor > ColorBlue
    MinColor = ColorBlue
  EndIf
  If ColorRed > ColorGreen
    MaxColor = ColorRed
  Else
    MaxColor = ColorGreen
  EndIf
  If MaxColor < ColorBlue
    MaxColor = ColorBlue
  EndIf
 
  If MaxColor = MinColor
    H = 0
  ElseIf MaxColor = ColorRed
    H = 60 * ((ColorGreen-ColorBlue)/(MaxColor-MinColor))
  ElseIf MaxColor = ColorGreen
    H = 60 * (2+((ColorBlue-ColorRed)/(MaxColor-MinColor)))
  ElseIf MaxColor = ColorBlue
    H = 60 * (4+((ColorRed-ColorGreen)/(MaxColor-MinColor)))
  EndIf
 
  If MaxColor = 0
    S = 0
    H = 0
  Else
    S = (MaxColor-MinColor)/MaxColor
  EndIf
 
  V = MaxColor
 
EndProcedure

Procedure.l HSV_To_RGB()
 
  ColorRed.d
  ColorGreen.d
  ColorBlue.d
 
  If S = 0
    ColorRed = V
    ColorGreen = V
    ColorBlue = V
  Else
   
    hi.d = H/60
    l = Round(hi, #PB_Round_Down)
    f.d = hi-l
    p.d = V * (1-S)
    q.d = V * (1-S*f)
    t.d = V * (1-S*(1-f))
   
    If l = 1
      ColorRed = q
      ColorGreen = V
      ColorBlue = p
    ElseIf l = 2
      ColorRed = p
      ColorGreen = V
      ColorBlue = t
    ElseIf l = 3
      ColorRed = p
      ColorGreen = q
      ColorBlue = V
    ElseIf l = 4
      ColorRed = t
      ColorGreen = p
      ColorBlue = V
    ElseIf l = 5
      ColorRed = V
      ColorGreen = p
      ColorBlue = q
    Else
      ColorRed = V
      ColorGreen = t
      ColorBlue = p
    EndIf
  EndIf
 
  ProcedureReturn RGB(Colorblue * 255,ColorGreen * 255,Colorred * 255)
EndProcedure

Procedure.i ColorizeGreyscale(Image.i, *Color.Pixel_BGRA)
  
  Protected Width.i
  Protected Height.i
  Protected SrcBuffer.i
  Protected *SrcPixel.Pixel_BGRA
  Protected SrcPitch.i
  Protected DstBuffer.i
  Protected *DstPixel.Pixel_BGRA
  Protected DstPitch.i
  Protected Sprite.i
  Protected x.i
  Protected y.i
  
  StartTime = timeGetTime_()
  
  Width = ImageWidth(Image)
  Height = ImageHeight(Image)
  
  StartDrawing(ImageOutput(Image))
  SrcBuffer = DrawingBuffer()
  SrcPitch  = DrawingBufferPitch()
  StopDrawing()
  
  Sprite = CreateSprite(#PB_Any, Width, Height, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
  
  StartDrawing(SpriteOutput(Sprite))
  DstBuffer = DrawingBuffer()
  DstPitch = DrawingBufferPitch()
  
  *SrcPixel = SrcBuffer + Height * SrcPitch
  *DstPixel = DstBuffer
  
  For y = 1 To Height
    
    For x = 1 To Width
    
      *DstPixel\Blue  = (*SrcPixel\Blue * *Color\Blue) / 255
      *DstPixel\Green = (*SrcPixel\Green * *Color\Green) / 255
      *DstPixel\Red   = (*SrcPixel\Red * *Color\Red) / 255
      
      *SrcPixel + 3
      *DstPixel + 4
      
    Next
    
    *SrcPixel = SrcBuffer + (Height - y) * SrcPitch
    *DstPixel = DstBuffer + y * DstPitch
    
  Next

  StopDrawing()
 
  MessageRequester("ColorizeGreyscale", Str(timeGetTime_()-StartTime))
  
  ProcedureReturn Sprite

EndProcedure

Procedure ChangeColor(Grad)
 
  If IsImage(1) = 0
   
    Global MaxHeight,MaxWidth
   
    LoadImage(1,"b:\test.bmp")
    ;LoadImage(3,"media\TailLight.png")
    MaxHeight = ImageHeight(1)
    MaxWidth = ImageWidth(1)
    CreateSprite(2,MaxWidth,MaxHeight)
    
    StartTime = timeGetTime_()

    Global Dim Color(MaxWidth,MaxHeight)

    MaxHeight-1
    MaxWidth-1
   
    StartDrawing(ImageOutput(1))
   
    For i = 0 To MaxHeight
     
      For j = 0 To MaxWidth
       
        Color(j, i) = Point(j, i)
       
      Next j
     
    Next
    StopDrawing()
   
  EndIf
 
  i = 0
  j = 0
 
  StartDrawing(SpriteOutput(2))
 
      Buffer      = DrawingBuffer()             ; Get the start address of the screen buffer
      Pitch       = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
 
  For i = 0 To MaxHeight

    For j = 0 To MaxWidth

      RGB_To_HSV(Red(Color(j,i)),Green(Color(j,i)),Blue(Color(j,i)))
     
      H + Grad
     
      If H < 0
        H + 360
      ElseIf H > 360
        H - 360
      EndIf
     
      *Line.Pixel = Buffer+(Pitch*i)+(j*4)
      *Line\Pixel = HSV_To_RGB()
     
    Next j
   
  Next 
 
  ;DrawAlphaImage(ImageID(3), 0, 0)
 
  StopDrawing() 
 
  ;SaveSprite(2,"media\NewTexture.bmp",#PB_ImagePlugin_BMP)
 
  MessageRequester("ChangeColor",Str(timeGetTime_()-StartTime))
  
EndProcedure

timeBeginPeriod_(1)

InitSprite()
OpenScreen(1024, 768, 32, "Test")

ChangeColor(10)

LoadImage(0, "b:\testgreyscale.bmp")
Color.l = RGB($68, $EE, $BC)
Sprite.i = ColorizeGreyscale(0, @Color)
SaveSprite(Sprite, "b:\testoutput.bmp")

timeEndPeriod_(1)
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten