Ich werkel schon seit einigen Jahren (hin und wieder mal) an einem Spiel und habe dafür bis jetzt immer das Subsystem 'directx9' benutzt.
Jetzt mit der neuen PB-LTS ist das native Subsystem ja 'OpenGL' (welchem ich mittlerweile auch den Vorzug geben würde), aber das führte beim Spiel zu erheblichen Grafikfehlern. Nachdem ich die Fehlerquellen eingrenzen konnte, habe ich mal 2 einfache Beispielcodes daraus gebastelt. Da ich aber nicht weiß, ob die Fehler bei mir, meiner Hardware, oder an PB liegen, wäre es ganz nett, wenn es mal jemand testen könnte. Vielen Dank!
Fehler 1: DisplayTransparentSprite() - Option: Intensity
Unter 'directx9' funktioniert diese Option wie beschrieben, unter 'directx11' und 'OpenGL' hat diese Option überhaupt keinen Effekt bei mir.
Code: Alles auswählen
; Test: DisplayTransparentSprite() - Intensity
; PB-Version: 5.73 LTS(x86/x64), 6.10 LTS(x86/x64)
; Subsystem: DirectX9: works, DirectX11 & OpenGL: doesn´t work
; Keys: 'Esc' to quit
;
EnableExplicit
;
#WIN = 0
#WIN_W = 960
#WIN_H = 660
#WIN_T = "Intensity Test - Fade to Black"
#WIN_F = #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
#SPR_W = 640
#SPR_H = 480
;
Enumeration; Sprites
#SPR_BG
#SPR_FLT
EndEnumeration
;
Define.i fade
;
If ((Not InitSprite()) Or (Not InitKeyboard()))
Debug "Init failed!"
End
EndIf
;
OpenWindow(#WIN, 0, 0, #WIN_W, #WIN_H, #WIN_T, #WIN_F)
OpenWindowedScreen(WindowID(#WIN), 0, 0, #WIN_W, #WIN_H, #False, 0, 0)
;
If (Not CreateSprite(#SPR_BG, #SPR_W, #SPR_H))
Debug "Error: Sprite 'Background' not created"
End
EndIf
;
If (Not CreateSprite(#SPR_FLT, #SPR_W, #SPR_H, #PB_Sprite_AlphaBlending))
Debug "Error: Sprite 'Filter' not created"
End
EndIf
;
If (StartDrawing(SpriteOutput(#SPR_BG)))
Box(0, 0, #SPR_W, #SPR_H, #Red)
Box(#SPR_W * 0.1, #SPR_H * 0.1, #SPR_W * 0.8, #SPR_H * 0.8, #Green)
Box(#SPR_W * 0.3, #SPR_H * 0.3, #SPR_W * 0.4, #SPR_H * 0.4, #Blue)
StopDrawing()
Else
Debug "Error: Drawing 'Background'"
End
EndIf
;
Repeat
While WindowEvent() : Wend
ExamineKeyboard()
If (KeyboardReleased(#PB_Key_Escape)) : Break : EndIf
DisplaySprite(#SPR_BG, 0, 0)
DisplayTransparentSprite(#SPR_FLT, 0, 0, fade)
FlipBuffers()
fade = (fade + 1) % 256
ForEver
;
Fehler 2: OpenWindowedScreen() - Option: Autostretch=True, in Verbindung mit GrabSprite() und/oder ScreenOutput()
Die gute Nachricht: Unter 'directx9' funktioniert, in der neuen LTS, nun endlich das Autostretch - auch in Verbindung mit GrabSprite() und ScreenOutput()!
Die schlechten Nachrichten:
- Beim Subsystem 'directx11' werden beim GrabSprite() die Farbkanäle bei mir vertauscht(aus 'rgb' wird 'bgr').
- Beim Subsystem 'OpenGL' werden die Ausgaben von GrabSprite() und ScreenOutput() extrem "gestretched" (also: vergrößert und versetzt).
Code: Alles auswählen
; Test: WindowedScreen() - Autostretch with GrabSprite() / ScreenOutput()
; PB-Version: 5.73 LTS(x86/x64); 6.10 LTS(x86/x64)
; Subsystem: DirectX9: works; DirectX11: works, but rgb->bgr; OpenGL: doesn´t work, things get kind of "over-stretched"
; Keys: - 'Esc' to quit
; - 'Return' to switch between Background and grabbed Background
; - 'D' to toggle ScreenOutput()
;
EnableExplicit
;
#SCR_W = 320
#SCR_H = 240
;
#WIN = 0
#WIN_W = #SCR_W * 3
#WIN_H = #SCR_H * 3
#WIN_T = "OpenWindowedScreen - AutoStretch"
#WIN_F = #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
;
Enumeration
#SPR_BG
#SPR_GRB
EndEnumeration
;
Define.i grabbed, draw
Dim txt.s(1)
;
txt(0) = "Background"
txt(1) = "Grabbed BG"
;
If ((Not InitSprite()) Or (Not InitKeyboard()))
Debug "Init failed"
End
EndIf
;
OpenWindow(#WIN, 0, 0, #WIN_W, #WIN_H, #WIN_T, #WIN_F)
OpenWindowedScreen(WindowID(#WIN), 0, 0, #SCR_W, #SCR_H, #True, 0, 0)
;
If (Not CreateSprite(#SPR_BG, #SCR_W, #SCR_H))
Debug "Error: Create 'Background'"
End
EndIf
;
If (StartDrawing(SpriteOutput(#SPR_BG)))
Box(0, 0, #SCR_W, #SCR_H, #Red)
Box(#SCR_W * 0.1, #SCR_H * 0.1, #SCR_W * 0.8, #SCR_H * 0.8, #Green)
Box(#SCR_W * 0.3, #SCR_H * 0.3, #SCR_W * 0.4, #SCR_H * 0.4, #Blue)
StopDrawing()
Else
Debug "Error: Drawing 'Background'"
End
EndIf
;
DisplaySprite(#SPR_BG, 0, 0)
GrabSprite(#SPR_GRB, 0, 0, #SCR_W, #SCR_H); Result is an "over-stretched" sprite
;
Repeat
While WindowEvent() : Wend
ExamineKeyboard()
If (KeyboardReleased(#PB_Key_Escape))
Break
ElseIf (KeyboardReleased(#PB_Key_Return))
grabbed!1
ElseIf (KeyboardReleased(#PB_Key_D))
draw!1; toggle additional ScreenOutput() ...and even more "stretching"
EndIf
DisplaySprite(#SPR_BG + grabbed, 0, 0)
If (draw And StartDrawing(ScreenOutput()))
DrawText(0, 0, txt(grabbed), #White)
StopDrawing()
EndIf
FlipBuffers()
ForEver
;
Gruß
Burstnibbler