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.
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
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
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

EDIT2:
Antialiasing darf nicht bei 4x sein, nur 2x oder 6x

EDIT3:
TRUFORM muss ausgeschaltet sein

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
Verfasst: 06.09.2004 21:33
von NicTheQuick
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:

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