[MaxGUI +GLMax2D] Mühsamer Grafikfehler

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Holzchopf

Meisterpacker

Betreff: [MaxGUI +GLMax2D] Mühsamer Grafikfehler

BeitragMi, Jul 06, 2011 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute!

Ich hab' auch mal wieder ein Problem. Und zwar mit Canvasen in Verbindung mit GLMax2D: Pixmaps verlieren mit der Zeit an Farbe - und das finde ich gar nicht lustig!

Folgender Code, in dem ich das Problem soweit wie möglich isolieren konnte, soll das verdeutlichen:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework MaxGUI.Drivers
'Import MaxGui.Drivers
Import BRL.EventQueue
Import BRL.GLMax2D
'Import BRL.D3D9Max2D
Import BRL.Random

Local window:TGadget=CreateWindow("testli",0,0, 300,100, Null, WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS | WINDOW_CENTER)

Local cv1:TGadget=CreateCanvas(0,0,100,100,window)
Local cv2:TGadget=CreateCanvas(100,0,100,100,window)
Local cv3:TGadget=CreateCanvas(200,0,100,100,window)

Local imgBG1:TImage = PaintBG1()
Local imgBG2:TImage = PaintBG2()
Local imgBG3:TImage = PaintBG3()
Local imgCursor:TImage = PaintCursor()
Local imgInd:TImage = PaintIndicator()
Local imgFG:TImage = PaintForeground()

Local mx:Int, my:Int

Repeat
WaitEvent()
Print CurrentEvent.ToString()
Select EventID()
Case EVENT_WINDOWCLOSE
End
Case EVENT_GADGETPAINT
Select EventSource()
Case cv1
SetGraphics CanvasGraphics(cv1)
SetBlend ALPHABLEND
DrawImage imgBG1, 0,0
DrawImage imgCursor, mx,my
Flip
Case cv2
SetGraphics CanvasGraphics(cv2)
DrawImage imgBG2, 0,0
DrawImage imgCursor, mx,my
Flip
Case cv3
SetGraphics CanvasGraphics(cv3)
SetBlend ALPHABLEND
DrawImage imgBG3, 0,0
DrawImage imgFG, 0,0
DrawImage imgInd, mx,my
Flip
End Select
Case EVENT_MOUSEMOVE
mx = EventX()
my = EventY()
RedrawGadget(cv1)
RedrawGadget(cv2)
RedrawGadget(cv3)
Case EVENT_MOUSEDOWN
Select EventSource()
Case cv1
RepaintBG1(imgBG1)
RedrawGadget(cv1)
Case cv3
RepaintForeground(imgFG, mx,my)
RedrawGadget(cv3)
End Select
End Select
Forever
End


Function PaintBG1:TImage()
Local img:TImage = CreateImage(100,100)
RepaintBG1(img)
Return img
End Function
Function RepaintBG1(img:TImage)
Print "BG1 neu gezeichnet!"
Local c:Int = Rand(255)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 100
For Local x:Int = 0 Until 100
WritePixel pm, x,y, $ff000000 | (c Shl 16) | (x Shl 8) | y
Next
Next
UnlockImage(img)
End Function

Function PaintBG2:TImage()
Local img:TImage = CreateImage(100,100)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 100
For Local x:Int = 0 Until 100
WritePixel pm, x,y, $ff000000 | (x Shl 16) | y
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintBG3:TImage()
Local img:TImage = CreateImage(100,100)
Local pm:TPixmap = LockImage(img)
ClearPixels pm, $ff333333
For Local y:Int = 0 Until 100
For Local x:Int = 0 Until 100
If (x/5+y/5) Mod 2
WritePixel pm, x,y, $ff999999
EndIf
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintCursor:TImage()
Local img:TImage = CreateImage(10,10)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 10
For Local x:Int = 0 Until 10
WritePixel pm, x,y, $ffffff00 | x*y*2
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintIndicator:TImage()
Local img:TImage = CreateImage(10,10)
Local c:Int = Rand($ffffff)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 10
For Local x:Int = 0 Until 10
WritePixel pm, x,y, $ff000000 | c
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintForeground:TImage()
Local img:TImage = CreateImage(100,100)
Local pm:TPixmap = LockImage(img)
ClearPixels pm, $30ff0000
UnlockImage(img)
Return img
End Function
Function RepaintForeground(img:TImage, x:Int,y:Int)
Print "FG neu gezeichnet!"
Local pm:TPixmap = LockImage(img)
For Local _y:Int = y Until y+10
For Local _x:Int = x Until x+10
If _x<100 And _y<100
WritePixel pm, _x,_y, $ffff00ff
EndIf
Next
Next
UnlockImage(img)
End Function


