12
votes

Comment puis-je varier la taille du point dans Opengl Glbegin (GL_POINTS)?

Y a-t-il un moyen de faire varier la taille du point lors de la dessin de nombreux points? Je sais qu'il y a la glace (flotteur), mais y a-t-il un moyen de le faire dans un «lot» ou une matrice?

J'aimerais que les points ont des tailles différentes en fonction d'un attribut des données. Comme chaque point ayant X, Y, Z et un attribut taille. J'utilise des tampons de cadre en ce moment en Java.

Puis-je utiliser éventuellement des shaders de sommet pour cela?


0 commentaires

5 Réponses :


0
votes

Je crois que c'est avec GloinSize (Glfloat Taille)

Source:

http://www.talisman.org/opengl-1.1/Reference/ glpointsize.html


1 commentaires

Pour autant que je sache, Max veut varier la taille des points mais les envoyer en un seul lot.



18
votes

Vous pouvez utiliser Point Sprite: Activez-le à l'aide de Glenable (GL_VERTEX_PROGRAM_POIND_SIZE); CODE>, puis vous pouvez utiliser l'attribut GL_PoinSize CODE> dans votre programme Vertex.

Exemple de Stex Shader prise d'un thread de discussion OpenGL : P>

void main() {
    gl_FrontColor=gl_Color;
    gl_PointSize = gl_Normal.x;
    gl_Position = ftransform();
} 


3 commentaires

Merci. Existe-t-il un moyen de définir la taille du point à l'aide des attributs Vertex au lieu d'utiliser 'GL_Pointsize = GL_NORMAL.X'?


Je suppose que vous pouvez ajouter votre propre attribut flotteur à ce shader et utiliser glvertexattrib1f ou glvertexattribpoinger pour le définir. Vous pourriez regarder Nehe.GameDev.net/data/articles/article. ASP? Article = 21 .


D'accord. Merci. Vertex attribue-t-il le moyen standard de transmettre des données supplémentaires dans un shader?



0
votes

avec GL_POIND_DISTANCE_ATTENUATION (GL14?) Vous pouvez définir les coefficients pour une fonction (je pense qu'il est quadratique) pour la taille du point de calcul de Z Distance.


1 commentaires

On dirait que l'OP veut avoir un paramètre de taille par point indépendamment de la distance.



3
votes

C'était ce que j'ai jamais fait, xxx


0 commentaires

0
votes

L'augmentation et la diminution de la taille des points affectent plus d'un pixel, mais des shaders ne sont censés être exécutés qu'une fois par pixel. Cela échouera, car une fois que le programme de shader a été exécuté pour un pixel particulier, la modification n'affectera que les pixels suivants, mais pas les pixels précédents.

Les programmes de shader sont exécutés sur de nombreuses unités de shader simultanément et pour de nombreux pixels en parallèle, ce qui rend impossible de faire ce que vous essayez de faire. La limitation sera que l'on peut définir la taille de pixels avec un programme de shader, mais il conservera sa taille pour tous les pixels que le programme de shader est exécuté.

Vous pouvez essayer de trier vos données de points par la taille et les points de groupe de la même taille en une seule matrice et dessinez chaque matrice avec une taille de point différente.

ou vous pouvez essayer de le faire avec une indirection dans laquelle vous rendant d'abord les différentes tailles de points dans une texture et dans une seconde carte rendent les pixels en accédant aux données de texture et en l'utilisant pour tester si un pixel doit être rendu (ou non ).


1 commentaires

Il y a beaucoup mal ici. Dans le GL, les shaders ne sont jamais couragés une fois par pixel. Les shaders de sommet sont exécutés une fois par sommet (entrée), un shader de fragment une fois (ou même plusieurs fois) par fragment, des shaders de géométrie une fois par primitif d'entrée et ainsi de suite. Et le GL prend en charge la rasterisation des points avec une taille de point variable, de sorte que pour une primitive avec un sommet, de nombreux fragments puissent être générés.