Additive Farbmischung für alle Grafikbefehle?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

Additive Farbmischung für alle Grafikbefehle?

Beitrag von Nalfein »

Gibt es eigentlich eine Art "DrawingMode" für alle Befehle, der bewirkt, daß Grafikbefehle (geht hauptsächlich um LineXY) (bitweise) additiv zur Farbe ausgeführt werden, die an dem jeweiligen Pixel schon ist?
So daß wenn man auf ein 0,255,0 (reingrün) ein 255,0,0 (reinrot) zeichnet und dadurch NICHT das 255,0,0 sondern ein 255,255,0-Pixel an der Stelle ist?

Bevor jemand fragt, es hat was mit 3D-Bilder per Rot-Grün-Methode für entsprechende Brille zu tun und nein, eigentlich habe ich keine Liste LineXY inklusive Abfrage "welches Pixel ist an der entsprechenden Stelle" und "wie sind seine RGB-Werte" selbst neu zu coden, wenn es sich vermeiden läßt...
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nein, sowas gibt es nicht, und jedes workaround wäre eher umständlich und langsam.

aber ich meine es gibt einen XOR-mode, den könnte man in deinem speziellen fall auch verwenden.
-> DrawingMode()

wenn das bild nur rotwerte enthält und du dann die grünwerte mit XOR drüberzeichnest, werden sie sauber addiert, weil sich die rot- und die grün-informationen nicht überschneiden.

;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Diese 3D Effekte habe ich schon mal programmier : mein Tip :

Nimm Sprites3D mit BelndigMode für Additive Frabmischung

Kannst auch alle DrawingBefehle erst in ein Grünes-Sprite Speichern und in ein Rotes und diese dann 3D machen und dann überlagern
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
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

Sprites

Beitrag von Nalfein »

