【问题标题】:How can I display two shapes instead of one by using C++ OpenGL Glut?如何使用 C++ OpenGL Glut 显示两种形状而不是一种?
【发布时间】:2021-11-07 08:35:39
【问题描述】:

我开始在 C++ 中使用 OpenGL / glut,但我一直坚持能够在窗口中显示两个对象而不是一个。因此,对于第一个形状,它绘制了一个类似房子的形状,顶部有一个正方形和三角形,并带有抗锯齿功能。第二个形状应该是相同的,但没有抗锯齿。目前,第二个形状只有两个点,而不是整个形状。当我在 void render() 方法中同时拥有 withoutAntiAliasingwithAntiAliasing 方法时,只有一个显示。我如何才能使所描述的两种方法都可以显示在窗口中?代码如下:

#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(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(640, 480);
    glutCreateWindow("Hey");

    init();
    glutDisplayFunc(render);

    glutMainLoop();
}

【问题讨论】:

    标签: c++ opengl glut


    【解决方案1】:

    如果要画线,必须使用Line primitives,而不是Point primitives
    第一个网格未显示,因为您在绘制第二个网格之前清除了帧缓冲区。

    render函数中移动glClearglFlush并使用基本类型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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 2010-12-31
      • 1970-01-01
      • 2011-12-17
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多