Was (bei mir) passiert: Klicke ich einmal in das Feld ganz links, dann in das ganz rechts, dann wieder in das ganz Links, sind plötzlich alle Pixel von imgBG3 weiss. Obwohl imgBG3 ausnahmslos nur zum Programmstart bezeichnet wird Confused Mache ich so weiter, sind irgendwann alle Bilder, die nicht ständig neu gezeichnet (soll heissen: LockImage - WriteGedöhns - UnlockImage) werden, komplett weiss.

Mal abgesehen davon, dass imgCursor irgendwie willkürlich nur in einem der beiden Canvase (links oder mitte) überhaupt gezeichnet wird, also dasselbe TImage nur in einem Canvas gezeichnet werden kann.

Der Sch**** passiert allerdings nur, wenn ich GLMax2D verwende. Mit DirectX geht's.

Meine Frage: Passiert bei euch das selbe? Wenn nicht, dann ignoriere ich das einfach gekonnt Rolling Eyes Ich brauche einfach _irgendjemanden_, der dieses Fehlverhalten bestätigen kann - oder eben nicht. Oder noch besser: Jemand, der eine Lösung parat hat.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

ZaP

BeitragMi, Jul 06, 2011 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Unter OGL wird das Feld ganz rechts bei mir schweinchenrosa, unter DX nicht Smile
Starfare: Worklog, Website (download)

Xeres

Moderator

BeitragMi, Jul 06, 2011 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Gleiches Ergebnis wie bei ZaP.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMi, Jul 06, 2011 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du es schon mit einem zusätzlichen CLS oder SOLIDBLEND versucht?

BlitzMax: [AUSKLAPPEN]
		Case cv3
SetGraphics CanvasGraphics(cv3)
Cls
DrawImage imgBG3, 0,0
SetBlend ALPHABLEND
DrawImage imgFG, 0,0
DrawImage imgInd, mx,my
Flip
End Select


BlitzMax: [AUSKLAPPEN]
		Case cv3
SetGraphics CanvasGraphics(cv3)
SetBlend SOLIDBLEND
DrawImage imgBG3, 0,0
SetBlend ALPHABLEND
DrawImage imgFG, 0,0
DrawImage imgInd, mx,my
Flip
End Select

Holzchopf

Meisterpacker

BeitragMi, Jul 06, 2011 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Schweinchenrosa ist auch gut. Also eigentlich schlecht. Weil es das Verhalten bestätigt Rolling Eyes Schliesslich wird über das Weiss ja noch mit halbtransparentem Rot gemalt Arrow Rosa.

