Point Sprites pour le système de particules
Sont point sprites le meilleur choix pour la construction d'un système de particules?
Sont point sprites présents dans les nouvelles versions d'OpenGL et les pilotes des cartes graphiques? Ou devrais-je le faire à l'aide de vbo et glsl?
Vous devez vous connecter pour publier un commentaire.
Point sprites sont en effet bien adaptés pour les systèmes de particules. Mais ils n'ont rien à voir avec des Organisations sises à vienne et GLSL, ce qui signifie qu'ils sont complètement orthogonale de la fonctionnalité. Peu importe si vous utiliser des sprites ou non, vous devez toujours utiliser des Organisations sises à vienne pour le téléchargement de la géométrie, qu'ils soient de simples points, pré-faites des sprites ou que ce soit, et vous devez toujours mettre cette géométrie à travers un ensemble de shaders (en OpenGL moderne bien sûr).
Cela étant dit point sprites sont très bien pris en charge dans OpenGL moderne, tout simplement pas automatiquement comme avec l'ancien fixe la méthode de la fonction. Ce n'est pas pris en charge sont le point de l'atténuation des fonctionnalités qui vous permettent de mettre à l'échelle un point de la taille sur la base de sa distance à la caméra, vous devez le faire manuellement dans le vertex shader. De la même manière que vous avez à faire la texture du point manuellement dans un fragment shader, à l'aide de la variable d'entrée
gl_PointCoord
(qui dit où dans [0,1]-place de l'ensemble du point de l'actuel fragment est). Par exemple, un point de base de sprite pipeline pourrait ressembler à ça:vertex shader:
fragment shader:
Et c'est tout. Bien sûr, ces shaders juste faire le plus de dessin de base de la texture des sprites, mais sont un point de départ pour d'autres fonctions. Par exemple pour calculer le sprite de la taille en fonction de sa distance à la caméra (peut-être pour lui donner un monde fixe-taille de l'espace), vous devez
glEnable(GL_PROGRAM_POINT_SIZE)
et écrire à la spéciale de la variable de sortiegl_PointSize
dans le vertex shader:Ce serait tout point sprites ont le même monde-taille de l'espace (et donc un autre écran-taille de l'espace en pixels).
Mais point sprites, tout en restant parfaitement pris en charge dans OpenGL moderne ont leurs inconvénients. L'un des plus grands inconvénients est leur écrêtage comportement. Les Points sont ramenées à leur centre de coordonnées (parce que le détourage est fait avant le tramage et donc avant le point de se "élargie"). Donc, si le centre des le point est à l'extérieur de l'écran, le reste de ce qui pourrait encore arriver dans la zone d'affichage n'est pas montré, au pire une fois que le point est à mi-chemin hors de l'écran, il va soudainement disparaître. Ce n'est cependant perceptible uniquement (ou annyoing) si le point sprites sont trop grandes. Si elles sont très petites particules qui ne couvrent pas beaucoup plus que quelques pixels de toute façon, alors ce ne sera pas beaucoup d'un problème et je serais encore à l'égard des systèmes de particules canonique de cas d'utilisation pour le point sprites, il suffit de ne pas les utiliser pour les grands panneaux d'affichage.
Mais si c'est un problème, alors OpenGL moderne offre de nombreuses autres façons de mettre en œuvre point sprites, en dehors de la naïveté chemin de pré-construction de toutes les images-objets individuels, des quads sur le CPU. Vous pouvez toujours vous rendre sur eux comme un tampon plein de points (et donc dans la manière dont ils sont susceptibles de sortir de votre GPU basé sur un moteur de particules). Réellement générer du quad, de la géométrie ensuite, vous pouvez utiliser la géométrie shader, ce qui vous permet de générer un quad à partir d'un seul point. D'abord vous n'avez qu'à le modelview de transformation à l'intérieur du vertex shader:
Alors la géométrie shader fait le reste du travail. Il associe la position des points avec les 4 coins d'un générique [0,1]-quad et complète la transformation dans clip-espace:
Dans le fragment shader, vous serait alors bien sûr, utiliser l'outil de
texCoord
variable au lieu degl_PointCoord
pour le texturage, puisque nous n'avons plus le dessin des points.Ou une autre possibilité (et peut-être plus vite, car je me souviens geometry shaders ont la réputation d'être lent) serait d'utiliser des instances de rendu. De cette façon, vous avez un supplément de VBO contenant les sommets de un seul générique 2D quad (c'est à dire [0,1]-carré) et de votre bon vieux VBO contenant les positions de point. Ce que vous faire est de dessiner ce seul quad plusieurs fois (instancié), tandis que la recherche de cas individuels, de positions du point VBO:
Et dans le vertex shader vous puis assembler le par point avec les coin/quad-position (qui est aussi la texture de coordonnées de vertex):
Il réalise le même que la géométrie shader approche fondée sur les, correctement taillée point sprites avec une constante de l'espace-monde taille. Si vous voulez imiter le d'écran de l'espace de taille de pixel de réel point sprites, vous avez besoin de mettre un peu plus de puissance de calcul en elle. Mais cela est laissé comme exercice et l'oppisite du monde à l'écran de transformation, de la le point sprite shader.
glDrawArrays(GL_POINTS, ... )
je me suis rendu point sprites?glDrawArrays(GL_POINT_SPRITES, ...)
pour cette question.gl_PointCoord
constamment à 0, puis de l'appel d'glEnable(GL_POINT_SPRITE)
aidé dans mon cas.