Effektvideo/Effekte über Grafik

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Effektvideo/Effekte über Grafik

Beitrag von True29 »

Grüßt euch,

Ich würde gerne Über einer 2D Grafik(png) einen Effekt legen.
So wie man es als Beispiel von einem Videoslot kennt hier ein Bild als Beispiel.
Bild

Erst mal habe ich mir ein Video erstellt in dessen Größe um es drüberzulegen leider hat sich das nicht als so einfach herrausgestellt.
Hier bleibt meist ein unschöner Übergang :/

Nun eine allgemeine frage.
Wie Realisiert man am besten einen Effekt über einer Grafik?
als Beispiel folgende Effekte würde ich benötigen: Farbscala verändern,Verdrehen des Objects,Aufleuchten.

Vielen dank für eure Hilfe.
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Effektvideo/Effekte über Grafik

Beitrag von True29 »

so einen Effekt konnte ich nachbauen (Bildschirmwackeln)

Code: Alles auswählen

   
    If wackel.i = 0
    bild_x - 10
    bild_y - 10
    wackel=1
    Else    
      bild_x + 10
      bild_y + 10    
      wackel = 0
    EndIf
        
    FlipBuffers()         
    DisplaySprite(1,bild_x,bild_y)    
    
    Delay(100)
2 Idee für einen Effekt wäre mit Rgbfilter zu arbeiten.

Code: Alles auswählen

    StartSpecialFX()           
    DisplayRGBFilter(0,0,200,200,400,0,0)    
    StopSpecialFX()

Weitere Ideen gesucht !
Mit der Videowiedergabe bin ich leider immer noch nicht weitergekommen daher suche ich hier auch noch Vorschläge.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Effektvideo/Effekte über Grafik

Beitrag von Derren »

Ich weiß gar nicht was du willst.
Was denn für ein Effekt. Auf dem Bild sieht man doch nicht was du meinst.

Wackelnde Bilder find ich jetzt nicht so prickelnd.
Und was hat das mit dem Video auf sich?
Willst du ein Video anzeigen, oder...?
Signatur und so
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Effektvideo/Effekte über Grafik

Beitrag von True29 »

hi Derren,
du kannst dir gerne z.b folgendes Video anschaun damit du weißt was ich mit effekten meine ;)
http://www.youtube.com/watch?v=7SiBuXJHlXM

Mir geht es jetzt nicht um die Filmauschnitte sondern eher um die Kleinigkeiten.
Symbole bewegen sich usw.

Gruß.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: Effektvideo/Effekte über Grafik

Beitrag von Dark »

Effekte bei 2D Spielen basieren auf dem selben Prinzip wie auch Animationen. Man erzeugt ein großes Bild mit allen Teilen der Animation. Das große Bild besteht dann also aus jede Menge kleinen Bildern, ähnlich wie bei alten Filmen. Um den Effekt anzuzeigen, wird immer nur einen Ausschnitt von dem Bild dargestellt, nämlich dem aktuellen Teil der Animation (das selbe was auch ein Projektor mit dem altem Film machen würde). Um nun einen Effekt endlos zu wiederholen, z.B. ein blinkendes Bild, klebt man einfach die beiden Endes des Films aneinander, fängt also von vorne an, sobald die Animation zu ende ist.

Der Grund für dieses Vorgehen ist, das die Übertragung von Bildern in die Grafikkarte sehr langsam ist und es daher zu lange dauern würde den Effekt dann zu berechnen, wenn er benötigt würde. Es ist daher effizienter, am Anfang ein großes Bild zu Übertragen und der Grafikkarte mitzuteilen, das sie immer nur einen Teil des Bildes anzeigen soll. Bei 3D sieht das ganze wieder etwas anders aus, weil man dort Code an die Grafikkarte übertragen kann (Shader Scripte) und die Grafikkarte den Effekt dann selbst berechnen kann (es entfällt also die Übertragung CPU -> GPU).

