OpenGL从1.0开始--点和线的属性

上一节我们已经讲到了颜色属性,颜色属性是属性的一种,这一节我们从属性对象角度来看看OpenGL如何处理属性信息。

一、点的属性

一般情况下,我们可以设定点的两个属性:颜色和大小。我们看看下面这个示例,一切不言自明。

#include <GL/glut.h>
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(1, 1, 1, 1);
    glViewport(0, 0, 400, 100);

    glViewport(0, 0, 100, 100);
    glPointSize(10.0f); glColor3f(1, 0, 0);//点的属性
    glBegin(GL_POINTS);
    glVertex2f(0.0f, 0.0f);
    glEnd();

    glViewport(100, 0, 100, 100);
    glPointSize(20.0f); glColor3f(0, 1, 0);
    glBegin(GL_POINTS);
    glVertex2f(0.0f, 0.0f);
    glEnd();

    glViewport(200, 0, 100, 100);
    glPointSize(30.0f); glColor3f(0, 0, 1);
    glBegin(GL_POINTS);
    glVertex2f(0.0f, 0.0f);
    glEnd();

    glViewport(300, 0, 100, 100);
    glPointSize(40.0f); glColor3f(1, 1, 0);
    glBegin(GL_POINTS);
    glVertex2f(0.0f, 0.0f);
    glEnd();

    glFlush();
}
int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(400, 100);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Hello OpenGL");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

这里写图片描述
代码虽长,但我们只关心其中的两行代码。

glPointSize(10.0f); //点的尺寸
glColor3f(1, 0, 0);//点的颜色

这两行代码分别代表点的两个属性:尺寸、颜色。颜色属性我们前面已经讲解地非常透彻了,我们重点看看尺寸或者说大小属性。OpenGL中点的大小是像素大小的整倍数,因此如示例所示,一个大的点显示成了一个像素方块。OpenGL用glPointSize(size)函数设置点的尺寸,其中size用正浮点数指定,显示该点的水平和垂直像素数即为size的大小。

二、线的属性

直线段可以使用三个基本属性来显示:颜色、线宽和线型。

#include <GL/glut.h>
#include <math.h>
double Pi = 3.1415926;
void display(void)
{
    GLfloat r = 1.2f;
    GLfloat verA[2] = { 0, r };
    GLfloat verB[2] = { -r*sin(0.4*Pi), r*cos(0.4*Pi) };
    GLfloat verC[2] = { -r*sin(Pi / 5), -r*cos(Pi / 5) };
    GLfloat verD[2] = { r*sin(Pi / 5), -r*cos(Pi / 5) };
    GLfloat verE[2] = { r*sin(0.4*Pi), r*cos(0.4*Pi) };
    glEnable(GL_LINE_STIPPLE);//启用线型
    glLineStipple(1, 0x0101);//设置线型为虚线
    glLineWidth(6.0f);//线宽
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    glVertex2fv(verA);
    glColor3f(1.0f, 0, 0);
    glVertex2fv(verC);
    glColor3f(0, 1.0f, 0);
    glVertex2fv(verE);
    glColor3f(0, 0, 1.0f);
    glVertex2fv(verB);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2fv(verD);
    glEnd();
    glFinish();
}
int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(400, 400);
    glutInitWindowPosition(500, 300);
    glutCreateWindow("Hello OpenGL");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

这里写图片描述
相信大家一眼就能找到核心代码在哪。,我们来给大家一一剖析。
颜色属性我们不再赘述,线宽属性类似点尺寸属性,也是比较简单的。对我们而言最有趣的无疑是线型属性。
在使用当前线型显示线段之前,必须先激活OpenGL的线型特性:

glEnable(GL_LINE_STIPPLE);

OpenGL使用glLineStipple函数设置线型,其有两个参数,第二个参数引入描述如何显示线段的一个16位整数,值为1的位对应一个“开”像素,值为0的位对应一个“关”像素。该模式从低位开始应用于线路经。在我们的例子里,参数为0x0101,对应的二进制数为0000000100000001,即三倍宽度点模式,用点表示虚线,且点与点之间间隔较宽。需要注意的是,因为我们设置了线宽为6,虚线看起来是由划线连起来的,但这里很明显划线方向垂直于虚线的方向,这表明该宽度表示的是虚线宽,而不是间隔宽。第一个参数表示的是每一位重复应用的次数,我们试着把该参数改为4,看看结果。
这里写图片描述
结果也是显而易见的,在虚线方向上点和间隔都变宽了,这就是每一位都重复应用4次的结果。
下面我们再给大家看几个示例让大家加深一下理解。
第二个参数改为0x1c47:
这里写图片描述
第二个参数改为0x00ff:
这里写图片描述
这段代码我们讲完了吗,显然大家心头是尚有疑问的。
为什么图中的颜色这么缤纷多彩呢?我们明明只设置了四次颜色。我们来学习一个新函数:

glShadeModel(GL_SMOOTH);

该函数指定线段按两端点颜色的线性插值方式进行显示,即实现颜色渐变的这么一个效果。事实上,我们在代码中并没有使用这个函数,因为颜色渐变是OpenGL中的一个默认效果。我们可以改变函数参数为GL_FLAT取消颜色渐变效果,取而代之的是总是用线段终点的颜色表示整条线段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值