Seite 2 von 3

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 17:20
von The_Dark_Zim-.-
Hm hm hm. Okey bevor ich mich da nu wieder durchwusel, einfache frage: Kann ich damit folgendes resultat erziehlen?
Bild

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 18:48
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?

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 19:52
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:

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 20:51
von NicTheQuick
Man könnte aber doch ein graues Auto als Textur nehmen und das dann in jede beliebige Farbe transformieren, oder?

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 20:55
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?

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 21:46
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.

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 21:53
von STARGÅTE
Wenns 3D ist, kannst du doch aber direkt die 3D-Befehle dafür nutzen:
MaterialAmbientColor()
MaterialDiffuseColor()
MaterialSelfIlluminationColor()
MaterialSpecularColor()

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 22:03
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.

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 29.02.2012 22:40
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.

Re: rgb zu hsv und zurück beschleunigen?

Verfasst: 01.03.2012 00:02
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)