Deine gewünschten Effekte (z.B. Aufblinken) sind nicht ganz einfach zu realisieren, weil Bilder normalerweise im RGB Format gespeichert werden und dabei nur Informationen über den Rot/Grün/Blau Anteil vorhanden sind. Es ist nicht direkt möglich die Helligkeit einer Farbe zu ändern. Um dies gut machen zu können, muss man die Farben in einen anderen Farbraum konvertieren, z.B. HSV. Bei HSV wird eine Farbe durch einen Wert (H), ihre Sättigung (S) und ihre Helligkeit (V) angegeben. Dies erlaubt es die Helligkeit einfach zu verändern. Danach muss das ganze dann wieder in RGB konvertiert werden, da die 2D Lib von PureBasic auch nur RGB versteht.

Ich habe dir mal ein Beispiel für das Aufblinken geschrieben, da ich noch eine Prozedur zum Konvertieren zwischen RGB und HSV hatte:

Code: Alles auswählen

EnableExplicit

Structure HSV
	H.i
	S.d 
	V.d
EndStructure

#IMAGE_PATH = "test.jpg" ;Anpassen!

#EFFECT_STEPS = 10 ;[3, inf)
#EFFECT_TIME  = 50 ;ms

Procedure HSVtoRGB(H.i, S.d, V.d)

  Protected hi.i = H / 60
  
  Protected f.d  = H / 60 - hi 
  
  Protected p.i = V * (1 - S) * 255
  Protected q.i = V * (1 - S * f) * 255
  Protected t.i = V * (1 - S * (1- f)) * 255
  
  Select hi
    Case 0, 6
      ProcedureReturn RGB(V * 255, t, p)
    Case 1
      ProcedureReturn RGB(q, V * 255, p) 
    Case 2
      ProcedureReturn RGB(p, V * 255, t)
    Case 3
      ProcedureReturn RGB(p, q, V * 255)       
    Case 4
      ProcedureReturn RGB(t, p, V * 255)  
    Case 5
      ProcedureReturn RGB(V * 255, p, q)  
  EndSelect

EndProcedure

