Seite 1 von 2

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

Verfasst: 05.09.2004 21:10
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

Verfasst: 05.09.2004 21:21
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

Verfasst: 05.09.2004 21:26
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

Verfasst: 05.09.2004 21:33
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.....

Verfasst: 05.09.2004 22:12
von NicTheQuick
Wie äußert sich der Fehler überhaupt?

Also was sieht falsch aus?

Verfasst: 06.09.2004 19:24
von remi_meier
Bild

Verfasst: 06.09.2004 21:33
von NicTheQuick
LOL :lol:

Keine Ahnung, was daran falsch ist. Bei mir funktioniert alles wunderbar... /:->

Verfasst: 06.09.2004 21:45
von Lars
Hier funktioniert auch die FrontColor() Variante, während die direkte
Variante ziemlich genau das selbe Bild liefert wie bei remi_meier.

Verfasst: 06.09.2004 22:32
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.

Verfasst: 07.09.2004 08:43
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