c++ - 绘制二维条纹

标签 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 为什么前景上有蓝色三角形?我在 Draw/DrawStripes 函数中只指定了“QUADS”。

最佳答案

蓝色来自你清晰的颜色:

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

第三个参数是清晰颜色的蓝色 channel 。当你调用 glClear(GL_COLOR_BUFFER_BIT);您使用清晰的颜色初始化渲染目标。

因此,您看到的蓝色来自您的顶点,没有覆盖整个渲染目标,而是让蓝色清晰的颜色通过。要查看它,请启用线框 (glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);)。

此外,您确实应该以逆时针方式绘制:左上、左下、右下、右上。这将导致您的多边形被绘制为正面(通常您希望避免背面剔除)。

此时您正在“折叠”多边形,通过左上角、右上角、左下角,然后右下角,您基本上扭曲了四边形。按顺时针顺序尝试(反转右下角和左下角),看看您是否仍然可以看到多边形(如果启用背面剔除,则不应该)。

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

关于c++ - 绘制二维条纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320821/

相关文章:

c++ - HTTP 服务器,接受连接后我从 recv() 返回 -1

c++ - 为什么int和float之和是int?

c++ - 将 std::get 作为参数传递给函数的函数对象

c++ - 在命名空间中使用同名的类?

c++ - 有没有办法在不破坏窗口/上下文的情况下切换全屏?

c++ - opengl多重五边形

c++ - OpenGL 围绕自身而不是原点 (0,0,0) 旋转一个对象(一组立方体)

c++ - OpenGl表面和纹理

opengl - 调整过剩窗口的大小

c++ - 使用 GLUT 的 undefined reference