Ist GdiPlus zum Zeichnen komplexer Dinge geeignet?



  • Hi, ich suche eine Lib, mit der ich:

    -Shapes (Rechtecke, Ellipsen) mit: Farben, Transparenz (Color Key), Alpha (Gesamte Transparenz)-> ggf. AntiAliasing
    -Sprites mit: Blending, Transparenz, Alpha Kanälen, Alpha Blending, Rotation, Scaling

    zeichnen kann. Da ist mir die GDIPlus Lib aufgefallen. Das Problem ist: Bei zu komplexen Dingen macht sie schlapp und die Auslastung geht auf 100 % (Die kann nicht mal auf 640 x 480 ein Gitter mit 32 Px Größe Zeichnen). Welche Bibliothek ist dafür geeignet? Ich möchte nämlich endlich mal ein Spiel programmieren, ohne Standard GDI zu benutzen. Ich habe bisher (außer GDIPlus) sonst keine Lib gefunden, die das schafft.

    OpenGL und DirectDraw?

    => Die Tutorial Seiten führen mich nur darin ein, wie ich Bilder zeichne und diese rotiere. Von >Transparenz< ist da nirgendwo die Rede. Ich würde mich freuen, wenn mir einer einen Link schicken könnte. Wenn dann sogar auf einen Link, wo mir erklärt wird, wie ich ein simples Rechteck mit 50% Alpha darstellen kann.

    mfg Critical



  • Link für OpenGL: http://nehe.gamedev.net/

    Link zu Alpha transparenz: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08

    Schau dir erstmal die OpenGL Grundlagen an, sonst hast du ziemliche Probleme mit dem Verständnis von dem Beispiel.

    Mit DirectDraw und Direct3D geht das übrigens auch. Hab dafür aber keinen Link.



  • Vielen Dank! OpenGL eignet sich wirklich besser, aber das mit dem Koordinaten ist schlecht gelöst.
    Gibt es eine Funktion in der GDI, mit der ich ein Bild drehen kann?
    Mit der "GradientFill" Funktion kann ich Transparenz auf ein Rechteck machen, warum geht das nicht auch mit normalen Rechtecken, Bildern und Texten?



  • Critical schrieb:

    OpenGL eignet sich wirklich besser, aber das mit dem Koordinaten ist schlecht gelöst.

    Liegt wahrscheinlich daran, dass OpenGL primär für 3D-Anwendungen gedacht ist... 😉



  • Critical schrieb:

    OpenGL eignet sich wirklich besser, aber das mit dem Koordinaten ist schlecht gelöst.

    wie würdest du denn das mit dem koordinaten lösen? [sic]



  • Wenn ich 2D Anwendungen schreiben will dann möchte ich keinen Raum von 0.0f bis 1.0f haben sondern z.B. 0 bis 640px. In OpenGL ist es möglich, Rechtecke mit Transparenz zu zeichnen. In DirectDraw komischerweise nicht...



  • Critical schrieb:

    Wenn ich 2D Anwendungen schreiben will dann möchte ich keinen Raum von 0.0f bis 1.0f haben sondern z.B. 0 bis 640px.

    du kannst doch eine beliebige skalierung festlegen. oder du arbeitest mit vortransformierten vertices, die du direkt im screenspace angibst.

    In OpenGL ist es möglich, Rechtecke mit Transparenz zu zeichnen. In DirectDraw komischerweise nicht...

    ich wüsste jetzt nicht, was dich davon abhalten könnte in directdraw "rechtecke mit transparenz" (was auch immer das genau heißen soll) zu zeichnen.
    aber directdraw ist eh veraltet. nimm lieber direct3d.



  • Stell dir halt eine passende Projektions-Matrix ein wenn du Koordinaten von 0 bis 639 (oder was auch immer) verwenden willst.



  • Nagut, Direct3D kann ich ja probieren, hat aber vom Aufbau der Funktionen mir nicht gezeigt, dass es da diese Shape Draw Funktionen (Shapes, also Rechtecke, Kreise) gibt.
    Und Rechtecke mit Transparenz ist wohl falsch ausgedrückt. Ich meine ein Rechteck, was z.B. halbdurchsichtig, also nen Alpha Wert von 128 von 255 hat.



  • alphablending ist mit direct3d oder opengl kein problem, das erledigt die hardware für dich.

    wenn du aber primitive außer punkte, linien, dreiecke und rechtecke rendern willst, musst du das selbst programmieren. sprich die primitiven aus dreiecken zusammensetzen, oder sie mit texturierten quads nachahmen.
    das ist aufwendiger als mit gdi+, dafür aber auch um ein vielfaches schneller.
    für opengl gibts glut, das implementiert ein paar höhere primitiven, allerdings nur in 3d, afair.

    es gibt sicher mehrere wrapper, die komfortablere 2d-funktionen für d3d oder ogl zur verfügung stellen. google könnte helfen.

    du hast zwar in winapi gepostet, aber flash sollte man in dem zusammenhang vielleicht auch mal erwähnen. das kann alles was du genannt hast schon von haus aus.



  • Mit GDI+ bekommt man eigentlich einiges hin. Die performance beim direkten Schreiben auf den Bildschirm ist dabei aber nicht unbedingt sonderlich gut (soll mit Vista besser sein). Du kannst aber in ein backbufffer schreiben und das Bild komplettt rüberkopieren.

    Genaueres weiß ich auch nicht 🙂

    Was hast Du denn genau vor?



  • Eigentlich möchte ich in den Bereich Spieleprogrammierung gehen und da sollen dann doch schon ein paar Effekte drin sein. ich habe bereits ein Maze Game und ein Tetris programmiert, aber da sind 0 Effekte drin alles nur mit Backbuffer und Bitmaps realisiert. Aber ich möchte z.B. bei Sprites den Alpha Wert einstellen. Sozusagen als "Fader". Aber das ist mit Gdi nicht möglich. Und in DDraw & Direct3D habe ich so eine Funktion noch nicht gesehen. Was ich bräuchte z.B.:

    DrawRectangle(int x, int y, int x2, int y2, ARGB Color, bool bOutlined);
    DrawEllipse(int x, int y, int x2, int y2, ARGB Color, bool bOutlined);

    oder:

    DrawSetAlpha(OBJEKT zielobjekt, dword alpha);



  • direct3d und opengl können all das was du brauchst, und noch viel mehr. man muss sich nur damit beschäftigen und die vorhandenen bausteine richtig zusammensetzen. solche high-level funktionen wie du sie willst, gibt es dort nicht direkt. sie lassen sich aber mit wenig aufwand nachprogrammieren.

    wenn dir das zu viel ist, musst du dir eine (2d) graphics engine suchen, die diese von dir gewünschten funktionen bereitstellt.
    es aber wenigstens einmal selber machen ist natürlich besser, weil man dann auch was dabei lernt. und als spieleprogrammierer sollte man wenigstens die allertrivialsten grundlagen drauf haben, wie z. b. ein rechteck mit alphablending in opengl rendern 🙄



  • Ah ok! Vielen Dank für deine Hilfe ich werde mal Versuchen mich zu Informieren. Bei weiteren Problemen werde ich hier dann schreiben.


Anmelden zum Antworten