@Midimaster: Habe ich probiert. Ändert nur leider nichts am Ergebnis. Auch die Kombination der beiden Vorschläge =(
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

mpmxyz

BeitragMi, Jul 06, 2011 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe einen kleinen Workaround gefunden, welcher mindestens die Wahrscheinlichkeit des Fehlers so weit senkt, dass ich das Phänomen nicht mehr beobachten kann:
ein GCCollect in der Hauptschleife
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework MaxGUI.Drivers
'Import MaxGui.Drivers
Import BRL.EventQueue
Import BRL.GLMax2D
'Import BRL.D3D9Max2D
Import BRL.Random

Local window:TGadget=CreateWindow("testli",0,0, 300,100, Null, WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS | WINDOW_CENTER)

Local cv1:TGadget=CreateCanvas(0,0,100,100,window)
Local cv2:TGadget=CreateCanvas(100,0,100,100,window)
Local cv3:TGadget=CreateCanvas(200,0,100,100,window)

Local imgBG1:TImage = PaintBG1()
Local imgBG2:TImage = PaintBG2()
Local imgBG3:TImage = PaintBG3()
Local imgCursor:TImage = PaintCursor()
Local imgInd:TImage = PaintIndicator()
Local imgFG:TImage = PaintForeground()

Local mx:Int, my:Int
Repeat
GCCollect() '<-
WaitEvent()
Print CurrentEvent.ToString()
Select EventID()
Case EVENT_WINDOWCLOSE
End
Case EVENT_GADGETPAINT
Select EventSource()
Case cv1
SetGraphics CanvasGraphics(cv1)
SetBlend ALPHABLEND
DrawImage imgBG1, 0,0
DrawImage imgCursor, mx,my
Flip
Case cv2
SetGraphics CanvasGraphics(cv2)
DrawImage imgBG2, 0,0
DrawImage imgCursor, mx,my
Flip
Case cv3
SetGraphics CanvasGraphics(cv3)
SetBlend ALPHABLEND
DrawImage imgBG3, 0,0
DrawImage imgFG, 0,0
DrawImage imgInd, mx,my
Flip
End Select
Case EVENT_MOUSEMOVE
mx = EventX()
my = EventY()
RedrawGadget(cv1)
RedrawGadget(cv2)
RedrawGadget(cv3)
Case EVENT_MOUSEDOWN
Select EventSource()
Case cv1
RepaintBG1(imgBG1)
RedrawGadget(cv1)
Case cv3
RepaintForeground(imgFG, mx,my)
RedrawGadget(cv3)
End Select
End Select
Forever
End


Function PaintBG1:TImage()
Local img:TImage = CreateImage(100,100)
RepaintBG1(img)
Return img
End Function
Function RepaintBG1(img:TImage)
Print "BG1 neu gezeichnet!"
Local c:Int = Rand(255)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 100
For Local x:Int = 0 Until 100
WritePixel pm, x,y, $ff000000 | (c Shl 16) | (x Shl 8) | y
Next
Next
UnlockImage(img)
End Function

Function PaintBG2:TImage()
Local img:TImage = CreateImage(100,100)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 100
For Local x:Int = 0 Until 100
WritePixel pm, x,y, $ff000000 | (x Shl 16) | y
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintBG3:TImage()
Local img:TImage = CreateImage(100,100)
Local pm:TPixmap = LockImage(img)
ClearPixels pm, $ff333333
For Local y:Int = 0 Until 100
For Local x:Int = 0 Until 100
If (x/5+y/5) Mod 2
WritePixel pm, x,y, $ff999999
EndIf
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintCursor:TImage()
Local img:TImage = CreateImage(10,10)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 10
For Local x:Int = 0 Until 10
WritePixel pm, x,y, $ffffff00 | x*y*2
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintIndicator:TImage()
Local img:TImage = CreateImage(10,10)
Local c:Int = Rand($ffffff)
Local pm:TPixmap = LockImage(img)
For Local y:Int = 0 Until 10
For Local x:Int = 0 Until 10
WritePixel pm, x,y, $ff000000 | c
Next
Next
UnlockImage(img)
Return img
End Function

Function PaintForeground:TImage()
Local img:TImage = CreateImage(100,100)
Local pm:TPixmap = LockImage(img)
ClearPixels pm, $30ff0000
UnlockImage(img)
Return img
End Function
Function RepaintForeground(img:TImage, x:Int,y:Int)
Print "FG neu gezeichnet!"
Local pm:TPixmap = LockImage(img)
For Local _y:Int = y Until y+10
For Local _x:Int = x Until x+10
If _x<100 And _y<100
WritePixel pm, _x,_y, $ffff00ff
EndIf
Next
Next
UnlockImage(img)
End Function

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Holzchopf

Meisterpacker

BeitragMi, Jul 06, 2011 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Shocked Wie kommt man denn auf sowas? Konnte den Fehler jetzt auch 'ne Weile nicht mehr beobachten, scheint also zu funktionieren. Danke, mpmxyz! DANKE!!!
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

mpmxyz

BeitragMi, Jul 06, 2011 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte einmal ähnliche Probleme mit einem Grafikfenster.
-> Irgendetwas stimmt mit dem Entfernen der OpenGL-Texturen nicht.
Durch Ausprobieren habe ich diese Lösung gefunden.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group