Comment débuter avec du BGL?

Ici on parle des scripts

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Comment débuter avec du BGL?

Message par VincentG » 20 Déc 2015, 17:32

Hello à tous,

J'aimerais faire un script vraiment très simple pour afficher des points dans l'espace dans la vue 3D avec une couleur et une taille. Je ne sais absolument pas par où commencer :roll:
Est-ce que quelqu'un pourrait montrer un exemple très très basique ou me guider pour afficher par example, en opengl, deux points à des position xyz différentes avec chacune leur couleur?

Merci!! :mrgreen:
Dernière édition par VincentG le 17 Juin 2016, 16:47, édité 2 fois.
http://www.vincentgires.com
Belgian Blender User Group : http://bbug.be/
Avatar de l’utilisateur
VincentG
 
Message(s) : 223
Inscription : 13 Fév 2014, 21:35

Re: Commencer débuter avec du BGL?

Message par pistiwique » 20 Déc 2015, 18:48

Il y a ça mais il y a surement plus basique. Et le sujet m’intéresse aussi :mrgreen:
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Commencer débuter avec du BGL?

Message par Matpi » 22 Déc 2015, 00:27

Bon, commençons donc par du simple.

Il est tout de même pratique d'avoir directement le script sous forme d'addon, avec les register(), etc.

A noter, il y a le template operator_modal_draw.py à dispo pour un simple test.

Généralités:

- l'appel des fonctions BGL doit toujours se faire dans un certain contexte (il faut que Blender soit "prêt à dessiner"); pour ce faire, le dessin doit être effectué dans une fonction de callback, gérée via draw_handler_add et draw_handler_remove de l'espace (Space, le plus souvent la classe dérivée SpaceView3D) courant. En particulier, l'exemple donné dans le lien du post précédent utilise Region.callback_add et callback_remove, ce qui est deprecated voire même supprimé depuis la 2.75.

- OpenGL/bgl n'est pas orienté objet (à part le cas particulier de bgl.Buffer, utilisé pour simplifier le travail avec Python), tout se passe à l'aide de fonctions; ceux qui ont débuté Python avec le module turtle ne devraient pas être trop dépaysés, puisque l'idée est la même: choisir une couleur, choisir la matrice de projection, commencer à dessiner, dessiner un point, finir de dessiner, etc.

- bgl n'est pas complet par rapport à OpenGL; le module standard PyOpenGL peut éventuellement combler des manques (et les deux sont compatibles, sauf erreur)

- OpenGL est accompagné d'un langage spécial, le GLSL, qui peut servir à faire des shaders, c.-à-d. des sortes de filtres, fonctionnant sur la carte graphique (parallélisation); le sujet est très vaste.

- tout est 3D en OpenGL/bgl. On peut faire du 2D (texte, image, etc.), mais c'est en fait quand même du 3D, avec les axes X et Y alignés sur l'écran et le Z pour la profondeur.

Exemple simple commenté:

Code : Tout sélectionner
bl_info = {
    "name": "BGL Demo",
    "author": "Matpi",
    "version": (1, 0),
    "blender": (2, 75, 0),
    "location": "View3D",
    "description": "Draws two points using BGL",
    "warning": "",
    "wiki_url": "",
    "category": "User Interface",
    }


import bpy
import bgl

# variable globale de stockage
# c'est un peu moche mais ca marche tres bien et c'est accepte ;-)
handle = [None]

def callbackFunction():
    # cette fonction sera appelee a chaque redraw des vues 3d
    # choisir une taille
    bgl.glPointSize(10)
    # choisir une couleur
    # 3i est une specialisation de glColor, qui prend 3 arguments de type float (0.0-1.0)
    bgl.glColor3f(1.0, 0.0, 0.0)
    # commencer le dessin en mode points
    # les points sont des carres... pour des ronds, il faut effectivement dessiner un polygone.
    bgl.glBegin(bgl.GL_POINTS)
    # dessiner un point a un certain endroit
    # egalement une specialisation
    bgl.glVertex3f(1.0, 1.0, 1.0)
    # finir le dessin
    bgl.glEnd()
    # changer de taille
    bgl.glPointSize(5)
    # autre couleur
    bgl.glColor3f(0.0, 0.0, 1.0)
    # recommencer le dessin (necessaire pour le changement de taille)
    bgl.glBegin(bgl.GL_POINTS)
    # autre point
    bgl.glVertex3f(-1.0, 0.0, 2.0)
    # finir le dessin
    bgl.glEnd()

