OpenGL + GLUT没有填充最左边的多边形?

Posted

技术标签:

【中文标题】OpenGL + GLUT没有填充最左边的多边形?【英文标题】:OpenGL+GLUT Not filling Topmost-Leftmost Polygon? 【发布时间】:2011-07-29 06:32:54 【问题描述】:

我遇到了一个奇怪的 OpenGL 错误。 OpenGL 对我来说很新,但我们必须在我的 AI 课上使用它(因为老师真的是图形学教授)。

无论如何,这正在发生:http://img818.imageshack.us/img818/422/reversiothello.png

它只发生在最上面、最左边的多边形上。换句话说,它找到最左边的多边形,然后找到最上面的多边形,然后对其进行处理。 (目前没有任何东西可以从板上擦除多边形)。

我的显示功能是这样的:

void display_func(void)

    glClearColor(0.0, 0.45, 0.0, 1.0); // Background Color (Forest Green :3)
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);

    draw_board();

    glFlush();

    glutSwapBuffers();
;

我的draw_board函数是这样的:

void draw_board()

    int size = 8;
    int stepX = WINDOW_XS / size;
    int stepY = WINDOW_YS / size;

    glColor3f(0.0,0.0,0.0); // line color black

    glBegin(GL_LINES);

    // Draw Columns
    for(int i = 0;i <= WINDOW_XS;i += stepX)
    
        glVertex2i(i,0);
        glVertex2i(i, WINDOW_YS);
    

    // Draw Rows
    for(int j = 0;j <= WINDOW_YS;j += stepY)
    
        glVertex2i(0, j);
        glVertex2i(WINDOW_XS, j);
    

    // Draw Circles
    for(int i = 0;i < 8;++i)
    
        for(int j = 0;j < 8;++j)
        
            if(engine->getOnBoard(i,j) == Reversi::PIECE_NONE) continue;
            if(engine->getOnBoard(i,j) == Reversi::PIECE_WHITE)
                glColor3f(1.0,1.0,1.0);
            if(engine->getOnBoard(i,j) == Reversi::PIECE_BLACK)
                glColor3f(0.0,0.0,0.0);

            int drawX = ((i+1)*64)-32;
            int drawY = 512-((j+1)*64)+32;
            gl_drawCircle(drawX,drawY,30);
        
    

    glEnd();
;

我的鼠标功能是这样的:

void mouse_func(int button, int state, int x, int y)

    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && x < WINDOW_XS)
        
        // row and column index
        x = (int)( x / (WINDOW_XS/8) );
        y = (int)( y / (WINDOW_YS/8) );

        std::cout << "Attempting to make a move at " << x << "," << y << std::endl;

        if(engine->makeMove(x,y))
        
            glutPostRedisplay();
        
    
;

而我的 gl_drawCircle 函数是这样的:

void gl_drawCircle(float x, float y, float r)

    // http://***.com/questions/5094992/c-drawing-a-2d-circle-in-opengl/5095188#5095188
    glBegin( GL_POLYGON );
    float t;
    int n;
    for(t = 0,n = 0; n <= 90; ++n, t = float(n)/90.f ) // increment by a fraction of the maximum 
    
        glVertex2f( x + sin( t * 2 * PI ) * r, y + cos( t * 2 * PI ) * r );
    
    glEnd();

谁能帮帮我?

【问题讨论】:

暂时没有做opengl,是不是在你的draw_board函数中glEnd();必须在draw circlesfor语句之前,否则你在另一个@中有一个glBegin 987654330@ 我认为是不允许的。 SwapBuffers 隐式将 OpenGL 调用定向到正确的缓冲区,无需先调用 glFlush。 【参考方案1】:

我能找到的唯一值得回答的错误是您的draw_board 函数没有正确使用glBeginglEnd 语句。在调用gl_drawCircle 之前,你必须使用glEnd 语句,否则你会得到一个讨厌的行为。

编辑:您的第一个圆圈是使用线条绘制的,因为 glBegin 被忽略(因为您在 glBegin 上下文中)。所有其他圈子都完成了,因为您在再次调用glBegin 之前执行了glEnd。第一个绘制的圆圈是最左边、最上面的圆圈。

【讨论】:

非常感谢!当您对某事不熟悉时,很容易错过一些小事。【参考方案2】:

绘制行后,您需要调用 glEnd。 当你不调用 glEnd 时,OpenGL 会忽略你的调用 glBegin( GL_POLYGON ); 并假设你仍然想画线。

所以只需添加 glEnd (); 绘制行后应该解决它。

【讨论】:

以上是关于OpenGL + GLUT没有填充最左边的多边形?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的扫描线填充OpenGL/GLUT算法

OpenGL研究3.0 多边形区域填充

OpenGL填充多边形颜色“出血”

OpenGL基础画多边形

如何纹理 Opengl glut 对象(C++)

计算机图形学输出图元_10_多边形填充区_7_OpenGL多边形填充区函数(上)