2012-06-02 3 views
6

Я использую freeglut. Я пытаюсь заставить FSAA работать, но ничего не работает. Буферы выборки равны 1, а образцы - 4. Но я не вижу никакого сглаживания. Я что-то упускаю? В настоящее время я запускаю Ubuntu 12.04; не уверен, что это что-то изменит.Сглаживание OpenGL с freeglut

#include <GL/glut.h> 
#include <GL/glext.h> 
#include <stdio.h> 


void render(void); 

int main(int argc, char **argv){  
    glutInit(&argc,argv); 

    //Initialize the window 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_MULTISAMPLE); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(200,200); 
    glutCreateWindow("Testing"); 
    glutDisplayFunc(render); 

    //Enable FSAA  
    glEnable(GL_MULTISAMPLE); 

    //2D graphics 
    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT), 0, 0, 1); 
    glMatrixMode(GL_MODELVIEW); 


    GLint buf, sbuf; 
    glGetIntegerv(GL_SAMPLE_BUFFERS, &buf); 
    printf("number of sample buffers is %d\n", buf); 
    glGetIntegerv(GL_SAMPLES, &sbuf); 
    printf("number of samples is %d\n", sbuf); 

    glutMainLoop(); 
    return 0; 
} 

//Draw some stuff 
void render(void){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 

    glColor3f(0.0f,1.0f,0.0f); 
    glBegin(GL_LINE_LOOP); 
     glVertex2f(10.0,10.0); 
     glVertex2f(170.0,60.0); 
     glVertex2f(50.0,130.0); 
     glVertex2f(50.0,60.0); 
    glEnd();  

    glutSwapBuffers(); 
} 

Я хорошо осведомлен о SDL и GLFW. Я бы хотел, чтобы он работал в freeglut.

Подробнее:
Видеокарта: ATI Radeon HD 4250
OpenGL версия: 3.3.11627 Совместимость профиля Контекст

ответ

0

Для antialiase ваших точек и линий в 2D, вы также можете сделать это:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

glEnable(GL_LINE_SMOOTH); 
glHint(GL_LINE_SMOOTH, GL_NICEST); 

glEnable(GL_POINT_SMOOTH); 
glHint(GL_POINT_SMOOTH, GL_NICEST); 
+0

Это не похоже на работу для 'GL_TRIANGLE_FAN' или' GL_QUAD_STRIP'. Разве это не мультисэмплинг, который должен противостоять этим? – Azmisov

+0

в вашем коде вы просто рисуете линейный цикл, который должен быть сглажен с моим кодом. –

+0

Ну, это был просто пример. Я намерен делать более продвинутую графику, чем просто строки. Я просто хочу, чтобы FSAA работал. – Azmisov

0

Ваш код действительно работал на моем компьютере (работает под управлением Windows). Просто убедитесь, что вы используете freeglut, а не просто обычный GLUT. Таким образом, вы должны подключаться к соответствующим библиотечным файлам (например, freeglut.lib/freeglut.dll в окнах). Кроме того, было бы неплохо включить freeglut.h вместо glut.h, чтобы быть уверенным, что вы фактически включаете заголовочный файл, который собираетесь использовать.

Кроме того, нет необходимости звонить glClearColor в каждый кадр. Вам нужно только позвонить, когда вы хотите изменить прозрачный цвет. Просто помните, хотя, как и glColor, glClearColor применим только к вызовам функций, которые происходят после него.

+0

Хммм. Нужно ли устанавливать другой вариант сборки, чем «-lglut»? – Azmisov

+0

Из того, что я могу сказать, «-lglut» должен работать. – fintelia

+0

@fintelia: На самом деле вызов glClearColor в каждом кадре - хороший стиль. В конце концов, кто-то хочет реализовать методы рендеринга fancier, которые включают в себя несколько проходов или FBOs, и как только вы это сделаете, вы должны убедиться, что в начале рендеринга фрейма все установлено правильно. – datenwolf

0

GLUT на моей Windows 7 NVIDIA как-то не работает. Я получил 0 для обоих образцов buffers и Samples.

Однако, freeglut решает его и дает вам возможность установить Samples.

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

Чтобы включить его

void glexMultisample(int msaa) 
{ 
    if (msaa) 
    { 
     glEnable(GL_MULTISAMPLE); 

     // 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"); 
    } 
}