Gibt es eine absolut primitive Grafikbibliothek die einzelne Pixel in ein Fenster zeichnet und crossplattform fähig ist?



  • Problem:

    Ich brauche eine 2d Fläche in die ich einzelne Pixel schnell und effizient hineinzeichnen kann und das ganze sollte Plattformunabhängig sein und in C programmiert sein.
    Also sowohl unter Windows, X-Window als auch Mac OS X und wenn möglich unter sonstige Raritäten laufen.

    Natürlich könnte ich nun hergehen und plattformspezifischen Code schreiben.
    D.h. unter Windows nehme ich die winapi und eröffne ein 2d Surface in die in meine Pixel reinzeichne, unter Linux nehme erstelle ich ein 2d Surfe via dem X Window System usw., aber dies bedeutet, dass ich den plattformspezifischen Code alles selber schreiben müsste.

    Daher suche ich eine fertige Library die so etwas kann.

    Prinzipiell könnte ich ja auch einfach die SDL Lib nehmen, damit würde das durchaus gehen. Allerdings gibt es bei der das Problem, dass die mehr kann, als nur einzelne Pixel zu setzen.
    Ich kann z.B. Linien Zeichen oder ganze Bilder reinmalen lassen.
    Das möchte ich aber alles selbst programmieren, daher ist es nicht so gut, wenn ich eine Lib nehme, die das schon zur Verfügung stellt.

    Gibt es also eine Lib, die das was ich möchte kann?



  • Sag nicht, du willst das Bilder zeichnen etc. implementieren, indem du einzelne Pixel setzt...



  • Nathan schrieb:

    Sag nicht, du willst das Bilder zeichnen etc. implementieren, indem du einzelne Pixel setzt...

    Doch, ich zeichne in einen Doublebuffer, der soll dann kurz geswitched werden und das Bild darstellen.



  • Doch, ich zeichne in einen Doublebuffer, der soll dann kurz geswitched werden und das Bild darstellen.

    Und warum nicht einfach ein paar Zeilen supersimplen und superschnellen OpenGL code nutzen ? 😕
    Was genau willst du denn erreichen ?



  • DarkShadow44 schrieb:

    Doch, ich zeichne in einen Doublebuffer, der soll dann kurz geswitched werden und das Bild darstellen.

    Und warum nicht einfach ein paar Zeilen supersimplen und superschnellen OpenGL code nutzen ? 😕
    Was genau willst du denn erreichen ?

    Es geht nur um das Learning by Doing.
    Also wie wird's gemacht.
    Geschwindigkeit ist somit eigentlich nicht so wichtig.
    Softwarerendering reicht.

    Eine Bibliothek die hier keine eigenen Werkzeuge zur Verfügung stellt halte ich daher für ideal.



  • Es geht nur um das Learning by Doing.

    Und was genau willst du lernen ?
    Das Zeichnen selber ist echt simpel:

    For(x=0; x<width; x++)
    {
        For(y=0; y<height; y++;)
        {
            SetPixel(x,y,color[y][x]);
        }
    }
    

    Der Rest ist platformspezifischer code, den willst du ja nicht selberschreiben.

    Wenn du nen Softwarerenderer willst: Render in ein Array und lass es ne lib wie SFML zeichnen.



  • EDIT: In der Zeit in der ich den Beitrag hier mir aus dem Ärmel gezogen hab, habt ihr in zwei kurzen Beiträgen die Lösung schon geschrieben

    Ich glaube er will sowas wie einen Software-Renderer schreiben, auch wenn es mit Sicherheit interessant ist, stellt sich mir weiterhin die Frage: Warum??
    Aber um mal kurz auf dein Problem einzugehen:
    Ich hab mich zwar noch nie mit dem Thema auseinandergesetzt, aber an deine Stelle würde ich einfach ein 2D Array mit RGB werten nehmen und als "Rendertarget" benutzen. Du kannst ziemlich einfach auf jeden Wert zugreifen und wenn du fertig mit "zeichnen" bist, dein 2D Array mithilfe von OS-spezifischen Funktionen (eine kurze suche im Internet hat mir für Windows CreateBitmap geliefert) als Bild interpretieren lassen und dann auf dein Fenster zeichnen lassen. Der Plattformspezifische Code hat für jedes OS vielleicht 200 - 300 Zeilen, der Softwarerenderer dürfte dagegen je nachdem wie umfangreich du ihn machst mehrere Tausend haben (eher mehr). Wenn der Plattformspezifische Code für jedes Betriebssystem gut abstrahiert ist, hast du zum Schluss ein Code für mehrere Betriebssysteme und musst nur noch beim Kompilieren dein Ziel OS kennen.

    Ich würd an deine Stelle einfach DirectX oder OpenGL nehmen, beides ist Low-Level und nutzt die Hardware ==> deutlich schneller.

    floorball





  • dot schrieb:

    https://code.google.com/p/pixeltoaster/ 😉

    Danke für den Hinweis.
    Leider ist diese Lib für C++, ich bräuchte eine die auch mit C funktioniert.
    Aber der Link hat mir trotzdem geholfen, denn TinyPTC scheint dies zu bieten und ist im Gegensatz zu OpenPTC auch für Mac OS X verfügbar:

    http://sourceforge.net/projects/tinyptc/

    Die einzige Frage ist jetzt nur noch, wie gut TinyPTC supported wird?
    Kann man sich bei dieser darauf verlassen, dass man die auch noch in 15 Jahren für moderne OS nutzen kann?
    Also gegebenfalls auch dann noch Anpassungen vorgenommen werden, wenn die alte Version nicht mehr unter Windows 8+n oder sonst ein bis dahin gut genutztes OS läuft?

    @floorball
    Ja, ein SW Renderer.
    OpenGL wäre zwar praktibal, aber bietet leider halt auch wieder das Problem, dass man OpenGL spezifische Funktionen nutzen kann, um auch so eine gegeben Aufgabe umzusetzen.



  • Hm, die TinyPTC Lib gefällt mir, im Prinzip hat die nur drei Funktionen, damit ist sie sehr überschaubar.
    Was noch fehlt ist eine plattformunabhängige Tastatureingabe.

    Die muss ich dann wohl selbst schreiben, allerdings habe ich kein MacOS X und könnte das zumindest darauf nicht testen. 😞

    OpenPTC bietet zwar Support für eine Tastatureingabe an, aber der Code ist teilweise in C++ geschrieben und einen Port für Mac OS X gibt es dort auch nicht.

    Gibt es noch weitere Alternativen?



  • Primitivus schrieb:

    Die einzige Frage ist jetzt nur noch, wie gut TinyPTC supported wird?
    Kann man sich bei dieser darauf verlassen, dass man die auch noch in 15 Jahren für moderne OS nutzen kann?
    Also gegebenfalls auch dann noch Anpassungen vorgenommen werden, wenn die alte Version nicht mehr unter Windows 8+n oder sonst ein bis dahin gut genutztes OS läuft?

    Ist doch vollkommen Schnuppe wenn's nur um ein Spassprojekt/Lernprojekt geht.
    Oder hab ich dein "geht nur um Learning by Doing" falsch verstanden?

    Ich hoffe nur du schreibst nicht mit "Learning by Doing" Software auf die irgendjemand angewiesen ist...

    ps: Und nachdem das Übertragen einer "Memory Bitmap" auf den Bildschirm echt keine Herausforderung ist, ist es auch vollkommen egal wie lange das Ding supported wird. Notfalls schreibst du die 3 1/2 Zeilen Code pro Plattform halt selbst.



  • Meinst nicht, dass Steuersoftware für Atomkraftwerke auch in Learning by doing Manier von Praktikanten geschrieben wird?



  • Nein.



  • Nimm SDL 2. Das ist eine simple Grafik Bibliothek speziell für 2D und ist crossplattform tauglich.

    Das ist zwar auch C++, aber C++ ist eh C mit ein paar mehr Spielereien. Damit kannst du ganz simpel Pixel irgendwo hinzeichnen oder auch schwerere Sachen mit machen.

    Ist außerdem sehr gut dokumentiert, finde ich:
    http://wiki.libsdl.org/FrontPage

    Da kann man schön Funktionen suchen und auch verwandte Funktionen durchstöbern.
    Gibt außerdem einige SDL2 Tutorials mittlerweile auf youtube oder im Netz.



  • PadMad schrieb:

    Nimm SDL 2. Das ist eine simple Grafik Bibliothek speziell für 2D und ist crossplattform tauglich.

    Das ist zwar auch C++, aber C++ ist eh C mit ein paar mehr Spielereien. Damit kannst du ganz simpel Pixel irgendwo hinzeichnen oder auch schwerere Sachen mit machen.

    Ist außerdem sehr gut dokumentiert, finde ich:
    http://wiki.libsdl.org/FrontPage

    Da kann man schön Funktionen suchen und auch verwandte Funktionen durchstöbern.
    Gibt außerdem einige SDL2 Tutorials mittlerweile auf youtube oder im Netz.

    SDL & SDL2 sind in C geschrieben.



  • Ich würde die SDL nehmen, auch wenn du den Löwenanteil nicht nutzt. Einen Software-Renderer zu schreiben halte ich für absolutes Pflichtprogramm wenn ernsthaft was mit 3D-Grafik machen will. Denn hier lernst du wirklich was von vorne bis hinten nötig ist um 3D auf dem Bildschirm zu zaubern.

    Ein Dreieck wird eben nicht automatisch wie durch Zauberhand gezeichnet, da muss man sich schon einige Gedanken machen um das effektiv umzusetzen. Hinterher hast du ein umfassendes Verständnis was in deiner Grafikkarte abgeht und darfst dann auch gerne High-Level coden indem du OpenGL nimmst.


Anmelden zum Antworten