rgb zu hsv und zurück beschleunigen?
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: rgb zu hsv und zurück beschleunigen?
Hm hm hm. Okey bevor ich mich da nu wieder durchwusel, einfache frage: Kann ich damit folgendes resultat erziehlen?
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: rgb zu hsv und zurück beschleunigen?
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?
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: rgb zu hsv und zurück beschleunigen?
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
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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- 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?
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?
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?
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: rgb zu hsv und zurück beschleunigen?
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.
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
Re: rgb zu hsv und zurück beschleunigen?
Wenns 3D ist, kannst du doch aber direkt die 3D-Befehle dafür nutzen:
MaterialAmbientColor()
MaterialDiffuseColor()
MaterialSelfIlluminationColor()
MaterialSpecularColor()
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: rgb zu hsv und zurück beschleunigen?
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
Re: rgb zu hsv und zurück beschleunigen?
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.NicTheQuick hat geschrieben:Man könnte aber doch ein graues Auto als Textur nehmen und das dann in jede beliebige Farbe transformieren, oder?
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Re: rgb zu hsv und zurück beschleunigen?
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.
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!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!