PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von Kevin »

bei mir funktioniert es
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von Christian+ »

Läuft auch bei mir mit der 32 Bit Version für die 64 Bit Version muss TexRes.l natürlich wieder in TexRes.i geändert werden dann läuft es auch da.
mfg Christian+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von STARGÅTE »

Jo, ich sollte auch mal das .i in meiner Include korrigieren, und nicht immer nur hier ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von Epyx »

Super Sache, läuft unter XP32 und Vista64.
Mache mal ruhig weiter so ^^
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von STARGÅTE »

Nun mal wieder was zum Clippen.

Hier mal ein Beispiel für eine (wie ich finde) sinnvolle Anwendung:
Jeder hatte bestimmt schon mal das Problem, dass er gerne ein Bild vergrößern wollte, jedoch nicht im Sinne von Zerren, sonden "richtig" vergrößern, dass heißt, das die Ränder starr bleiben und nur das Innere sich zerrt.
Das ganze braucht mal zB. wenn man eine GUI schreibt mit Fenster oder aber bei Spielen ein Selektier-Rahmen hat

Dazu könnte man nun dieses Bild nehmen:
Bild
welches als Grundlage dient, und dann mit hilfe der folgenden Prozedur das Bild in der größe verändern:

Code: Alles auswählen

InitSprite()
InitSprite3D()


; DirectX9
Structure Sprite3D_DX9_Vertex
  x.f:y.f:z.f
  rhw.f:Color.l
  tu.f:tv.f
EndStructure  

Structure Sprite3D_DX9
  TexRes.i
  Vertice.Sprite3D_DX9_Vertex[4]
  TmpVertice.Sprite3D_DX9_Vertex[4]
  Width.l 
  Height.l
  RealWidth.l
  RealHeight.l
  Angle.f
  Transformed.l
EndStructure
 
Procedure DisplayBoxedSprite3D(Sprite3D, x, y, Width, Height, Top, Right, Bottom, Left)
  Protected *Sprite3D.Sprite3D_DX9 = IsSprite3D(Sprite3D)
  Protected Dim u.f(3), Dim v.f(3) ; Vertex
  Protected Dim x.i(3), Dim y.i(3) ; Position
  Protected ix.i, iy.i
  With *Sprite3D
    u(0) = 0 : u(1) = Left/\RealWidth : u(2) = 1-Right/\RealWidth   : u(3) = 1
    v(0) = 0 : v(1) = Top/\RealHeight : v(2) = 1-Bottom/\RealHeight : v(3) = 1
    x(0) = x : x(1) = x+Left          : x(2) = x+Width-Right        : x(3) = x+Width
    y(0) = y : y(1) = y+Top           : y(2) = y+Height-Bottom      : y(3) = y+Height
    ; 9 Felder clippen und zoomen und anzeigen
    For iy = 0 To 2
    For ix = 0 To 2
      \Vertice[0]\tu = u(ix)   : \Vertice[0]\tv = v(iy)
      \Vertice[1]\tu = u(ix+1) : \Vertice[1]\tv = v(iy)
      \Vertice[2]\tu = u(ix)   : \Vertice[2]\tv = v(iy+1)
      \Vertice[3]\tu = u(ix+1) : \Vertice[3]\tv = v(iy+1)
      \Width = x(ix+1)-x(ix)   : \Height = y(iy+1)-y(iy)
      \Transformed = #False
      DisplaySprite3D(Sprite3D, x(ix), y(iy))
    Next
    Next
    ; Reset, damit das Bild wieder "Default"-Eigenschaften hat
    \Vertice[0]\tu = 0 : \Vertice[0]\tv = 0
    \Vertice[1]\tu = 1 : \Vertice[1]\tv = 0
    \Vertice[2]\tu = 0 : \Vertice[2]\tv = 1
    \Vertice[3]\tu = 1 : \Vertice[3]\tv = 1
    \Width = \RealWidth : \Height = \RealHeight 
    \Transformed = #False
  EndWith
EndProcedure



