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