Seite 1 von 2
resize windowedscreen ohne AA?
Verfasst: 24.05.2006 19:33
von inti
'arbeite zZ noch PB3.94 aber das problem(?) habe ich auch mit der 4.00f - wie läßt sich das filtern eines windowedscreens beim resize verhindern? bei resizeimage() kann man das als parameter angeben aber bei windowdscreen habe ich in keiner der hilfen was gefunden und auch nix in diesem sowie im engl. forum!

Verfasst: 26.05.2006 00:10
von ZeHa
Soweit ich weiß hängt das mit der Einstellung Deiner Grafikkarte ab. Dort kannst Du ja festlegen, ob AA eingeschalten sein soll oder nicht. Daher ist es gut möglich, daß Dein Spiel auf dem einen Rechner mit und auf 'nem anderen ohne AA läuft. Ist zwar schade, aber das kann man wohl so vom Programm aus nicht beeinflussen...
Verfasst: 26.05.2006 11:23
von Stefan
Hi
@ZeHa
Dort kannst Du ja festlegen, ob AA eingeschalten sein soll oder nicht.
Es handelt sich dabei um einen bilinearen filter, nicht um AA.(Es ist auch nicht möglich den Filter in den Einstellungen der Grafikkarte zu deaktivieren)
@inti
Es ist leider nicht möglich den Filter zu deaktivieren, die einzige möglichkeit (die mir einfällt) ist die Oberfläche über die CPU zeichnen zu lassen.
Ich hab mal eine Prozedur geschrieben, mit der es möglich ist den BackBuffer zu ersetzten.(durch eine Systemmem Oberfläche)
Code: Alles auswählen
Procedure _BackBufferPtr()
!extrn _PB_DirectX_BackBuffer
!MOV Eax,_PB_DirectX_BackBuffer
ProcedureReturn
EndProcedure
Procedure _SetScreenWidth(Width)
!extrn _PB_Screen_RealWidth
!MOV Eax,[Esp+4]
!MOV [_PB_Screen_RealWidth],Eax
EndProcedure
Procedure _SetScreenHeight(Height)
!extrn _PB_Screen_RealHeight
!MOV Eax,[Esp+4]
!MOV [_PB_Screen_RealHeight],Eax
EndProcedure
Procedure ResizeWindowedScreen(Width,Height)
BackBuffer=CreateSprite(-1,Width,Height)
If BackBuffer=0:ProcedureReturn 0:EndIf
*BackDDS.IDirectDrawSurface7=SpriteID(BackBuffer)
*BackDDS\AddRef()
FreeSprite(BackBuffer)
*OldBackDDS.IDirectDrawSurface7=PeekL(_BackBufferPtr())
*OldBackDDS\Release()
PokeL(_BackBufferPtr(),*BackDDS)
_SetScreenWidth(Width)
_SetScreenHeight(Height)
UseBuffer(-1)
ProcedureReturn 1
EndProcedure
#PB_Screen_VideoMem=0
#PB_Screen_SystemMem=1
Procedure ResizeWindowedScreenEx(Width,Height,Flags)
BackBuffer=CreateSprite(-1,Width,Height,Flags)
If BackBuffer=0:ProcedureReturn 0:EndIf
*BackDDS.IDirectDrawSurface7=SpriteID(BackBuffer)
*BackDDS\AddRef()
FreeSprite(BackBuffer)
*OldBackDDS.IDirectDrawSurface7=PeekL(_BackBufferPtr())
*OldBackDDS\Release()
PokeL(_BackBufferPtr(),*BackDDS)
_SetScreenWidth(Width)
_SetScreenHeight(Height)
UseBuffer(-1)
ProcedureReturn 1
EndProcedure
InitSprite()
OpenWindow(1,0,0,320,240,"ResizeWindowedScreen()")
OpenWindowedScreen(WindowID(1),0,0,80,60,1,0,0)
ResizeWindowedScreenEx(80,60,#PB_Screen_SystemMem)
Repeat
StartDrawing(ScreenOutput())
Box(0,0,70,60,#Red)
Line(0,0,99,99,#Blue)
StopDrawing()
FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
Gruß
Stefan
Verfasst: 26.05.2006 16:39
von ZeHa
Egal ob das nun AA oder ein bilinearer Filter ist, der Effekt ist grob gesagt der gleiche. Und er ist nicht auf jeder Grafikkarte aktiv, ich hab bspw. Gloomy Nights schon auf Rechnern gespielt, wo kein "Weichzeichnen" (um es mal allgemein zu betiteln) verwendet wurde. Vielleicht ist es nicht einstellbar, aber dann trotzdem zumindest Graka-abhängig.
Verfasst: 26.05.2006 21:28
von inti
danke, das beispiel hat mir schon weitergeholfen - es geht halt darum einen "ungefilterten" screen zu resizen bzw das zu erzwingen. die beiden großen grafikkarten-hersteller haben diesen modus immer automatsich aktiv und nicht jeder weiss wie man das abschaltet - außerdem liebe ich diesen verpixelten retro-look!

...und wenn ich was weichzeichnen will bzw filtern dass mache ich das lieber selber!
dass das kein AA ist war schon klar aber mit dem begriff bzw der abkürzung weiss wenigsten fast jeder was gemeint ist!

Verfasst: 31.05.2006 15:41
von inti
das ganze funktioniert scheinbar nur weil die grafik-beschleunigung für den openswindowedcreen() abgeschalten wird... dadurch hab ich 'nen framedrop von 80fps auf sage und schreibe 4 (vier)!

Verfasst: 31.05.2006 17:35
von ZeHa
Wow, gleich so viel
Ein Umweg wäre natürlich, selbst zu resizen, sprich, im Falle daß die Anwendung (Spiel?) in einem Fenster ausgeführt wird, werden einfach alle Sprites doppelt so groß gezeichnet (natürlich nicht on-the-fly sondern schon im Voraus hochrechnen) und alle Koordinaten * 2 gerechnet.
Ist zwar auch nicht soo die perfekte Lösung aber immerhin denkbar.
An was programmierst Du denn grad rum, wenn ich mal fragen darf?

Verfasst: 31.05.2006 21:40
von inti
nix grossartiges, ich hab' vor 2jahren mit pb v3.irgendwas 'nen kleinen screensaver geschrieben (wirklich nix aufregendes) der auf einem bildschirm 320x240 basiert... 'nen screen damit zu öffnen ist schon problematisch und bei einigen freunden die den begeistert

nutzen stösst der mittlerweile recht unübliche modus 640x480 (das mit dem x2 habe ich schon gemacht) auf wenig verständis. nun habe ich den wieder mal ausgegraben, habe den auf windowedscreen umgeschrieben (wusste ich damals noch nicht) und störe mich ein klein wenig an dem hardware-filter... das sieht so "unretro" aus!

...und ein "aufblasen" der grafik würde mir die größe von 36kb kaputtmachen!

Verfasst: 31.05.2006 23:33
von Kaeru Gaman
hm... und wenn du alles in einen sprite abbildest, und den per sprite3D vergrößerst mit quality=0 ?
Verfasst: 01.06.2006 01:33
von nco2k
@KG
da dürften aber einige (ati

) grakas damit probleme haben. für sprite3d sollte man schon grössen im ^2 format verwenden.
@inti
im englischen forum gabs glaub ich mal sowas, ohne die sprite3d befehle. such einfach mal.
c ya,
nco2k