OpenWindow(0, 0, 0, 800, 600, "Screen", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)
  
  UsePNGImageDecoder()
  CatchSprite(0, ?Window_png, #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
  CreateSprite3D(0, 0)
  
  
Repeat

  ClearScreen($FFFFFF)

  Start3D()
    Time.f = ElapsedMilliseconds()/1000
    DisplaySprite3D(0, 0, 0)
    DisplayBoxedSprite3D(0, 100, 100, 400+Sin(Time)*100, 300+Cos(Time)*100, 32, 16, 16, 16)
  Stop3D()

 FlipBuffers()

Until WindowEvent() = #PB_Event_CloseWindow



DataSection
  Window_png:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$4000000040000000,$7169AA0000000608,$47527301000000DE
  Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$130B0000130B0000
  Data.q $000000189C9A0001,$08DA07454D497407,$5F29C112161B151C,$5441444959020000,$30C26E7D9BEDDA78
  Data.q $F7636C413F5FC50C,$E0970A3D28E0971A,$D368A7D92760DC06,$DD2851337B51FD96,$DA0AD592D8B250D8
  Data.q $22017814DD8BF78A,$E94A651931C2648F,$C800AFE51D94F463,$ED0899210C941400,$BBB286F164A0719A
  Data.q $F02AE4A732294004,$1C88D94B7E8F0011,$1549644CDAF1DC8D,$AC6F16016E7C10C0,$73E124A003BFAAC1
  Data.q $D1C8056BE004820B,$D5B9095630F39F97,$0DA214212E10A5F3,$8FC5B7D189D0047C,$0CFDF44280251CDE
  Data.q $B2A610C7AAAAACC0,$E213EBD4A81EAAAA,$8085CA31320073DB,$76EDF8B5E56AD580,$1CDE00F600F7000B
  Data.q $ADC866739348616D,$B6DB400059173EB9,$A1D3916852C11421,$0809E90031B2C19C,$2DB696E00084C630
  Data.q $00B58E9F10E341B5,$B0154059915238DF,$92D49B83C52F11A0,$3F73EF29EB00039C,$2D29E9AA4F900A90
  Data.q $F80A90228E841F53,$1DFC054810059C71,$BA00D44015EFBE80,$EF400A00500AD3AE,$006E24924802F101
  Data.q $0532CB200DC79E79,$05B400A015A02DA0,$E2EDDBB0056202B4,$D9B016BDAF5EB006,$00A1E4453F3A2E6C
  Data.q $01400A0050028014,$02801400A0050028,$07BF90C6200A0050,$DBEFD2FF68FAEBB0,$A9D03FB1C6B60A57
  Data.q $0DC01CD7BFFC15C5,$30EE00176F15B706,$900B68AC18971098,$015E00EFF133CC7B,$BDAF42F00278033C
  Data.q $02AA7F76F24F3063,$7C49D35915B69FA4,$B4F7224D4014F19C,$5C05AC7EAEB0352F,$062DA7ED8C5D0DE2
  Data.q $565F06E9668F9E1F,$0028C20BBB3E9AD9,$F0B94CE72DB5A9E9,$08D992C18BD9C6F0,$5EDC2CE2DC130610
  Data.q $BB77CF7E7476C219,$3A059D9C41810DBC,$4C1690E1301B17B8,$2707400029BA10D8,$00B1A664B6870B8E
  Data.q $01B17249D0002A60,$E6CBA5345CBFFE8F,$686A4E17AFF31C26,$0555541F1D446868,$0000000B4E3C66FF
  Data.q $6042AE444E454900,$0000000000000082
EndDataSection
Übergeben muss dabei nur Position, Größe und dann die jeweiligen Offsets der Seiten, damit klar ist ab wann gezerrt werden darf.

EDIT: Hinweis: Wer Sprite3DQuality(1) benutzt, sollte bei den Clip-Rändern dafür sorgen, das dort nicht zwei unterschiedliche Farben sind, da sonst beim Zoomen des inneren, Farbe aus dem Rand ins Innere "hinein gewischt" wird.
(Das wäre so ein kleiner Nachteil, der duch das Clippen entsteht, welcher aber umgangen werden kann ;-) )
Zuletzt geändert von STARGÅTE am 08.09.2010 14:48, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von #NULL »

wow, das is schick!
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von dllfreak2001 »

:shock: Ich habe so etwas schon gesucht, sehr schön. :allright:
I´a dllfreak2001
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von STARGÅTE »

