Question

J'ai une application VB6 (s'il vous plaît ne riez pas) qui fait beaucoup de dessin via BitBlt et les fonctions dessin standard VB6. Je courais contre les problèmes de performance (oui, je fais des tours réguliers comme le dessin à la mémoire). J'ai donc décidé d'étudier d'autres moyens de dessin, et je suis venu sur OpenGL.

Je fais quelques expériences, et il semble facile de faire la plupart de ce que je veux; l'application utilise la plupart du temps ne dessin très simple - 2D rectangles relativement grandes de couleurs solides et telles -. mais je ne l'ai pas été en mesure de trouver un équivalent à quelque chose comme un HatchBrush ou PatternBrush

Plus précisément, je veux être en mesure de spécifier un petit motif de pixels monochrome, choisissez une couleur, et chaque fois que je dessiner un polygone (ou autre), au lieu d'être solide, faites-le en mosaïque automatiquement avec ce modèle, non traduit ou en rotation ou en biais ou étiré, avec le « sur » bits du motif montrant dans la couleur spécifiée, et le « off » bits du modèle gauche affichant tout ce qui avait été établi dans la région que je dessine maintenant.

Il est évident que je pouvais faire moi-même tous les calculs. C'est, au lieu de dessiner un polygone qui sera en quelque sorte automatiquement en mosaïque pour moi, je pouvais calculer toutes les lignes ou pixels ou quoi que vraiment besoin de tirer, puis les dessiner sous forme de lignes ou de pixels ou autre chose. Mais est-il un moyen plus facile? Comme dans GDI, où vous dites simplement « dessiner ce polygone en utilisant ce pinceau »?

Je devine que « textures » pourraient être en mesure d'accomplir ce que je veux, mais ce n'est pas clair pour moi (je suis tout à fait nouveau à cela et la documentation que j'ai trouvé est pas tout à fait évident); il semble que les textures pourraient biaiser ou traduire ou étirer le motif, sur la base des sommets du polygone? Alors que je veux que le motif.

Est-il possible de le faire, ou quelque chose comme ça, autre que le calcul de la force brute exactement les pixels / lignes / whatever qui doivent tirer?

Merci d'avance pour toute aide.

Était-ce utile?

La solution

Si je comprends bien, vous cherchez glPolygonStipple () ou glLineStipple () .

PolygonStipple est très limitée car elle ne permet que modèle mais il 32x32 devrait fonctionner comme PatternBrush. Je ne sais pas comment le mettre en œuvre en VB cependant.

Autres conseils

Tout d'abord, êtes-vous sûr qu'il est l'opération de dessin lui-même qui est le goulot d'étranglement ici? Visual Basic est connu pour être très lent ( Surtout si votre programme est compilé à l'intermédiaire du code VM -.! Qui est la valeur par défaut AFAIRC Assurez-vous de vérifier la possibilité de compiler en code natif), et si elle est votre code qui est le goulot d'étranglement, alors OpenGL ne vous aidera pas beaucoup - vous aurez besoin de réécrire votre code dans une autre langue -. probablement C ou C ++, mais toute lang .NET devrait également faire

OpenGL contient des fonctions qui vous permettent de tracer des lignes pointillées et des polygones, mais vous ne devriez pas les utiliser. Ils sont déconseillés pendant longtemps, et se sont retirés de OpenGL dans la version 3.1 de la spécification. Et c'est pour une raison - ces fonctions ne sont pas bien adaptées au paradigme de rendu moderne et ne sont pas pris en charge par le matériel graphique moderne -. Ce qui signifie que vous aurez fort probablement un logiciel lent fallback si vous les utilisez

Le chemin à parcourir est d'utiliser une petite texture comme un masque, et la tuile au-dessus des polygones dessinés. La texture sera pas étirée ou compressée pour correspondre aux coordonnées de texture que vous spécifiez avec les sommets. Vous devez définir le mode d'emballage à GL_REPEAT pour les coordonnées de texture, et calculer les coordonnées droite pour chaque sommet de sorte que la texture apparaît à sa taille d'origine, répète la bonne quantité de temps.

Vous pouvez également utiliser le tampon de pochoir que vous avez décrit, mais ... comment voulez-vous remplir ce tampon avec le motif, et de le faire rapide ? Vous auriez besoin d'une texture de toute façon. Rappelez-vous que vous devez effacer le pochoir tampon chaque image, avant de commencer à dessiner. Ne pas le faire pourrait vous coûter massif a frappé la performance (la valeur exacte de fonction « massif » sur le matériel graphique et la version du pilote).

Il est également possible d'obtenir l'effet désiré à l'aide d'un fragment shader, mais pour l'apprentissage des shaders qui serait un surpuissant pour un débutant OpenGL comme vous: -).

Ah, je crois que je l'ai trouvé! Je peux faire un pochoir à travers la fenêtre entière dans la forme du modèle que je veux (ou son masque, je suppose), puis activez ce pochoir quand je veux dessiner avec ce motif.

Vous pouvez simplement utiliser une texture. Mettez le modèle en tant que l'image et tourner la texture répéter et vous êtes bon pour aller.

compris cela un an ou deux il y a .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top