Das mit den 3D-Sprites mach ich schon (bzw. hab's schonmal in nem anderen Programm gemacht...) für den Modus mit ausgefüllten Flächen (ist auch nur so in etwa das was rauskommen sollte... vielleicht geht es mit ein paar Einstellungen für die Deckungskraft), aber einen Linien-Modus brauch ich im Moment auch... naja, wenn's nicht geht

Das Bild nach Xor als Filter benutzen hab ich auch schon überlegt, aber irgendwie geht das nicht; da wird eine vorher nicht abschätzbare Zahl Linien gezogen; wenn die Anzahl ungerade ist, ist ein Pixel an der Stelle weiß, sonst schwarz; das hilft auch nicht wirklich... Naja, vielleicht versuche ich mich doch an einer selbstgemachten Line; langsamer als wenn mein Rechner mitten im Prog meint die Platte aufräumen zu müssen, wird es auch nicht sein... (dann gehn die FPS von 61 auf manchmal 9... :( )

Trotzdem Danke!
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> da wird eine vorher nicht abschätzbare Zahl Linien gezogen; wenn die Anzahl ungerade ist, ist ein Pixel an der Stelle weiß, sonst schwarz

hu? wieso schwarz und weiß? du sprachst von Rot und grün.

wenn du auf einen schwarzen screen (farbe $000000) zuerst ein mittelrot plottest (farbe $000080) und dann mit XOR ein Helles grün drüber ($00FF00) dann bekommst du eine korrekte rot-grün-mischung ($00FF80)

natürlich, wenn du mehrere linien über ein pixel ziehst, dann ändert sich der grünwert, wird ein undefinierbarer wert.
dann würde dir aber dein additives plotten auch nix helfen, denn dann würde dein rot und dein grün immer voll sein, also wäre alle punkte auf $00FFFF, also gelb.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

hmmm

Beitrag von Nalfein »

Interessant, auf die Möglichkeit nach einer Farbe den Drawing mode zu wechseln war ich nicht gekommen... hatte bisher gleich auf xor gestellt und dann einmal rot und einmal mit grün das Bild aufgebaut (s.u.).

Allerdings hat er bei mir im Xor-Modus bis jetzt immer beim ersten mal das Pixel weiß gemacht und beim zweiten mal schwarz; egal welche Farbe ich angebe.

Aber ich experimentiere mal mit dem Umschalten vor der 2ten Farbe.

Vielleicht liegt das mit den Schwarz-weiß ja an falscher Verwendung...

Also ich hab einen Bildaufbau-Teil des Programms, der 2mal aufgerufen wird; beim ersten mal stell ich die Farbe vorher mit frontcolor() auf rot, beim 2ten mal auf grün (oder umgekehrt...). Wenn ich vorm zweiten mal den Drawingmode auf xor stelle und dann die linien in grün (00FF00) ziehe, sollte er alle schwarzen pixel anschließend auch 00FF00 sein, alle wo schon FF0000 ist, aber FFFF00, oder? (das wäre beabsichtigt; da wo sich das rote und das grüne bild überschneiden, soll gelb entstehn, und nicht grün das alles überschreibt, nur weil ich das als 2tes zeichne)

Ich würd's ja hierhin kopieren, aber es ist auf nem anderen Rechner...
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

grundsätzlich richtig.

wie gesagt, solange du genau einmal für grün und genau einmal für rot plottest (pro pixel!) , sollte es einwandfrei funktionieren.
es sollte sogar auch mit geringeren helligkeiten gehen, also alle kanalwerte $00 - $FF.
du brauchst auch den drawing-mode nicht zwischendrin ändern, solange du zuerst den screen auf $000000 clearst.

PS:

beachte:
red = $0000FF
grn = $00FF00
blu = $FF0000
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

Will nicht...

Beitrag von Nalfein »

Also irgendwas geht daran nicht...

da steht in etwa (r1=Rotwert, g2=Grünwert); alles in einer Repeat-Until-Schleife...; unwichtige Teile weggelassen oder umschrieben, das "Ausrechnen" der xy-Koordinaten für die Linien ist natürlich komplizierter...

Code: Alles auswählen

FlipBuffers()
ClearScreen($00,$00,$00)
StartDrawing(ScreenOutput())
FrontColor(r1,0,0)
DrawingMode(0)
; Teil, der die Koordinaten der anzuzeigenden Linein ausrechnet
; die werden in die Variablen unten gespeichert... (oder auf "unbenutzt" 
; gesetzt; eine Konstante für "Linie ist außerhalb und braucht eh nicht 
; angezeigt zu werden..." oder ähnliches, was nicht angezeigt werden muß
; lax,lay sind Anzeigekoordinaten, l1(a) und l2(a) die Nummern der 
; Koordinaten die von der Linie verbunden werden; der Teil funktionert soweit... daher nicht drüber nachdenken...

; der Folgende Teil wird per Include()-Funktion zweimal eingefügt; das
; zweite mal weiter unten, das erste mal hier:
For a=0 To cmaxLines
	If lax(l1(a))<>unbenutzt
	If lay(l1(a))<>unbenutzt
	If lax(l2(a))<>unbenutzt
	If lay(l2(a))<>unbenutzt
		LineXY(lax(l1(a)),lay(l1(a)),lax(l2(a)),lay(l2(a)))
	EndIf
	EndIf
	EndIf
	EndIf
Next a
; bis hier
FrontColor(0,g2,0)
DrawingMode(2)
; nochmal das Linienpositionen ausrechnen und anzeigen
For a=0 To cmaxLines
	If lax(l1(a))<>unbenutzt
	If lay(l1(a))<>unbenutzt
	If lax(l2(a))<>unbenutzt
	If lay(l2(a))<>unbenutzt
		LineXY(lax(l1(a)),lay(l1(a)),lax(l2(a)),lay(l2(a)))
	EndIf
	EndIf
	EndIf
	EndIf
Next a
stopdrawing()
Mir ist schon aufgefallen daß Xor irgendwie bei Plot mit direkt angegebener Farbe nicht geht, sondern nur, wenn man frontcolor benutzt.

Für den Fall daß "Plot" wörtlich gemeint war, hab ich sogar einen Testteil eingebaut, der von 100 bis 200 mit plot jeweils einen Punkt in rot setzt, dann wird drawingmode auf 2 gesetzt und von 150 bis 250 der Befehl Frontcolor(0,$ff,00) : Plot(n,Zeile) ausgeführt (alles als erstes nach Screen=$000000)

Funktioniert nicht (wie gedacht)! Ergebnis sind 50 pixel rot, 50 Pixel Cyan (statt grün addierend zu plotten, dreht er die Farbe um! Und das unabhängig von der Farbe die ich angebe... ff0000 auf 00ffff z.B.; also Rot->Cyan) und 50 Pixel weiß (weil $000000 umgedreht $ffffff)

Das macht er so bei allen Linien, Plot usw...

Anderer Rechner, selbes Problem. Zusätzlich geht da die Sache mit dem Blending Mode nicht; ich hatte ja auch gerade die Idee, das grüne Bild und das Rote Bild auf 2 Sprites zu rendern und die mit den Addierenden BlendingMode übereinander anzuzeigen, aber das geht nur auf einem der Rechner (sollte auf beiden gehn...)
Ich fürchte nur das löst das auch auftretende Problem, daß sich 2 Linien nicht schneiden dürfen im xor-modus (2mal umdrehn=Linie wieder weg! und wenn es nur an der stelle ist...)
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

...

Beitrag von Nalfein »

Ich bräuchte einen Or-DrawingMode; daß $ff0000 Operator $00ff00 = $ffff00 ergibt...
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

wie sind denn die geschwindigkeits-anforderungen? geht es um einfache statische darstellungen, oder um animationen?
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten