GLUT + OpenGL мультисэмплинг сглаживания (MSAA)

Я делаю OpenGL приложение, которое рисует куб.
Я хочу добавить антиалиасинг, но безуспешно.
Может быть, кто-то может помочь (пользователь Xcode 6.1.1, GLUT, OpenGL)?

Мне нужно создать сглаживание без каких-либо внешних библиотек.

Результат кода ниже.
введите описание изображения здесь

GLfloat xRotated, yRotated, zRotated; void init(void){
glClearColor(0,0,0,0);

glEnable (GL_DEPTH_TEST);

// Turn on antialiasing, and give hint to do the best
// job possible.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_MULTISAMPLE); } void DrawCube(void) {
glMatrixMode(GL_MODELVIEW);
// clear the drawing buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0,0.0,-10.5);
glRotatef(xRotated,1.0,0.0,0.0);
// rotation about Y axis
glRotatef(yRotated,0.0,1.0,0.0);
// rotation about Z axis
glRotatef(zRotated,0.0,0.0,1.0);

glBegin(GL_QUADS);        // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f);    // Color Blue
glVertex3f( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f);    // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f);    // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f);    // Color Orange
glVertex3f( 1.0f,-1.0f, 1.0f);    // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f);    // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f,0.0f,0.0f);    // Color Red
glVertex3f( 1.0f, 1.0f, 1.0f);    // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f);    // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f);    // Bottom Right Of The Quad (Front)
glColor3f(1.0f,1.0f,0.0f);    // Color Yellow
glVertex3f( 1.0f,-1.0f,-1.0f);    // Top Right Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Top Left Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Bottom Left Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f);    // Bottom Right Of The Quad (Back)
glColor3f(0.0f,0.0f,1.0f);    // Color Blue
glVertex3f(-1.0f, 1.0f, 1.0f);    // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Bottom Right Of The Quad (Left)
glColor3f(1.0f,0.0f,1.0f);    // Color Violet
glVertex3f( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, 1.0f);    // Top Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f, 1.0f);    // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f,-1.0f);    // Bottom Right Of The Quad (Right)
glEnd();            // End Drawing The Cube

glFlush(); } void animation(void) {
yRotated += 0.1;
xRotated += 0.2;
DrawCube(); } void reshape(int x, int y) {
if (y == 0 || x == 0) return;  //Nothing is visible then, so return
//Set a new projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);  //Use the whole window for rendering } int main(int argc, char** argv){
glutInit(&argc, argv);
//we initizlilze the glut. functions
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(DrawCube);
glutReshapeFunc(reshape);
//Set the function for the animation.
glutIdleFunc(animation);
glutMainLoop();
return 0; }

0

Решение

В GLUT отсутствует настройка количества образцов. Freeglut делает. Чтобы включить его, используйте

glutSetOption(GLUT_MULTISAMPLE, 8);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);

И не забудьте glEnable Это

void enableMultisample(int msaa)
{
if (msaa)
{
glEnable(GL_MULTISAMPLE);
glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);

// detect current settings
GLint iMultiSample = 0;
GLint iNumSamples = 0;
glGetIntegerv(GL_SAMPLE_BUFFERS, &iMultiSample);
glGetIntegerv(GL_SAMPLES, &iNumSamples);
printf("MSAA on, GL_SAMPLE_BUFFERS = %d, GL_SAMPLES = %d\n", iMultiSample, iNumSamples);
}
else
{
glDisable(GL_MULTISAMPLE);
printf("MSAA off\n");
}
}
3

Другие решения


По вопросам рекламы [email protected]