def register():
    # on ajoute le callback a tous les espaces de type View3D
    # et on stocke le handle (la poignee, soit l'objet permettant de garder
    # l'acces au callback par la suite, notamment pour le supprimer)
    # en l'occurrence on n'a pas besoin de passer d'arguments a la fonction,
    # donc on utilise un tuple vide
    # 'WINDOW' est le type de region
    # (voir http://www.blender.org/api/blender_python_api_2_76_release/bpy.types.Region.html#bpy.types.Region.type)
    # en general ce sera juste
    # 'POST_PIXEL' pour du "2D" (c.-a-d. la projection est orientee comme la camera), typiquement du texte, une image, etc.
    # 'POST_VIEW' pour du "3D", typiquement un point dans l'espace
    # 'PRE_VIEW'... je sais plus. Probablement aussi du 3D, mais avant dessin de la scene Blender
    handle[0] = bpy.types.SpaceView3D.draw_handler_add(callbackFunction, (), 'WINDOW', 'POST_VIEW')


def unregister():
    bpy.types.SpaceView3D.draw_handler_remove(handle[0], 'WINDOW')
    handle[0] = None


if __name__ == "__main__":
    register()
BAddons - La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Avatar de l’utilisateur
Matpi
 
Message(s) : 288
Inscription : 07 Déc 2014, 10:51
Localisation : in dr Schwiiz

Re: Commencent débuter avec du BGL?

Message par VincentG » 22 Déc 2015, 22:41

Génial Matpi, un grand grand merci! C'est exactement ce qu'il me fallait ;)
http://www.vincentgires.com
Belgian Blender User Group : http://bbug.be/
Avatar de l’utilisateur
VincentG
 
Message(s) : 223
Inscription : 13 Fév 2014, 21:35

Re: Commencent débuter avec du BGL?

Message par Matpi » 22 Déc 2015, 22:47

Bien volontiers ;-)

N'hésite pas à demander pour des approfondissements.
BAddons - La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Avatar de l’utilisateur
Matpi
 
Message(s) : 288
Inscription : 07 Déc 2014, 10:51
Localisation : in dr Schwiiz

Re: Commencent débuter avec du BGL?

Message par Coralie32 » 25 Mars 2016, 12:38

Bonjour,
y a un tutoriel pour ce module, ou cours pour apprendre ce langage?
Coralie32
 
Message(s) : 3
Inscription : 22 Mars 2016, 06:38

Re: Commencent débuter avec du BGL?

Message par VincentG » 12 Juin 2016, 20:10

Encore une petite question par rapport à bgl dans Blender.
J'aimerais savoir s'il y a un moyen de faire un rendu de cet overlay OpenGL?

J'aurais aimé pouvoir faire un rendu du viewport tel quel mais malheureusement, tout ce qui est bgl disparait. Une idée pour éviter de devoir faire un screenshot? :mrgreen:
Dernière édition par VincentG le 13 Juin 2016, 00:03, édité 1 fois.
http://www.vincentgires.com
Belgian Blender User Group : http://bbug.be/
Avatar de l’utilisateur
VincentG
 
Message(s) : 223
Inscription : 13 Fév 2014, 21:35

Re: Commencent débuter avec du BGL?

Message par Matpi » 12 Juin 2016, 21:14

Oui c'est possible, mais il faut bidouiller en utilisant le nouveau module (2.77) gpu.offscreen:

https://www.blender.org/api/blender_python_api_2_77a_release/gpu.offscreen.html

