【OpenGL API】 glLineWidth

[转载地址] http://blog.csdn.net/lotusone/article/details/4814018


设置线段的宽度和模式的函数分别是glLineWidth和glLineStipple,glLineWidth的原型如下

 
void glLineWidth(
  GLfloat width
);

width参数表示光栅化的线段的宽度,缺省值为1.0。glLineWidth函数指定的光栅化的线的宽度对走样线和反走样线均适用。和点的效果类似,使用启用反走样处理也影响直线的实际宽度。

 

如果线段的宽度不是1.0,则会根据使用启用了反走样处理得到不同的效果。启用线段的反走样处理必须使用glEnable(GL_LINE_SMOOTH)。

如果未启用反走样处理,实际的直线宽度是将提供的值圆整到最近的整数值,例如5.3会被圆整到5,小于1的取值均被圆整到1。如果| Δ x | ≥ | Δ y |,即直线的斜率≤1,假设直线圆整后的宽度为i,则每行填充的光栅化像素为i个;反之,则每列填充的光栅化像素为i个。

如果启用了反走样处理,直线光栅化将针对每一个像素矩形生成一个片元,这些像素矩形的宽度就是当前直线的宽度,长度等于直线的实际长度,中心在实际直线段的中心。

启用反走样时,直线的宽度也是受限制的,如同点的大小,其宽度范围也是[0.5, 10.0],最小变化步长是0.125。使用glGetFloatv(GL_LINE_WIDTH_RANGE,sizes)和

glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step)(sizes和step的定义同上)可以获得这些约束值。

 

下面我们来看看直线的不同宽度在OpenGL中的表现。

 

void glMain()

{

    int angle;

   

    float width = 1.0f;

    float PI = 3.1415926;

 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();   //加载单位矩阵

    glTranslatef(0.0f, 0.0f, -25.0f);

       

    //黑色直线

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

 

    //禁用反走样

    glDisable(GL_BLEND);

    glDisable(GL_LINE_SMOOTH);

 

    for(angle=0; angle<180; angle+=10)

    {

        //设置直线宽度

        glLineWidth(width);

 

        //绘制直线

        glBegin(GL_LINES);

            glVertex3f(5*cos(angle*PI/180), 5*sin(angle*PI/180), 0.0);

            glVertex3f(10*cos(angle*PI/180), 10*sin(angle*PI/180), 0.0);

        glEnd();

 

        //直线宽度增加0.5

        width+=0.5;

    }

 

    //启用反走样

    glEnable(GL_BLEND);

    glEnable(GL_LINE_SMOOTH);

 

    //初始化直线宽度

    width=1.0;

 

    //绘制的直线将在下半区域

    glRotatef(180, 0.0, 0.0, 1.0);

    for(angle=0; angle<180; angle+=10)

    {

        //设置直线宽度

        glLineWidth(width);

       

        glBegin(GL_LINES);

glVertex3f(5*cos(angle*PI/180), 5*sin(angle*PI/180), 0.0);

        glVertex3f(10*cos(angle*PI/180), 10*sin(angle*PI/180), 0.0);

        glEnd();

       

        //宽度累加

        width+=1.0;

 

    }

 

    SwapBuffers(g_hDC);//交换前后缓冲区

运行程序后可以看到,在上半区域,直线的未进行走样处理的,较宽的直线端点呈现出明显的斜角现象。下半区域是经反走样处理的直线,基本没有斜角现象,并且从第10条直线开始宽度就没有再增加,虽然设置的值不断增加,效果如图所示。



  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值