Как я могу отобразить две фигуры вместо одной с помощью C OpenGL Glut?

#c #opengl #glut

Вопрос:

Я начал использовать OpenGL / glut для C , и я застрял на возможности отображать два объекта в окне, а не один. Итак, для первой фигуры он рисует форму, похожую на дом, с квадратом и треугольником сверху, с сглаживанием. Вторая форма должна быть такой же, но не имеет сглаживания. На данный момент вторая фигура имеет только две точки, в отличие от всей фигуры. Когда у меня есть оба метода withoutAntiAliasing и withAntiAliasing внутри метода void render() , отображается только один. Как именно я могу сделать так, чтобы оба описанных метода можно было отобразить в окне? Код приведен ниже:

 #include <GL/glut.h>

void init()
{
    glClearColor(1.0, 1.0, 1.0, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 250.0, 0.0, 250.0);
}

void withAntiAliasing()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_BLEND);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glBegin(GL_LINE_LOOP);
    glVertex2i(155, 150);
    glVertex2i(125, 125);
    glVertex2f(108.5, 162);
    glVertex2f(136, 185);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex2i(100, 155.9);
    glVertex2f(145, 192.5);
    glVertex2i(115, 185);
    glEnd();

    glFlush();
}

void withoutAntiAliasing()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_BLEND);

    glBegin(GL_POINTS);
    glColor3f(0, 0, 0);
    glVertex2i(170, 170);
    glColor3f(0, 0, 0);
    glVertex2i(150, 150);
    glEnd();

    glFlush();
}

void render()
{
    glColor3f(0.0, 0.0, 0.0);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    withoutAntiAliasing();
    withAntiAliasing();
}

int main(int argc, char** argv)
{
    glutInit(amp;argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(640, 480);
    glutCreateWindow("Hey");

    init();
    glutDisplayFunc(render);

    glutMainLoop();
}
 

Ответ №1:

Если вы хотите рисовать линии, вы должны использовать примитивы линий вместо примитивов точек.
Первая сетка не отображается, потому что вы очищаете буфер кадров перед рисованием второй сетки.

Переместите glClear и glFlush в render функцию и используйте тип примитива GL_LINE_LOOP :

 void withAntiAliasing()
{
    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glBegin(GL_LINE_LOOP);
    glVertex2i(155, 150);
    glVertex2i(125, 125);
    glVertex2f(108.5, 162);
    glVertex2f(136, 185);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex2i(100, 155.9);
    glVertex2f(145, 192.5);
    glVertex2i(115, 185);
    glEnd();
}

void withoutAntiAliasing()
{
    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_BLEND);

    glBegin(GL_LINE_LOOP);
    glColor3f(0, 0, 0);
    glVertex2i(170, 170);
    glColor3f(0, 0, 0);
    glVertex2i(150, 150);
    glEnd();
}

void render()
{
    glColor3f(0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    
    withoutAntiAliasing();
    withAntiAliasing();

    glFlush();
}