En plus de rendre tes éléments dans le viewport tu les rends également dans le framebuffer offscreen (une sorte d'"écran virtuel"), puis tu combine le tout (ou alors tu utilises la fonction GPUOffscreen.draw_view3d, mais dans ce cas-là il manque la grille, etc.).

Ensuite il faut sauver le framebuffer sous forme d'image en bindant la color_texture du framebuffer et en récupérant les valeurs avec bgl.glReadPixels (sauf erreur) dans un bgl.Buffer. Tu as alors accès aux pixels, que tu peux p.ex. insérer dans une image Blender et la sauver.

...bref c'est pas simple.


EDIT: il est possible que je dise une bêtise et que la manip du bgl.glReadPixels fonctionne également directement dans le viewport. A tester.
BAddons - La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Avatar de l’utilisateur
Matpi
 
Message(s) : 288
Inscription : 07 Déc 2014, 10:51
Localisation : in dr Schwiiz

Re: Commencent débuter avec du BGL?

Message par pistiwique » 12 Juin 2016, 23:51

Je ne veux pas dire de bétise, mais il me semble que l'addon de Antonioya MeasureIt permet de faire un rendu avec les cotations en bgl.
Ça pourra peut être t'aider.
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Commencent débuter avec du BGL?

Message par Matpi » 13 Juin 2016, 05:35

Bien vu, il utilise justement mon histoire de bgl.glReadPixels. Il n'y a donc qu'à s'en inspirer.
BAddons - La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Avatar de l’utilisateur
Matpi
 
Message(s) : 288
Inscription : 07 Déc 2014, 10:51
Localisation : in dr Schwiiz

Re: Commencent débuter avec du BGL?

Message par lapineige » 13 Juin 2016, 07:27

Matpi a écrit :EDIT: il est possible que je dise une bêtise et que la manip du bgl.glReadPixels fonctionne également directement dans le viewport. A tester.

À tester en effet, mais je me souviens d'avoir fait quelque chose comme ça une fois.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3716
Inscription : 25 Juin 2014, 07:06

Re: Commencent débuter avec du BGL?

Message par VincentG » 13 Juin 2016, 10:52

Super merci!
L'addon fait ça très bien en effet! ça va pas être évident mais je vais tenter de faire pareil! :-)
http://www.vincentgires.com
Belgian Blender User Group : http://bbug.be/
Avatar de l’utilisateur
VincentG
 
Message(s) : 223
Inscription : 13 Fév 2014, 21:35

Re: Commencent débuter avec du BGL?

Message par lapineige » 13 Juin 2016, 15:40

VincentG a écrit :Super merci!
L'addon fait ça très bien en effet! ça va pas être évident mais je vais tenter de faire pareil! :-)

Enlève tes doigts de ctrl+C, enlève tes doigts de ctrl+C... :mrgreen:

Je vais jeter un oeil aussi pour voir comment il fait, c'est toujours utile.

C'est toujours le point embêtant avec bgl, comme c'est assez bas niveau il faut réinventer à la poudre à chaque fois, c'est marrant et instructif mais quand on veut aller vite c'est pas le plus confortable.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3716
Inscription : 25 Juin 2014, 07:06

Re: Commencent débuter avec du BGL?

Message par Matpi » 13 Juin 2016, 15:51

Simplement au bout du code BGL dans le handler tu ajoutes la définition d'un objet bgl.Buffer, tu le passes dans la fonction bgl.ReadPixels pour y copier les pixels et tu assignes ce buffer au data d'une image de Blender, que tu peux ensuite sauvegarder.

Plus quelques fioritures genre test des ciseaux (pour découper la partie intéressante), etc.


EDIT:

lapineige a écrit :C'est toujours le point embêtant avec bgl, comme c'est assez bas niveau il faut réinventer à la poudre à chaque fois, c'est marrant et instructif mais quand on veut aller vite c'est pas le plus confortable.


Apprends Vulkan :lol:
BAddons - La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Avatar de l’utilisateur
Matpi
 
Message(s) : 288
Inscription : 07 Déc 2014, 10:51
Localisation : in dr Schwiiz

Re: Commencent débuter avec du BGL?

Message par lapineige » 13 Juin 2016, 15:58

Matpi a écrit :Apprends Vulkan :lol:

:lol: :lol:
Quand j'ai dit bas niveau, je voulais dire que tu n'as pas la fonction pour tracer quelques primitives de bases automatiquement par exemple.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3716
Inscription : 25 Juin 2014, 07:06


Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)