FrontColor() und Plot(x,y,color)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

FrontColor() und Plot(x,y,color)

Beitrag von remi_meier »

Abend Leutz
Hab hier mal wieder ein Problem auf das ich schon vor ca. einem Jahr gestossen bin. Ich weiss, dass es grafikkartenabhängig ist, aber ich glaube, dass auch PB etwas dafür kann :|

Code: Alles auswählen

InitSprite()

OpenWindow(0,300,300,500,500,#PB_Window_SystemMenu,"")
OpenWindowedScreen(WindowID(),0,0,500,500,1,0,0)

Repeat
  ClearScreen(0,0,0)
  
  StartDrawing(ScreenOutput())
  For x = 0 To 500
    For y = 0 To 500
      red   = Int(Abs(x * y)) % 256
      green = Int(Abs(x + y)) % 256
      blue  = Int(Abs(x - y)) % 256
      
      ;FrontColor(red, green, blue)
      ;Plot(x,y)
      Plot(x,y,RGB((x*y)%256,(x+y)%256,(x-y)%256))
    Next
  Next
  StopDrawing()
  
  
  Event = WindowEvent()
  If Event = 0
    Delay(10)
  EndIf
  
  FlipBuffers()
Until Event = #PB_Event_CloseWindow
Wieso gibt es bei diesen Zeilen:
> ;FrontColor(red, green, blue)
> ;Plot(x,y)
> Plot(x,y,RGB((x*y)%256,(x+y)%256,(x-y)%256))
mit den 2 Varianten unterschiedliche Ergebnisse? Besser gesagt beim nicht kommentierten ein falsches!?!

greetz
remi

PS: Problem z.B. beim Farbigen Bumpmapping auf PureArea
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ist doch logisch. Du benutzt doch für beides andere Formeln. :roll:

Wenn du die Zeile so änderst, ist beides gleich:

Code: Alles auswählen

Plot(x,y,RGB(Int(Abs(x*y)) % 256, Int(Abs(x+y)) % 256, Int(Abs(x-y)) % 256))
Oder du änderst die 3 Zeilen wie folgt:

Code: Alles auswählen

red   = (x * y) % 256
green = (x + y) % 256
blue  = (x - y) % 256
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Sry! Das war nur ein Flüchtigkeitsfehler!
Aber es kommt bei mir das selbe raus!!!

Code: Alles auswählen

InitSprite()

OpenWindow(0,300,300,500,500,#PB_Window_SystemMenu,"")
OpenWindowedScreen(WindowID(),0,0,500,500,1,0,0)

Repeat
  ClearScreen(0,0,0)
  
  StartDrawing(ScreenOutput())
  For x = 0 To 500
    For y = 0 To 500
      red   = Int(Abs(x * y)) % 256
      green = Int(Abs(x + y)) % 256
      blue  = Int(Abs(x - y)) % 256
      
      ;FrontColor(red, green, blue)
      ;Plot(x,y)
      Plot(x,y,RGB(Int(Abs(x * y)) % 256,Int(Abs(x + y)) % 256,Int(Abs(x - y)) % 256))
    Next
  Next
  StopDrawing()
  
  
  Event = WindowEvent()
  If Event = 0
    Delay(10)
  EndIf
  
  FlipBuffers()
Until Event = #PB_Event_CloseWindow
Hier nochmals ausgebessert.
Anscheinend hast du ne gute Graka :|

Hab nur im englischen Forum mal von sonem Prob gelesen, da ist man allerdings nicht weiter draufeingegangen.

greetz
remi
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Wow :shock:
Hab grad mal was an den DirectX Optionen rumgeschraubt und siehe da:
Das Problem verschwindet, wenn ich die Mipmap Detailebene auf Hochleistung stelle :?
Weiss jetzt nicht was das ist, aber liegt anscheinend an meinem Treiber... Dass Prob hierbei ist: Die neueren ATI Treiber ab ca. März 2004 funktionieren bei mir nicht mehr: Irgendwas konnte nicht geladen werden -> 16Farben-Modus niedrigste Auflösung :shock:
Mist aber auch!!!

Dann hat sich mein Problem jetzt geändert :| hat jemand zu dem Treiber eine Idee?

greetz
remi


EDIT:
Doppelwow!! : Die Anisotropische Filterung darf dabei nicht 2x oder 8x sein, nur 4x und 16x :shock:
EDIT2:
Antialiasing darf nicht bei 4x sein, nur 2x oder 6x :o
EDIT3:
TRUFORM muss ausgeschaltet sein :freak:
EDIT4:
Mist! Ist eher Zufall, dass es läuft. Ich muss die Optionen offen haben, damit es diesen Fehler nicht gibt.....
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Wie äußert sich der Fehler überhaupt?

Also was sieht falsch aus?
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

LOL :lol:

Keine Ahnung, was daran falsch ist. Bei mir funktioniert alles wunderbar... /:->
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Hier funktioniert auch die FrontColor() Variante, während die direkte
Variante ziemlich genau das selbe Bild liefert wie bei remi_meier.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Bei mir sieht das ganze so aus:
Bild
Sorry für den riesigen Screenshot, aber ich hatte gerade keine Lust da viel dran rumzuschneiden.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag von Stefan »

Hallo

Ich hab folgendes herausgefunden:
Plot(x,y) setzt den Pixel mit der API-Funktion SetPixelV_().
Plot(x,y,c) setzt den Pixel durch direkten Speicherzugriff.

@remi_meier
Kannst du mal diesen Code testen:

Code: Alles auswählen

Procedure GetBackDDS()
!extrn _PB_DirectX_BackBuffer
!MOV Eax,[_PB_DirectX_BackBuffer]
ProcedureReturn
EndProcedure

InitSprite()
OpenWindow(1,0,0,320,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ABCDEFG")
OpenWindowedScreen(WindowID(),0,0,100,100,1,0,0)

*DDS.IDirectDrawSurface7=GetBackDDS()

DDSD2=AllocateMemory(124)
PokeL(DDSD2,124) 

Result=*DDS\Lock(0,DDSD2,0,0)
If Result=0
Debug "Lock Ok"
Else
Debug "DDraw Err: "+Str(Result)
EndIf

Result=*DDS\UnLock(0)  
If Result=0
Debug "UnLock Ok"
Else
Debug "DDraw Err: "+Str(Result)
EndIf

Repeat
FlipBuffers()
Until WaitWindowEvent()=#PB_Event_CloseWindow
Der Debugger sollte folgendes ausspucken:
Lock Ok
UnLock Ok

Gruß
Stefan
Antworten