Procedure RGBtoHSV(RGB.i, *H.INTEGER, *S.DOUBLE, *V.DOUBLE) 

	Protected R.d = Red(RGB) 	/ 255
	Protected G.d = Green(RGB) / 255
	Protected B.d = Blue(RGB) 	/ 255
	
	Protected MAX.d = R
	If B > MAX : MAX = B : EndIf
	If G > MAX : MAX = G : EndIf
	
	Protected MIN.d = R
	If B < MIN : MIN = B : EndIf
	If G < MIN : MIN = G : EndIf	
	
	If MAX = MIN ; R = G = B
		*H\i = 0
	ElseIf R = MAX
		*H\i = Round((60 * (G-B))/(MAX-MIN), #PB_Round_Nearest)
	ElseIf G = MAX
		*H\i = Round(120 + (60*(B-R))/(MAX-MIN), #PB_Round_Nearest)
	Else ; B = MAX
		*H\i = Round(240 + (60*(R-G))/(MAX-MIN), #PB_Round_Nearest)
	EndIf

	If *H\i < 0 : *H\i + 360 : EndIf

	If MAX = 0
		*S\d = 0
	Else
		*S\d = (MAX-MIN)/MAX
	EndIf
	
	*V\d = MAX
	
EndProcedure

Procedure CreateEffect(Filename.s, *Width.INTEGER, *Height.INTEGER)

	If LoadImage(0, Filename)
		Protected Width 	= ImageWidth(0)
		Protected Height 	= ImageHeight(0)
		
		*Width\i 	= Width
		*Height\i = Height
		
		Protected NewImage = CreateImage(#PB_Any, Width * (2*#EFFECT_STEPS-2), Height)
		If NewImage
			Dim InputImage.HSV (Width, Height)
			
			Protected x.i, y.i, i.i
			
			StartDrawing(ImageOutput(0))
				For x = 0 To Width - 1
					For y = 0 To Height - 1
						RGBtoHSV(Point(x,y), @InputImage(x,y)\H, @InputImage(x,y)\S, @InputImage(x,y)\V)
					Next
				Next
			StopDrawing()
		
			StartDrawing(ImageOutput(NewImage))
				For i = 0 To #EFFECT_STEPS - 1
				
					For x = 0 To Width - 1
						For y = 0 To Height - 1
						
							Protected V.d = InputImage(x,y)\V + (i * (0.3 / #EFFECT_STEPS))
							If V > 1 : V = 1 : EndIf
							
							Plot(x+i*Width, y, HSVtoRGB(InputImage(x,y)\H, InputImage(x,y)\S, V))
							
							If i > 0 And i < #EFFECT_STEPS - 1
								Plot(x + ((2*#EFFECT_STEPS-3)-(i-1))*Width, y, HSVtoRGB(InputImage(x,y)\H, InputImage(x,y)\S, V))
							EndIf
							
						Next
					Next		
								
				Next
			StopDrawing()
			
			FreeImage(0)
			ProcedureReturn NewImage
		EndIf
	
		FreeImage(0)
	EndIf 

	ProcedureReturn #False

EndProcedure

UsePNGImageDecoder()
UseJPEGImageDecoder()

Define Width.i
Define Height.i
Define Image = CreateEffect(#IMAGE_PATH, @Width, @Height)
If Image

  If OpenWindow(0, 0, 0, Width, Height, "Effect", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
		If InitSprite()
			If OpenWindowedScreen(WindowID(0), 0, 0, Width, Height, 0, 0, 0)
			
				If CreateSprite(0, ImageWidth(Image), ImageHeight(Image))
					StartDrawing(SpriteOutput(0))
						DrawImage(ImageID(Image), 0, 0)
					StopDrawing()
				EndIf
				
				Define.i StartTime = ElapsedMilliseconds()
				 
				Repeat
					
					ClearScreen(RGB(0, 0, 0))
					
					Define.i Time = ElapsedMilliseconds() - StartTime
					Define Anim = (Time / #EFFECT_TIME) % (2*#EFFECT_STEPS-2)
					ClipSprite(0, Anim * Width, 0, Width, Height)					
					DisplaySprite(0, 0, 0)
					
					FlipBuffers()					
					Delay(10)
					 
				Until WindowEvent() = #PB_Event_CloseWindow
				 			 
			EndIf			
		EndIf
		CloseWindow(0)		
	EndIf

EndIf
Der Code erzeugt eine Animation, bei dem das Inputbild erstmal heller und dann wieder dunkler wird, es blinkt also auf. Das ganze ist nicht optimiert und soll auch nur mal die generelle Vorgehensweise zeigen.

Dark
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Effektvideo/Effekte über Grafik

Beitrag von True29 »

Hi Dark,
danke schon mal für deinen Geilen Beitrag ;)
hilft mir sehr weiter.

Deinen Code habe ich gleich mal getestet und sieht richtig gut aus ;)

Muss mich mal schlau machen was das Thema Shader Scripte bedeutet , und was genau damit alles möglich ist.
z.b fänge ich es cool auch mal ein Object auf einer 2D ebene zu bewegen als Beispiel Planet drehen lassen usw.

So
Vielelicht kommen ja noch andere Vorschläge ;)
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Effektvideo/Effekte über Grafik

Beitrag von jojo1541 »

Wie willst du in 2D Shaderscripte verwenden? :?

Dafür musste schon 3D Objekte erstellen und rumkugeln lassen. :mrgreen:
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Effektvideo/Effekte über Grafik

Beitrag von True29 »

@Jojo1541
ich habe mich mit dem Thema 3D noch nicht auseinander gestetzt :/
Irgendwie lässt sich das Bestimmt kombinieren 2D und 3D :P

Vielleicht haste noch andere nützliche Hinweise für mich ?

Diese Themen werde ich dann bearbeiten ;)
- 3D Allgemein +3D Objekte benutzen
- Shader Script einsetzten.
i7,12gb ram , Windows 10 ,Purebasic 5.50
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Effektvideo/Effekte über Grafik

Beitrag von DarkDragon »

Geht durchaus (und ist mit dem OpenGL Subsystem von PB auch mit PB Funktionen machbar). http://www.bradan.eu/files/oglsubsystemshader.zip
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten