zeichenprogramm



  • ich will ein zeichenprogramm mit directx oder opengl schreiben.
    das zeichenprogramm soll im grunde nur einfache linien zeichnen können, davon aber tausende viele tausende in kurzer zeit.
    für mich ist besonders die geschwindigkeit sehr wichtig.

    was ist die beste möglichkeit ein solches programm zu erstellen? ich hatte die idee, ich erstelle mir eine leere textur, welche ich auf dem bildschirm dann ausgebe.
    während des zeichnens setze ich dann mit irgendeinem algorithmus die einzelnen pixel entlang der gezeichneten ulinie.
    normalerweise müsste dieses system doch das absolut schnellste sein, denn egal wie ich es mit directx/opengl rendern würde, im grunde würde auch nur eine textur erstellt und die linien darauf gerendert, nur dass dabei dann sehr viele andere sachen hinzukommen würden, welche für meinen sehr einfachen anwendungszweck unnötig wären.

    meine frage ist nun, wie erstelle ich in directx/opengl am besten und schnellsten eine textur, setze einzelne pixel und gebe das ganze auf dem bildschirm aus.

    das wichtigste ist die zeichengeschwindigkeit und ich möchte weil ich nur simple linien zeichnen wil möglichst low-level arbeiten, damit ich möglichst viele sachen, welche ich nicht benötige auslassen kann.

    PS: bitte kommt jetzt nicht mit der idee die winapi zu nutzen um das zu machen, ich will directx oder opengl nutzen.


  • Mod

    gamer8o4 schrieb:

    während des zeichnens setze ich dann mit irgendeinem algorithmus die einzelnen pixel entlang der gezeichneten ulinie.

    ich dachte du willst das moeglichst schnell haben, wieso machst du es dann in software statt die GPU die fuer sowas gebaut ist das machen zu lassen?



  • Einfach

    glBegin(GL_LINES);
    glVertex3f(0.0f, 0.0f, 0.0f);
    glVertex3f(10.0f, 0.0f, 0.0f);
    glEnd();
    

    zum Zeichnen von Linien. (Farbe mal wegegelassen, sollte aber keine große Kunst sein)

    Wenn du zu Beginn jedes Frames das leren des Zeichenpuffers (-> GL_COLOR_BUFFER_BIT) auslässt werden vorherigen Linien übermalt und verschwinden nicht wieder.



  • ich dachte du willst das moeglichst schnell haben, wieso machst du es dann in software statt die GPU die fuer sowas gebaut ist das machen zu lassen?

    ein teil meiner frage, hardwarebeschleunigung brauche ich auf jeden fall, denn sonst könnte ich ja gleich die gdi+ nehmen.

    Wenn du zu Beginn jedes Frames das leren des Zeichenpuffers (-> GL_COLOR_BUFFER_BIT) auslässt werden vorherigen Linien übermalt und verschwinden nicht w

    👍 top idee, ich hatte bis jetzt etwas angst, dass ich alles jeden frame rendern müsste und dann riesige vertexbuffer habe, die immer wieder gerendert werden müssen 🤡

    Einfach
    C:
    glBegin(GL_LINES);
    glVertex3f(0.0f, 0.0f, 0.0f);
    glVertex3f(10.0f, 0.0f, 0.0f);
    glEnd();

    zum Zeichnen von Linien. (Farbe mal wegegelassen, sollte aber keine große Kunst sein)

    okay, das sieht schon einmal recht gut aus 🙂 hat jemand auchnoch eine lösung mit directx, damit ich etwas zum vergleichen habe? geschwindigkeitsunterschiede wird es zwar warscheinlich nicht geben, aber...



  • Naja mit DirectX kenn ich mich nicht so aus, aber da wird es recht ähnlich laufen. Kanns ja mal nach dem kleinen Sample suchen, dann halt statt nem Dreieck eine Linie zeichnen.
    Allerdings unterstützt DirectX diesen Immediate Mode von OpenGL nicht, d.h. du musst alle Linien die du zeichnen willst in ein Array packen und dieses Array zeichnen (auch wenn du nur eine Linie hast).

    Allerdings warum nicht einfach OpenGL verwenden ? Performacetechnsich geben die sich nicht viel, und OpenGL ist auch noch plattformunabhängig.
    Aber ok ist vielleicht Geschmackssache welche API man lieber mag 😉



  • Naja mit DirectX kenn ich mich nicht so aus, aber da wird es recht ähnlich laufen. Kanns ja mal nach dem kleinen Sample suchen, dann halt statt nem Dreieck eine Linie zeichnen.
    Allerdings unterstützt DirectX diesen Immediate Mode von OpenGL nicht, d.h. du musst alle Linien die du zeichnen willst in ein Array packen und dieses Array zeichnen (auch wenn du nur eine Linie hast).

    Allerdings warum nicht einfach OpenGL verwenden ? Performacetechnsich geben die sich nicht viel, und OpenGL ist auch noch plattformunabhängig.
    Aber ok ist vielleicht Geschmackssache welche API man lieber mag

    DirectX macht es einem wirklich unnötig kompliziert solche einfachen sachen zu machen.
    Bis jetzt habe ich nur mit DirectX gearbeitet, aber aber du hast recht, warum nicht OpenGL, wenn es dort nachteile gibt, dann ganz sicher nicht bei solchen minianwenungen 🙂
    und plattformunabhängigkeit ist auch nicht schlecht.



  • Was genau ist denn das Ziel bzw. was möchtest du erreichen?

    Wenn es um Geschwindigkeit geht nicht den Immediate Mode verwenden wie im Beispiel von DarkShadow44 sondern Vertex Buffer Objekte benutzen.
    Die ganzen einzelnen Aufrufe von glBegin glVertex3f glEnd würden nur die CPU heizen und eine halbwegs moderne GPU nicht ansazweise auslasten.

    Mehr kann ich dazu nicht sagen, ansonsten uns bitte noch ein wenig mit Informationen füttern was es denn werden soll. 🙂



  • es soll eigentlich ein programm werden, bei dem.ich selber besser programmieren lerne.
    ich schreibe ein zeichenprogramm, in welchem ich "den linsel" per eigener scriptsprache steuern kann.
    die scriptsprache soll einen eigenen kleinen compiler haben, der das ganze in ein eigenes bytecodeformat umwandelt.
    ich will am ende dass komplexe zeichenprogramme möglichst schnell abgearbeitet werden.
    das ganze ohne externe libraries außer stl und opengl/directx 🙂 soweit der plan...

    dardurch lerne ich hoffentlich besser:
    - grafikprogramierung
    - compilerarchitektur
    - scriptsprachenimplementierung in c++ code
    - file parsing
    - gui-programmierung
    - multithreaded programming
    - .....



  • Wenn es um Geschwindigkeit geht nicht den Immediate Mode verwenden wie im Beispiel von DarkShadow44 sondern Vertex Buffer Objekte benutzen.

    Ja das stimmt allerdings, aber ich glaube nicht dass der Performanceverlust da so stark ins Gewicht fällt. Aber wenn kann mans ja immer noch auf Vertex Arrays oder Buffer umstellen. 😃

    es soll eigentlich ein programm werden, bei dem.ich selber besser programmieren lerne.

    Oh da hast du dir ja einiges vorgenommen. Dann wünsch ich dir mal viel Erfolg 😉

    Wie genau soll die Scriptsprache denn dann den Pinsel steuern ?
    Irgendwie kann ich mir das grad nicht vorstellen, einfach indem gesagt wird "bewege den Pinsel von A nach B" ?

    Und nur so aus Neugier - wie weit bist du denn schon mit deinem Projekt wenn ich fragen darf ?
    (Ich arbeite grad auch an einem eigenen kleinen Compiler :D)



  • ich bin gerade fertig mit dem filesystem und will jetzt die zeichenfunktionen implemendieren. weil die scriptsprache diese später ausruft muss ich die erst machen.

    en.m.wikipedia.org/wiki/Logo_(programming_language)#section_3
    so musst du dir das vorstellen (nur besser 🤡 )



  • Ja da hast du ja noch einiges vor dir ^^

    Aber ich glaube nicht dass du da große Performanceprobleme bekommst.

    Ich würde da einfach mal anfangen und nicht so auf die Performance achten (optimieren kannst du später immer noch), sonst bekommst du da höchstens Motivationsprobleme weil du nicht vorankommst 😃


Anmelden zum Antworten