绘制矩形

在前面第一个创建窗口的程序的基础之上,添加绘制矩形的函数

#include <gl/glut.h>

void RenderScene(void)
{
    // 用当前的清除颜色清除窗口
    glClear(GL_COLOR_BUFFER_BIT);
    // 把绘图颜色设置为红色
    //         R    G    B
    glColor3f(1.0f,0.0f,0.0f);
    // 用当前颜色绘制一个填充的矩形
    glRectf(-25.0f, 25.0f, 25.0f, -25.0f);
    // 刷新绘图命令
    glFlush();
}

// 设置渲染状态
void SetupRC(void)
{
    // 把清除颜色设置为蓝色
    glClearColor(0.0f, 0.0f,1.0f, 1.0f);
}

// 当窗口改变大小时
void ChangeSize(GLsizei w, GLsizei h)
{
    GLfloat aspectRatio;
    // 防止被0除
    if(h == 0)
    {
        h = 1;
    }
    // 把视口设置为窗口大小
    glViewport(0, 0, w, h);

    // 重置坐标系统
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 建立裁剪区域(左、右、底、顶、近、远)
    aspectRatio = (GLfloat)w / (GLfloat)h;
    if(w <= h)
    {
        glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);
    }
    else
    {
        glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void main()
{
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutCreateWindow("GLRect");
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    SetupRC();
    glutMainLoop();
}

运行结果:

android opengl 绘制圆角矩形 着色器_投影矩阵

绘制矩形

glColor3f(1.0f,0.0f,0.0f);

把当前的绘图颜色设置为红色,该函数设置的是图形的填充颜色,而不是窗口的背景色。

glRectf(-25.0f, 25.0f, 25.0f, -25.0f);

glRectf函数的四个参数表示了两个坐标对,
前面两个参数为(X1,Y1),表示矩形的左上角,
后面两个参数为(X2,Y2),表示矩形的右下角。

窗口的缩放

glutReshapeFunc(ChangeSize);

在所有的窗口环境中,用户都可以在任何时候改变窗口的大小。当窗口大小被改变时,窗口通常会作出响应,根据新的窗口的大小重新绘制它的内容。

设置视口

glViewport(0, 0, w, h);

窗口:OpenGL里面所谓的窗口就是我们创建出来的窗口,也叫做屏幕窗口,我们可以在这整个窗口里面绘图。它是以像素为单位进行度量的。

视口:而视口则是窗口的一个子区域,通过设置视口就可以把绘图区域限定为窗口的一个子区域,而这个子区域的别名就叫做视口。即在窗口中可以见到或可以用来绘图的部分。它可以和窗口等大,也可以比窗口大或者小。一般设置视口等于窗口,只有绘制在视口区域中的图形才能被显示,如果图形有一部分超出了视口区域,那么那一部分是看不到的。通过glViewport()函数设置。在本程序中,设置视口区域大小等于窗口区域大小。
定义视口的函数是void glViewport(Glint x,GLint y,GLsizei width,GLsizei height);其中x是指视口开始位置距离窗口左边的距离(以像素计),y是视口开始位置距离窗口底边的距离(以像素计),width视口的宽度(以像素计),height视口的高度(以像素计)。
X,Y参数指定了窗口内部视口的左下角,width与height参数指定了视口的大小

设置裁剪区域

//重置坐标系统
    glMatrixMode(GL_PROJECTION);            //切换为透视投影矩阵
    glLoadIdentity();                       //将透视投影矩阵转换为单位矩阵
    // 建立裁剪区域(左、右、底、顶、近、远)
    aspectRatio = (GLfloat)w / (GLfloat)h;
    if(w <= h)
    {
        glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);
    }
    else
    {
        glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
    }
    glMatrixMode(GL_MODELVIEW);             //切换为平行投影矩阵
    glLoadIdentity();                       //将平行投影矩阵转换为单位矩阵

一般会保证与窗口的纵横比是一致的,所以得设置一个变量aspectRatio。

裁剪区域:裁剪区就是我们画图是所用的逻辑区域,他用的是逻辑坐标,即在视口中让你看到的图形,即显示出来的那部分。就是视口矩形区域的最小最大x坐标(left,right)和最小最大y坐标(bottom,top),而不是窗口的最小最大x坐标和y坐标。通过glOrtho()函数设置,这个函数还需指定最近最远z坐标,形成一个立体的裁剪区域。