B3D - Direct2D

Kommentare anzeigen Worklog abonnieren

Worklogs B3D - Direct2D

Tadäää - ImageBuffer

Dienstag, 28. Februar 2012 von Chester

Eine Hürde ist geschafft. Absofort sind Bildmanipulationen über ImageBuffer möglich.

Ein Bild wird ganz normal mit CreateImage(breite, höhe) erstellt und mit SetBuffer kann zwischen ImageBuffer und BackBuffer gewechselt werden. Wie das normale Rendern auch, müssen die Zeichenbefehle von BeginDraw() und EndDraw() umgeben sein. Anschließend ist noch ein UpdateImage Aufruf notwendig. Ist zwar jetzt ein bisschen mehr, als man von B3D gewöhnt ist, funktioniert aber im Grunde genauso einfach.

In folgendem Beispielcode wird ein 50x50 Bild erstellt. In Echtzeit wird nun das Bild manipuliert, es wird ein weißer Rahmen gezeichnet und innen drin, wird die FPS angezeigt. Die Zeit für die Bildmanipulation ist <1 ms. Aber hier habe ich noch nicht wirklich getestet, deshalb die Zeit bitte mit Vorsicht genießen.

Beispielcode:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,2

Initialize()

white=CreateBrush(255,255,255,255)

font=LoadFont ("Arial",18)
SetFont font

img=CreateImage(50,50)

SetBuffer BackBuffer()

While (Render() And KeyHit(1)=0)

ms=MilliSecs()

SetBuffer ImageBuffer(img)

BeginDraw()
Cls()
SelectBrush white

DrawRect (0,0,50,50,0) ; Rahmen
DrawText 10,10,fps
EndDraw()

UpdateImage (img)

SetBuffer BackBuffer()

ms2=MilliSecs()-ms

BeginDraw()
SelectBrush white
Cls()

DrawImage img, MouseX(),MouseY()
DrawText 10,10,"Zeit für Bildmanipulation: "+ms2
EndDraw()

fps=1000/(MilliSecs()-ms)
Wend
WaitKey()
clean()


Für die, die es interessiert: Die ImageBuffer sind einfach nur eigene RenderTargets. Direct2D bietet hier ganz gute Möglichkeiten.

Freitag, 24. Februar 2012 von Chester

Da mein Irrlicht Port nie fertig wurde, möchte ich das mal wieder gutmachen und zumindest eine funktionierende 2D Version zur Verfügung stellen. Die soll diesmal innerhalb den nächsten 4 Wochen (Semesterferien) auch fertig werden. Smile

Hier habe mich nun aber von Irrlicht komplett entfernt und arbeite direkt mit Direct2D.
Direct2D ist eine Komponente von DirectX10.1, läuft aber auch auf DirectX 9 Hardware. Mehr dazu hier: Direct2D

Dies hat den Vorteil, dass ich von Irrlicht unabhängig bin, auf der aktuellen Technik aufbauen kann und mir umständliche Strukturen von Irrlicht spare. Nachteil ist hierbei, dass (vorerst) eine identische Struktur zu B3D nicht möglich ist.

Beispiel:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,2

Initialize()

testBrush=CreateBrush(5,123,242,150)

testImg = LoadImage("test.bmp")
testFont=LoadFont ("Arial",18)
SetFont testFont

While (Render() And KeyHit(1)=0)
BeginDraw()


Draw2DImage img, MouseX(), MouseY();

SelectBrush testBrush
DrawLine 10,10, 500, 500, 1

EndDraw()
Wend

Clean()
End()


Was hier natürlich gleich auffällt, sind die Brushs. Diese sind das Pendant zu dem Blitzinternen Color.

Statt
Code: [AUSKLAPPEN]
Color 255,0,255

muss der Brush vorher erstellt werden, mit SetBrush setzt man den aktuellen Brush fest, der für Text, Line, Oval, Rect und co. gilt. (an dieser Stelle fällt mir gerade auf, dass Plot noch fehlt) Very Happy
Code: [AUSKLAPPEN]
brush = CreateBrush ( 255,0,255, 255) ; r,g,b, alpha
;---
SetBrush brush




Was bisher alles geht:
  • Initialize()
  • Clean()
  • Render()
  • BeginDraw()
  • EndDraw()
  • ClsColor r%,g%,b%

  • DrawLine x%,y%, x2%, y2%, stroke#
  • DrawRect x%,y%, width%, height%, filled%
  • DrawOval x%,y%, width%, height%, filled%
  • DrawImage my_img, x%, y%
  • DrawText x%, y%, "Mein Text"

  • CreateBrush( r%, g%, b%, a%)
  • LoadImage( "Mein Bild.bmp" )
  • LoadFont ( "Font", Size% )
  • SetFont my_font
  • SetBrush my_brush