Seite 1 von 2

Blending

Verfasst: 20.09.2005 14:38
von unix
Hat jemand eine Idee wie man ein Blending wie ähnlich in diesen Bild(Auge)
http://phraseologie.free.fr/Copie%20de%20dragon.jpg
Programmieren, Malen oder andere möglichkeiten machen könnte?

Mein Problem ist das ungleichmäßige Verschwimmen der Farbe mit den Hintergrund

Am Liebsten Wäre mir ein Grafikprogramm das etwas derartiges kann

Verfasst: 20.09.2005 18:58
von Kekskiller
Also ich hatte da mal sone schöne Funktion geschrieben...
#ScreenWidth=320
#ScreenHeight=240

Procedure PutPixel(x.w,y.w, ired.w,igre.w,iblu.w, t.f)
If x.w>=0 And y.w>=0 And x.w<#ScreenWidth And y.w<#ScreenHeight
ocol.l = Point(x.w,y.w)
ored.w = Red(ocol.l)
ogre.w = Green(ocol.l)
oblu.w = Blue(ocol.l)

If ored.w<ired.w
fred.w = ored.w + ( Abs(ored.w - ired.w) * t.f )
ElseIf ored.w>ired.w
fred.w = ired.w + ( Abs(ored.w - ired.w) * t.f )
ElseIf ored.w=ired.w
fred.w=ored.w
EndIf

If ogre.w<igre.w
fgre.w = ogre.w + ( Abs(ogre.w - igre.w) * t.f )
ElseIf ogre.w>igre.w
fgre.w = igre.w + ( Abs(ogre.w - igre.w) * t.f )
ElseIf ogre.w=igre.w
fgre.w=ogre.w
EndIf

If oblu.w<iblu.w
fblu.w = oblu.w + ( Abs(oblu.w - iblu.w) * t.f )
ElseIf oblu.w>iblu.w
fblu.w = iblu.w + ( Abs(oblu.w - iblu.w) * t.f )
ElseIf oblu.w=iblu.w
fblu.w=oblu.w
EndIf

Plot(x.w, y.w, RGB(fred.w,fgre.w,fblu.w))
EndIf
EndProcedure
Aber eigentlich könnt ich ja mal gucken, ob ich die mal optimieren kann, wäre ja bestimmt schön so... Naja, aber für so große Kreisflächen taugt das nicht. Du könntest als schnelle Variante ja mal einfach die ein Bild mit einem Kreis machen, dass transparent aufmalen, es verkleinern, nochmal auf dem gleichen Punkt transparent aufmalen... und so weiter.

Also im Prinzip so hier:
- großes Keisbild machen
- mit bestimmtem Transparentwert malen
- bild verkleinern und mit gleicher transparenz auf den bilschirm malen (zentriert)
dan eigentlich nur halt noch so oft verkleinern und malen, wie viele Übergänge du haben willst... Ist aber auch nicht grad das nonplus-Ultra. Da du ja sicher die Mathematik dahinter wissen willst, wird dir ja wohl auch egal sein, dass PB solche grauen Bitmaps durch Directx benutzen kann, um Schattierungen hervorzurufen.

Verfasst: 20.09.2005 22:52
von unix
Ich glaube du hasst nicht ganz verstanden

ich brauche das um den Auge also der Lichtefekt NICHT Das Auge selber!
Das habe ich schon! :allright:
mit Malen und dann Verschwimmenlassen(schärfe minimieren) habe ich es schon probiert.
Nur leider sieht das lang nicht so gut aus!
Wenn du mich verstehst.

Am Besten wäre eine Art halbtransparentes Sprite Das ich auf Das Bild lege dass es mittig wäre

Wichtig Halbtransparent NICHT Transparent da es sonst nur "Aufgelegt" aussieht!

Also am besten ein Grafikprogramm mit den man ein Solchen Effekt machen kann. Möglichchst realistisch!

Obwohl ich schon mit Halbtransparenz arbeite kann ich nicht gut genug malen! <)

Aber trotzdem Danke wenn du mich falsch verstanden haben soltest!


[EDIT]
Code fürs Verschwimmen lassen:

Code: Alles auswählen

InitSprite()
InitKeyboard()

UseJPEGImageDecoder()
UseJPEGImageEncoder()

OpenScreen(800,600,16,"")

LoadSprite(0,"E:\Bilder\Games\BlendGreen.jpg")
CopySprite(0,1)

Global Detail.b : Detail = 2
Global e.b : e = 30     ;e = Empfindlichkeit und Detail Verschwimmgröße