nach Berichten im englischen Forum, unterscheiden sich die Farb-Formate (RGB oder BGR) je nach Grafikkarte.
Das heißt, es ist bei DX9 nicht immer BGR wie ich erwartet hatte, wo RGB(255,0,0) blau wäre.

Da ich ja eigentlich das PixelFormat des Sprites brauche, bei welchem aber bei StartDrawing(SpriteOutput()) der Alpha-Kanal zerstört wird, wollte ich nun testen, in wie weit die Formate sich gleichen (Screen, Sprite, Image)

Dazu hier ein TestCode:

Code: Alles auswählen

InitSprite()
InitSprite3D()

Procedure.s GetPixelFormat(Value)
  Protected Result$
  If Value & #PB_PixelFormat_ReversedY
    Value & ~#PB_PixelFormat_ReversedY
    Result$ = "ReversedY , "
  EndIf
  Select Value
    Case #PB_PixelFormat_8Bits : Result$ + "8 Bit , 1 Byte , Palette"
    Case #PB_PixelFormat_15Bits : Result$ + "15 Bit , 2 Byte"
    Case #PB_PixelFormat_16Bits : Result$ + "16 Bit , 2 Byte"
    Case #PB_PixelFormat_24Bits_RGB : Result$ + "24 Bit , 3 Byte , RRGGBB"
    Case #PB_PixelFormat_24Bits_BGR : Result$ + "24 Bit , 3 Byte , BBGGRR"
    Case #PB_PixelFormat_32Bits_RGB : Result$ + "32 Bit , 4 Byte , (AA)RRGGBB"
    Case #PB_PixelFormat_32Bits_BGR : Result$ + "32 Bit , 4 Byte , (AA)BBGGRR"
  EndSelect
  ProcedureReturn Result$
EndProcedure

OpenWindow(0, 0, 0, 800, 600, "Screen", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)

CreateImage(1, 32, 32, 24)
StartDrawing(ImageOutput(1))
  Debug "24-Bit-Image          : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
 
CreateImage(2, 32, 32, 32)
StartDrawing(ImageOutput(2))
  Debug "32-Bit-Image          : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
 
CreateSprite(1, 32, 32)
StartDrawing(SpriteOutput(1))
  Debug "Sprite                : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
 
CreateSprite(2, 32, 32, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(2))
  Debug "Sprite-Texture        : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
   
CreateSprite(3, 32, 32, #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(3))
  Debug "Alpha-Sprite-Texture  : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
  
StartDrawing(WindowOutput(0))
  Debug "Window                : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
  
StartDrawing(ScreenOutput())
  Debug "Screen                : "+GetPixelFormat(DrawingBufferPixelFormat())
StopDrawing() 
   
Repeat
  ClearScreen(0)
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Mein Resultat:

Code: Alles auswählen

24-Bit-Image          : ReversedY , 24 Bit , 3 Byte , BBGGRR
32-Bit-Image          : ReversedY , 32 Bit , 4 Byte , (AA)BBGGRR
Sprite                : 32 Bit , 4 Byte , (AA)BBGGRR
Sprite-Texture        : 32 Bit , 4 Byte , (AA)BBGGRR
Alpha-Sprite-Texture  : 32 Bit , 4 Byte , (AA)BBGGRR
Window                : 
Screen                : 32 Bit , 4 Byte , (AA)BBGGRR
Bei mir wäre also alle BGR, und komischerweise liefert mit Window, garnix ^^

Wäre nett wenn ihr den Code auch testen könntet, und "ungewöhnliche" Resultate postet, danke
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag von Fluid Byte »

Code: Alles auswählen

24-Bit-Image          : ReversedY , 24 Bit , 3 Byte , BBGGRR
32-Bit-Image          : ReversedY , 32 Bit , 4 Byte , (AA)BBGGRR
Sprite                : 32 Bit , 4 Byte , (AA)BBGGRR
Sprite-Texture        : 32 Bit , 4 Byte , (AA)BBGGRR
Alpha-Sprite-Texture  : 32 Bit , 4 Byte , (AA)BBGGRR
Window                : 
Screen                : 32 Bit , 4 Byte , (AA)BBGGRR
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten