marcus-s' Website
startseite | alle artikel | email | software


Modern OpenGL: Kreisrunde Punkte mit GLSL
Zuletzt bearbeitet: January 15 2018 14:02:16
Kategorie: Programmierung


Wenn man runde Punkte in modernem OpenGL auf den Bildschirm zu bringen, wird man sehr schnell feststellen, dass Befehle wie glEnable(GL_POINT_SMOOTH); nicht mehr funktionieren. Idealerweise macht man heute alles in Shadern. Punkte erscheinen - meistens - als doofe Quadrate.

Es ist ganz einfach. In Eurem Code glEnable(GL_PROGRAM_POINT_SIZE); vor dem Rendern einschalten. Im Vertex-Shader die gewünschte Grösse festlegen: gl_PointSize=5.0;.

Im Fragment Shader, folgenden Code einbinden:

  1. #version 330 core
  2.  
  3. uniform float point_r;
  4. uniform float point_g;
  5. uniform float point_b;
  6. uniform float point_a;
  7. out vec4 FragColor;
  8.  
  9. void main()
  10. {
  11. vec2 circCoord = 2.0 * gl_PointCoord - 1.0;
  12. if (dot(circCoord, circCoord) > 0.85 && dot(circCoord, circCoord) < 1.0)
  13. { FragColor = vec4(point_r, point_g, point_b, point_a*0.2);\n }
  14. if (dot(circCoord, circCoord) > 1.0)
  15. { discard; }
  16. else
  17. if (dot(circCoord, circCoord) < 0.85)
  18. { FragColor = vec4(point_r, point_g, point_b, point_a); }
  19. };


Das ganze ist noch nicht perfekt, hat Anfänge eines Antialiasing-Codes, aber für den Moment, reicht es. Das Ergebnis: