Frage

Ich habe eine VB6 -Anwendung (bitte nicht lachen), die viel Zeichnung über Bitblt und die Standard -VB6 -Zeichnungsfunktionen macht. Ich trete gegen Leistungsprobleme an (ja, ich mache die regulären Tricks wie das Zeichnen zum Gedächtnis). Also beschloss ich, andere Zeichnenmethoden zu untersuchen und bin auf OpenGL gestoßen.

Ich habe einige experimentiert und es scheint einfach, das meiste von dem zu tun, was ich will. Die Anwendung verwendet meist nur sehr einfaches Zeichnen - relativ große 2D -Rechtecke mit festen Farben und dergleichen -, aber ich konnte kein Äquivalent wie eine Lukenbrush oder ein Musterbrush finden.

Insbesondere möchte ich in der Lage sein, ein kleines monochromes Pixelmuster anzugeben, eine Farbe zu wählen und wenn ich ein Polygon (oder was auch immer) zeichne, anstatt dass es fest ist, lassen Sie es automatisch mit diesem Muster gekippt, nicht übersetzt oder gedreht oder gedreht oder verzerrt oder gestreckt, mit den "On" -Bits des Musters, die in der angegebenen Farbe angezeigt werden, und die "Aus" -Bits des Musters, die links ließen, was alles unter dem Bereich gezeichnet worden war, auf den ich jetzt zeichne.

Offensichtlich könnte ich alle Berechnungen selbst machen. Das heißt, anstatt als Polygon zu zeichnen, das für mich irgendwie automatisch gekachelt wird, könnte ich alle Linien oder Pixel berechnen oder was auch immer, die tatsächlich gezeichnet werden müssen, und zeichnen sie dann als Linien oder Pixel oder was auch immer. Aber gibt es einen einfacheren Weg? Wie im GDI sagen Sie nur "Zeichnen Sie dieses Polygon mit dieser Pinsel"?

Ich vermute, dass "Texturen" in der Lage sein könnten, das zu erreichen, was ich will, aber für mich ist es nicht klar (ich bin völlig neu in dieser und die Dokumentation, die ich gefunden habe, ist nicht ganz offensichtlich). Es scheint, als könnten Texturen das Muster basierend auf den Eckpunkten des Polygons verzerren oder übersetzen oder dehnen? Während ich das Muster beflilien möchte.

Gibt es eine Möglichkeit, dies zu tun, oder so etwas, außer so, außer der Brute -Force -Berechnung der Pixel/Linien/was auch immer das gezogen werden muss?

Vielen Dank im Voraus für jede Hilfe.

War es hilfreich?

Lösung

Wenn ich richtig verstanden habe, suchen Sie nach glpolygonstipple () oder gllinestipple ().

Polygonstipple ist sehr begrenzt, da es nur 32x32 Muster ermöglicht, aber es sollte wie Musterbrush funktionieren. Ich habe jedoch keine Ahnung, wie ich es in VB implementieren kann.

Andere Tipps

Sind Sie sicher, dass es sich um den Zeichnungsvorgang selbst handelt, der hier der Engpass ist? Visual Basic ist dafür bekannt, sehr langsam zu sein (Besonders Wenn Ihr Programm mit dem Intermediary VM -Code kompiliert wird - das ist der Standard -AFAIRC. Stellen Sie sicher, dass Sie die Option zum Kompilieren von nativem Code überprüfen!). Wenn es sich um Ihren Code handelt, ist OpenGL Ihnen nicht viel hilft - Sie müssen Ihren Code in einer anderen Sprache neu schreiben - wahrscheinlich C oder C ++, aber jeder .NET Lang sollte es auch tun.

OpenGL enthält Funktionen, mit denen Sie gestaltete Linien und Polygone zeichnen können, aber Sie sollten sie nicht verwenden. Sie sind lange veraltet und wurden in Version 3.1 der Spezifikation von OpenGL entfernt. Und das ist aus einem Grund - diese Funktionen karten nicht gut auf das moderne Rendering -Paradigma und werden nicht von modernen Grafikhardware unterstützt - dh Sie werden höchstwahrscheinlich eine erhalten langsam Software Fallback, wenn Sie sie verwenden.

Der Weg zu gehen besteht darin, eine kleine Textur als Maske zu verwenden und sie über die gezogenen Polygone zu fliesen. Die Textur wird gestreckt oder komprimiert, um den Texturkoordinaten zu entsprechen, die Sie mit den Scheitelpunkten angeben. Sie müssen den Verpackungsmodus auf einstellen GL_REPEAT Für beide Texturkoordinaten und berechnen Sie die richtigen Koordinaten für jeden Scheitelpunkt, so dass die Textur in ihrer ursprünglichen Größe angezeigt wird, und wiederholt die richtige Menge.

Sie könnten auch den Schablonenpuffer wie Sie beschrieben verwenden, aber ... wie würden Sie diesen Puffer mit dem Muster füllen und es tun schnell? Sie würden sowieso eine Textur brauchen. Denken Sie daran, dass Sie den Schablonenpuffer jeden Rahmen löschen müssen, bevor Sie mit dem Zeichnen beginnen. Dies könnte Sie nicht kosten a fest Performance -Hit (der genaue Wert von "massiv" abhängig von der Grafikhardware und der Treiberversion).

Es ist auch möglich, den gewünschten Effekt mit einem Fragment-Shader zu erzielen, aber das Lernen von Shadern dafür wäre ein Overkill für einen OpenGL-Anfänger wie Sie :-).

Ah, ich glaube, ich habe es gefunden! Ich kann eine Schablone über das gesamte Ansichtsfenster in der Form des gewünschten Musters (oder der Maske, wie)) herstellen und diese Schablone dann aktivieren, wenn ich mit diesem Muster zeichnen möchte.

Sie könnten einfach eine Textur verwenden. Geben Sie das Muster wie im Bild ein und schalten Sie die Textur wieder ein und Sie können loslegen.

Das herausgefunden a vor ein oder zwei Jahren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top