StartDrawing(SpriteOutput(1))
;{ Herenzontal
For y = 0 To SpriteHeight(0)
 For x = 0 To SpriteWidth(0)
  Color1 = Point(x,y)
  R1 = Red(Color1)  
  G1 = Green(Color1)
  B1 = Blue(Color1)
  Color2 = Point(x+1,y)
  R2 = Red(Color2)  
  G2 = Green(Color2)
  B2 = Blue(Color2)
  If Abs(R1-R2) > e Or Abs(G1-G2) > e Or Abs(B1-B2) > e
    For xx = Detail*-1 To Detail
     If xx <> 0 And X+xx > -1 And X+xx < SpriteWidth(1)+1
     Colorx = Point(X+xx,Y)
     Rx = Red(Colorx)
     Gx = Green(Colorx)
     Bx = Blue(Colorx)
     diR.f = R1 - Rx
     diG.f = G1 - Gx
     diB.f = B1 - Bx
     zR.f = diR / Detail
     zG.f = diG / Detail
     zB.f = diB / Detail
     i.f = xx
     eR = Rx + (zR * (Abs(i)*-1+Detail))
     eG = Gx + (zG * (Abs(i)*-1+Detail)) 
     eB = Bx + (zB * (Abs(i)*-1+Detail))
     ;Zeichnen
     FrontColor(eR, eG, eB)
     Plot(X+xx,Y)
    EndIf
   Next
  EndIf
 Next
Next
;}
;{ Vertical
For x = 0 To SpriteWidth(0) 
 For y = 0 To SpriteHeight(0)
  Color1 = Point(x,y)
  R1 = Red(Color1)  
  G1 = Green(Color1)
  B1 = Blue(Color1)
  Color2 = Point(x,y+1)
  R2 = Red(Color2)  
  G2 = Green(Color2)
  B2 = Blue(Color2)
  If Abs(R1-R2) > e Or Abs(G1-G2) > e Or Abs(B1-B2) > e
    For yy = Detail*-1 To Detail
     If yy <> 0 And Y+yy > -1 And Y+yy < SpriteHeight(1)+1
     Colorx = Point(X,Y+yy)
     Rx = Red(Colorx)
     Gx = Green(Colorx)
     Bx = Blue(Colorx)
     diR.f = R1 - Rx
     diG.f = G1 - Gx
     diB.f = B1 - Bx
     zR.f = diR / Detail
     zG.f = diG / Detail
     zB.f = diB / Detail
     i.f = yy
     eR = Rx + (zR * (Abs(i)*-1+Detail))
     eG = Gx + (zG * (Abs(i)*-1+Detail)) 
     eB = Bx + (zB * (Abs(i)*-1+Detail))
     ;Zeichnen
     FrontColor(eR, eG, eB)
     Plot(X,Y+yy)
    EndIf
   Next
  EndIf
 Next
Next
;}
StopDrawing()

Repeat

ExamineKeyboard()

ClearScreen(0,0,0)
 
 DisplaySprite(1,0,0)

FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)

SaveSprite(1, "E:\Bilder\Games\BlendGreenb.jpg", #PB_ImagePlugin_JPEG,5)


End

Wobei ihr merken wird das auch der Code noch nicht ausgereift ist
==> Horenzontal, Vertical

Verfasst: 21.09.2005 07:47
von DarkDragon
:lol: Das nennst du Blending(Blending <> blendend)?

Verfasst: 21.09.2005 08:42
von unix
nein wir habens erst einmal von verschwimmen gehabt da ich aber festgestellt habe das das Scheiße aussieht wollte ich das echte "Blending"
Das ganze mit den verschwimmen war nur ein Versuch!

Deshalb frage ich euch ja nach einer Lösung für ein echtes "Blending"

Oder wie auch immer ihr so etwas bezeichnet
<== keine Ahnung von so etwas

Verfasst: 21.09.2005 12:06
von ZeHa
Nennt sich das nicht "Lenseflare"?

Ich glaub kaum, daß da viel berechnet wird, sondern ich würd das bereits als Sprite vorbereiten und dann so halbtransparent drüberkleben oder so... keine Ahnung ob das dann gut aussieht aber das wär mein erster Versuch ;)

Verfasst: 21.09.2005 16:32
von unix
Juhuu ZeHa hat mein Problem gut erkannt
aber ZeHa wenn man es Halbtransparent Auflegt also kurz mit dem Hintergrung verschwimmen lässt sieht das doch keine Sau.

Natürlich darf di Halbtransparenz nicht primitiv sein wie

============== Bild
==============Transparenz
============== Bild
==============Transparenz
============== Bild
==============Transparenz
.
.
.

Das würde wie Streifen aussehen sondern richtig haltransprent!

Verfasst: 21.09.2005 16:45
von ZeHa
Es gibt 'ne Funktion namens DisplayTranslucideSprite() - die könnte Dich evtl interessieren ;) mit der kannst Du auch festlegen, inwiefern das Sprite nun durchscheinend ist oder nicht!

Schau einfach mal in der Hilfe nach, da steht, wie Du die benutzen mußt.

Viel Erfolg :mrgreen:

Verfasst: 21.09.2005 17:04
von unix
Schon probiert aber das anzeigen ist ja nicht das Problem sonder die Form "Malen" oder am besten mit ein grafikprogramm erzeugen meine sehen hässlich aus! auch wenn sie schon perfekt halbtransparent sind (siehe mein Code <) )

das heist ich brauche die Form!
(Ring und Strahlen)

Was für ein Grafikprogramm kann so etwas?

<== hat nur Paint :oops:

Verfasst: 21.09.2005 17:27
von Green Snake
@ZeHa

sorry, ist nicht ganz topic, aber....
ich hab da diverse probs mit DisplayTranslucideSprite()
das teil ist einfach sch**** langsam :?

ich kann es deswegen nicht verwänden :cry:

auch mit StartSpecialFX() wirds nicht sehr viel schneller.....wieso das? :?
3D Sprites sind ei mir dabei um längen schneller :?