OpenGL学习04_点画模式(点画线)

viod glLineStipple(GLint factor,GLshort pattern);

OpenGL中设置直线的当前点画模式。pattern参数是由1或0组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素的进行处理。如果模式中对应的位是1,就绘制这个像素,否则就不绘制。模式可以使用factor参数(表示重复因子)进行扩展,它与1和0的连续子序列相乘。因此,如果模式中出现了3个1,并且factor是2,那么它们就扩展为6个连续的1。必须以GL_LINE_STIPPLE为参数调用glEnable()才能启用直线点画功能。为了禁用直线点画功能,可以向glDisable()函数传递同一个参数。

例如:

glLineStipple(1, Ox3F07);
glEnable(GL_LINE_STIPPLE);

此时模式为Ox3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先连续绘制3个像素,然后连续5个像素留空,再连续绘制6个像素,最后两个像素留空(注意,首先是从低位开始的)。如果factor是2,那么这个模式便被扩展为:先连续绘制6个像素,然后连续10个像素留空,再连续绘制12个像素,最后4个像素留空。

如果没有启用点画线功能,OpenGL会自动把pattern当做为OxFFFF,把factor当成1。

下面来实现一个点画的Demo:

//
//  main.cpp
//  OpenGL_03_SimpleCircle
//
//  Created by apple on 14/12/29.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#include <iostream>
#include <GLUT/GLUT.h>
#include <math.h>

#define PI 3.1415926

/**
 *  初始化操作
 */
void init() {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    //设置着色模式,GL_FLAT 采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元。
    glShadeModel(GL_FLAT);
}

/**
 *  绘制一条直线
 *
 *  @param x1 x1
 *  @param y1 x2
 *  @param x2 y1
 *  @param y2 y2
 */
void drawOneLine(float x1, float y1, float x2, float y2) {
    glBegin(GL_LINES);
    glVertex2f(x1, y1);
    glVertex2f(x2, y2);
    glEnd();
}

/**
 *  展示绘制效果
 */
void display() {
    //清理颜色缓冲区

    int i;

    glClear (GL_COLOR_BUFFER_BIT);

    /* select white for all lines  */
    glColor3f (1.0, 0.0, 0.0);

    /* in 1st row, 3 lines, each with a different stipple  */
    //开启直线的点画功能
    glEnable (GL_LINE_STIPPLE);
    //设置直线的点画模式
    glLineStipple (1, 0x0101);  /*  dotted  */
    //绘制一条直线
    drawOneLine (50.0, 125.0, 150.0, 125.0);
    glLineStipple (1, 0x00FF);  /*  dashed  */
    drawOneLine (150.0, 125.0, 250.0, 125.0);
    glLineStipple (1, 0x1C47);  /*  dash/dot/dash  */
    drawOneLine (250.0, 125.0, 350.0, 125.0);

    /* in 2nd row, 3 wide lines, each with different stipple */
    glLineWidth (5.0);
    glLineStipple (1, 0x0101);  /*  dotted  */
    drawOneLine (50.0, 100.0, 150.0, 100.0);
    glLineStipple (1, 0x00FF);  /*  dashed  */
    drawOneLine (150.0, 100.0, 250.0, 100.0);
    glLineStipple (1, 0x1C47);  /*  dash/dot/dash  */
    drawOneLine (250.0, 100.0, 350.0, 100.0);
    glLineWidth (1.0);

    /* in 3rd row, 6 lines, with dash/dot/dash stipple  */
    /* as part of a single connected line strip         */
    glLineStipple (1, 0x1C47);  /*  dash/dot/dash  */
    glBegin (GL_LINE_STRIP);
    for (i = 0; i < 7; i++)
        glVertex2f (50.0 + ((GLfloat) i * 50.0), 75.0);
    glEnd ();

    /* in 4th row, 6 independent lines with same stipple  */
    for (i = 0; i < 6; i++) {
        drawOneLine (50.0 + ((GLfloat) i * 50.0), 50.0,
                     50.0 + ((GLfloat)(i+1) * 50.0), 50.0);
    }

    /* in 5th row, 1 line, with dash/dot/dash stipple    */
    /* and a stipple repeat factor of 5                  */
    glLineStipple (5, 0x1C47);  /*  dash/dot/dash  */
    drawOneLine (50.0, 25.0, 350.0, 25.0);

    //关闭直线的点画功能
    glDisable (GL_LINE_STIPPLE);
    glFlush ();
}

/**
 *  调整窗口尺寸
 *
 *  @param width  宽度
 *  @param height 高度
 */
void reshape(int width, int height) {
    //设置视口矩形区域,在默认情况下,视口被设置为占据打开窗口的整个像素矩形
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    //对投影矩阵应用随后的矩阵操作
    glMatrixMode(GL_PROJECTION);
    //等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!
    glLoadIdentity();
    //指定2D裁剪坐标系,naer和far使用默认值-1和1
    gluOrtho2D(0.0, (GLdouble)width, 0.0, (GLdouble)height);
}

/**
 *  键盘事件回调
 *
 *  @param key 键位
 *  @param x   宽度
 *  @param y   高度
 */
void keyboard(unsigned char key, int x, int y) {
    switch (key) {
        case 27:
            exit(0);
            break;
    }
}

