绘制2D条纹

时间:2012-07-04 00:04:35

标签: c++ opengl glut

这个简单的程序旨在绘制交替放置的13条均匀,红色和白色条纹,如美国国旗。

// A Simple OpenGL Project
// Author: Michael Hall
//
// This C++ code and project are provided "as is" without warranty of any kind.
//
// Copyright 2010 XoaX - For personal use only, not for distribution
// 
// Elaborated by me :)

#include <glut.h>

void DrawStripes(const int quantity)
{
    glBegin(GL_QUADS);

    for(int i=1; i <= quantity ; i++)
    {
        if(i%2)
            glColor3f(1.0,0.0,0.0);
        else 
            glColor3f(1.0,1.0,1.0);

            glVertex2f(0,static_cast<float>(i-1)/static_cast<float>(quantity));
            glVertex2f(1.0,static_cast<float>(i-1)/static_cast<float>(quantity));

            glVertex2f(0,static_cast<float>(i)/static_cast<float>(quantity));
            glVertex2f(1.0,2*static_cast<float>(i)/static_cast<float>(quantity));
    }
}



void Draw() 
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 1.0);
    DrawStripes(13);


    glEnd();
    glFlush();
}

void Initialize() 
{
    glClearColor(0.0, 0.0, 102.0/255.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

int main(int iArgc, char** cppArgv) 
{
    glutInit(&iArgc, cppArgv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(950,500);
    glutInitWindowPosition(200, 200);
    glutCreateWindow("Rough draft");
    Initialize();


    glutDisplayFunc(Draw);
    glutMainLoop();

    return 0;
}

这就是它在实践中的表现: final window 为什么前景上有蓝色三角形?我只指定了#34; QUADS&#34;在Draw / DrawStripes函数中。

2 个答案:

答案 0 :(得分:3)

蓝色来自你的清晰颜色:

 glClearColor(0.0, 0.0, 102.0/255.0, 0.0);

第三个参数是透明色的蓝色通道。当你调用glClear(GL_COLOR_BUFFER_BIT);用纯色初始化渲染目标。

因此,您所看到的蓝色是从您的顶点未覆盖整个渲染目标,并让蓝色透明的颜色。要查看它,请启用线框(glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);)。

另外,你真的应该以逆时针的方式画画:左上角,左下角,右下角,右上角。这将导致您的多边形被正面绘制(通常是您想要避免背面剔除的那种)。

当你正在“折叠”多边形时,通过左上角,右上角,左下角,然后在右下角基本上扭转四边形。按顺时针顺序尝试(反转右下角和左下角)并查看是否仍然可以看到多边形(如果背面剔除打开,则不应该这样做。)

最后你还将右下Y坐标乘以2,为什么?这就是导致变形的原因(在扭曲之上)。你应该让两个底部顶点具有相同的Y坐标以形成一个矩形(因此右下角和左下角的Y坐标必须匹配)。

答案 1 :(得分:2)

我认为你是以错误的顺序绘制四边形顶点。它们应该是逆时针方向,但是你正在绘制一个“扭曲”的四边形。

尝试在for循环中交换第3和第4个顶点。