OpenGL中設定直線的當前點畫模式。pattern參數是由1或0組成的16位序列,它們根據需要進行重複,對一條特定的直線進行點畫處理。
基本介紹
- 中文名:glLineStipple()
- 外文名:viod glLineStipple(GLint factor,GLshort pattern);
- factor:擴展為6個連續的1
- 參數:1或0組成的16位序列
- 例如:glLineStipple(1, Ox3F07
簡介,程式示例,
簡介
viod glLineStipple(GLint factor,GLshort pattern);
從這個模式的低位開始,一個像素一個像素的進行處理。如果模式中對應的位是1,就繪製這個像素,否則就不繪製。模式可以使用factor參數(表示重複因子)進行擴展,它與1和0的連續子序列相乘。因此,如果模式中出現了3個1,並且factor是2,那么它們就擴展為6個連續的1。必須以GL_LINE_STIPPLE為參數調用glEnable()才能啟用直線點畫功能。為了禁用直線點畫功能,可以向glDisable()函式傳遞同一個參數。
例如:
glLineStipple(1, 0x3F07);
glEnable(GL_LINE_STIPPLE);
此時模式為Ox3F07(二進制形式為0011111100000111),它所畫出來的直線是這樣的:先連續繪製3個像素,然後連續5個像素留空,再連續繪製6個像素,最後兩個像素留空(注意,首先是從低位開始的)。如果factor是2,那么這個模式便被擴展為:先連續繪製6個像素,然後連續10個像素留空,再連續繪製12個像素,最後4個像素留空。
如果沒有啟用點畫線功能,OpenGL會自動把pattern當做為OxFFFF,把factor當成1。
程式示例
#include <windows.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glaux.h>
#define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES); \
glVertex2f((x1),(y1)); glVertex2f((x2),(y2)); glEnd();
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
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);
glLineWidth(5.0);
glLineStipple(1, 0x0101);
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);
glLineStipple(1, 0x1C47);
glBegin(GL_LINE_STRIP);
for (i= 0; i<7 ; i++)
glVertex2f(50.0+((GLfloat)i*50.0), 75.0);
glEnd();
for (i= 0; i<6 ; i++){
drawOneLine(50.0+((GLfloat)i*50.0), 50.0,
50.0+((GLfloat)(i+1)*50.0), 50.0);
}
glLineStipple(5, 0x1C47);
drawOneLine(50.0, 25.0, 350.0, 25.0);
glDisable(GL_LINE_STIPPLE);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400, 150);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);