int main(int argc, const char * argv[]) {

    //初始化GLUT库
    glutInit(&argc, (char**)argv);
    //设置双缓冲,RGB像素格式的窗口
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    //设置窗口大小
    glutInitWindowSize(400, 150);
    //设置窗口坐标
    glutInitWindowPosition (100, 100);
    //创建窗口
    glutCreateWindow("Lines");

    //初始化操作
    init();

    //设置展示的回调方法
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);

    //绘制线程开始循环
    glutMainLoop();

    return 0;
}

本文由CC原创总结,如需转载请注明出处:http://blog.csdn.net/oktears/article/details/42262187

时间: 2024-08-26 11:48:56

OpenGL学习04_点画模式(点画线)的相关文章

【OpenGL 学习笔记03】点画多边形

1.点画多边形 //定义填充多边形的点画模式.mask为32 x 32 的位图指针,1画0不画,使用前必须启用多边形点画功能 void glPloygonStipple(const GLubyte* mask); //绘制一个矩形 void glRectf(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2); 2.示例 #include <GL/glut.h> #include <stdlib.h> void display(void) { G

OpenGL学习05_点画模式(点画多边形)

在默认情况下,填充多边形是用实心模式绘制的.此外,它们还可以使用一种32位×32位的窗口对齐的点画模式.glPolygonStipple()函数用于指定多边形的点画模式. void glPolygonStipple(const GLubyte *mask); 定义填充多边形的当前点画模式.mask参数是一个指向32×32位图的指针,后者被解释为0和1的掩码.如果模式中出现的是1,那么多边形中对应的像素就被绘制:如果出现的是0,多边形中对应的像素就不被绘制. 下面通过一个绘制小强的Demo演示一下

【OpenGL 学习笔记02】宽点画线

我们要知道,有三种绘图操作是最基本的:清除窗口,绘制几何图形,绘制光栅化对象. 光栅化对象后面再解释. 1.清除窗口 比如我们可以同时清除颜色缓冲区和深度缓冲区 glClearColor (0.0, 0.0, 0.0, 0.0);//指定颜色缓冲区清除为黑色 glClearDepth(1.0);//指定深度缓冲区的清除值为1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//指定要清除的缓冲区并清除 2.绘制几何图形 先要设置绘制颜色,

绘制图形与3D增强技巧(四)----多边形图元及其点画模式

1.四边形图元 glBegin(GL_QUADS); glend(); 2.通用多边形 glBegin(GL_POLYGONS); glend(); 3.多边形点画模式 glenable(GL_POLYGON_STIPPLE); glPolygonStipple(pBitmp); 其中pBitmap为一块指定了数据区域的指针, #include "stdafx.h" // PStipple.cpp // OpenGL SuperBible // Demonstrates OpenGL

直线点画模式

1:开启点画模式:glEnable(GL_LINE_STIPPLE); 2:设置当前模式为点画模式:glLineStipple(1, 0x0101); #include <gl/glut.h> #define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES); glVertex2f((x1), (y1)); glVertex2f((x2),(y2)); glEnd(); void init() { glClearColor(0.0, 0.0, 0.0, 0.

OpenGl学习进程(7)第五课:点、边和图形(二)边

本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的.可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定.     (2)如何绘制边: 1)OpenGL支持绘制三种类型的边: GL_LINES :指定两个顶点,在它们之间绘制一条直线.如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略. GL

OpenGL学习进程(10)第七课:四边形绘制与动画基础

    本节是OpenGL学习的第七个课时,下面以四边形为例介绍绘制OpenGL动画的相关知识:     (1)绘制几种不同的四边形: 1)四边形(GL_QUADS) OpenGL的GL_QUADS图元用于绘制四边形,它根据每四个顶点绘制一个四边形. 注意:在使用四边形时必需记住四边形的四个角必须位于同一个平面中(不存在弯曲的四边形). 2)四边形带(GL_QUAD_STRIP) 该图元指定一个连接的四边形带.它们都保持相同方向的环绕. 3)通用多边形GL_POLYGON 我们可以用它绘制任意数

openGL学习笔记四 : 关于颜色, 大小, 虚线, 多边形反转, 镂空, 使用位图

转载请保留出处,,,,hushuai1992http://blog.csdn.net/u013642494/article/category/2675731 额, 这个标题我都不知道该怎么起了, 如果没有标题, 请不要在意这些细节..... 我们看看上次我们画的点.以及线, 我们似乎忘了说如何设置点的大小( 哦, 不对, 我似乎是说了后面来说的....), 现在我们来看看 一    设置点的大小和线的粗细 void glPointSize (GLfloat size);//设置点的大小, 默认为

OpenGL进阶示例1——动态画线(虚线、实线、颜色、速度等)

用OpenGL动态绘制线段,其实很简单,但到现在为止,网上可参考资料并不多.于是亲自动手写一个函数,方便动态绘制线段.代码如下: #include<GL/glut.h> //OpenGL实用工具包 #include <Windows.h> /*所遇问题: 1.系统API函数Sleep()不听话,睡眠时快时慢(可能跟我计算机当前运行程序有关吧) 解决方案:重写Sleep()函数,实质为空循环.仅用于Debug下,Release会将其优化 2.动态画直线,朝某些方向画线时出现块状 解决