Hi,
I try to render antialiased (round) points with a vertex shader computed point size and it doesn’t work.
GL_VERTEX_PROGRAM_POINT_SIZE is enabled.
GL_MULTISAMPLE is enabled.
GL_SAMPLE_BUFFERS=1
GL_SAMPLES=4
but my points are squared.
I tried a mix of glPointSize and glEnable(GL_POINT_SMOOTH) and the result is weird:
GL_VERTEX_PROGRAM_POINT_SIZE: on
GL_MULTISAMPLE: on
GL_POINT_SMOOTH: off
renderer point size = vertex program point size (gl_PointSize)
squared point
GL_VERTEX_PROGRAM_POINT_SIZE: on
GL_MULTISAMPLE: on
GL_POINT_SMOOTH: on
renderer point size = application point size (glPointSize(x))
round point
Here is my test program:
#include <stdio.h>
#include <GL/glew.h>
#include <GL/glut.h>
int window_width=640;
int window_height=480;
void glut_reshape(int w, int h)
{
window_width = w;
window_height = h;
glutPostRedisplay();
}
bool vertexProgramPointSize = true;
bool pointSize = false;
bool multiSample = true;
bool pointSmooth = false;
void glut_keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
break;
case 'v':
vertexProgramPointSize = !vertexProgramPointSize;
break;
case 'p':
pointSize = !pointSize;
break;
case 'm':
multiSample = !multiSample;
break;
case 's':
pointSmooth = !pointSmooth;
break;
}
printf("vertexProgramPointSize : %s pointSize: %s multiSample: %s pointSmooth: %s
",
vertexProgramPointSize? "yes":"no",
pointSize? "yes":"no",
multiSample? "yes":"no",
pointSmooth? "yes":"no");
glutPostRedisplay();
}
void glut_display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, window_width, window_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (vertexProgramPointSize)
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
else
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
if (pointSize)
glPointSize(10.0);
else
glPointSize(1.0);
if (multiSample)
glEnable(GL_MULTISAMPLE);
else
glDisable(GL_MULTISAMPLE);
if (pointSmooth)
glEnable(GL_POINT_SMOOTH);
else
glDisable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, -1.0f);
glEnd();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
printf("Hello world!
");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowPosition(100, 100);
glutInitWindowSize(window_width, window_height);
glutCreateWindow("::: V I E W E R :::");
glewInit();
GLint sampleBuffers, samples;
glGetIntegerv(GL_SAMPLE_BUFFERS, &sampleBuffers);
glGetIntegerv(GL_SAMPLES, &samples);
printf("sampleBuffers: %d samples: %d
", sampleBuffers, samples);
const char *vertexSrc = "void main()
"
"{
"
" gl_PointSize = 20.0;
"
" gl_Position = ftransform();
"
"}
";
const char *fragmentSrc = "void main()
"
"{
"
" gl_FragColor = vec4(1.0,0.0,0.0,1.0);
"
"}
";
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSrc, 0);
glCompileShader(vertexShader);
GLint vertexShaderCompiled;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vertexShaderCompiled);
if (! vertexShaderCompiled)
{
GLchar buffer[4096];
glGetShaderInfoLog(vertexShader, 4096, 0, buffer);
printf("======================================================
");
printf("vertex shader
");
printf("%s
", buffer);
printf("======================================================
");
}
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSrc, 0);
glCompileShader(fragmentShader);
GLint fragmentShaderCompiled;
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fragmentShaderCompiled);
if (! fragmentShaderCompiled)
{
GLchar buffer[4096];
glGetShaderInfoLog(fragmentShader, 4096, 0, buffer);
printf("======================================================
");
printf("fragment shader
");
printf("%s
", buffer);
printf("======================================================
");
}
GLuint program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
glUseProgram(program);
glClearColor(0.1f, 0.2f, 0.2f, 1.0f);
glEnable(GL_DEPTH_TEST);
glutReshapeFunc(glut_reshape);
glutKeyboardFunc(glut_keyboard);
glutDisplayFunc(glut_display);
glutMainLoop();
return 0;
}