• 【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.绘制几何图形

    先要设置绘制颜色,比如

    glColor3f(1.0,1.0,1.0);
    描述几何物体的顶点
    glVertex2s(2,3);
    glVertex3d(0.0,0.0,3.14);
    glVertex4f(2.3,1.0,-2.2,112.3);
    绘制结束后最好强制绘制完成
    void glFlush();//强制以前的opengl命令开始执行,保证它们在有限时间内完成。
    void glFinish();//强制以前的opengl命令完成执行。在命令执行完成前这个函数不会返回。
    点和线宽度

    void glPointSize(GLfloat size);//设置被渲染点的宽度,以pixel为单位,默认为1.0
    void glLineWidth(GLfloat width);//以像素为单位设置宽度,用于直线的渲染
    设置直线的点画模式:

    factor为重复因子,pattern为16为二进制数(1画0不画) 使用前必须调用glEnable(GL_LINE_STIPPLE)

    void glLineStipple(GLint factor,GLushort pattern);

    3.宽点画线示例

    #include <GL/glut.h>
    #include <stdlib.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);	//开启直线点画功能
    
    	//效果1
    	glLineStipple (1, 0x0101);  //设置当前直线的点画模式
    	drawOneLine (50.0, 125.0, 150.0, 125.0);
    	glLineStipple (1, 0x00FF);  //设置当前直线的点画模式
    	drawOneLine (150.0, 125.0, 250.0, 125.0);
    	glLineStipple (1, 0x1C47);  //设置当前直线的点画模式
    	drawOneLine (250.0, 125.0, 350.0, 125.0);
    
    	//效果2
    	glLineWidth (5.0);			//设置线宽	
    	glLineStipple (1, 0x0101);  
    	drawOneLine (50.0, 100.0, 150.0, 100.0);
    	glLineStipple (1, 0x00FF); 
    	drawOneLine (150.0, 100.0, 250.0, 100.0);
    	glLineStipple (1, 0x1C47);  
    	drawOneLine (250.0, 100.0, 350.0, 100.0);
    	glLineWidth (1.0);
    
    	//效果3
    	glLineStipple (1, 0x1C47); 
    	glBegin (GL_LINE_STRIP);
    	for (i = 0; i < 7; i++)
    		glVertex2f (50.0 + ((GLfloat) i * 50.0), 75.0);
    	glEnd ();
    
    	//效果4
    	for (i = 0; i < 6; i++) {
    		drawOneLine (50.0 + ((GLfloat) i * 50.0), 50.0,
    			50.0 + ((GLfloat)(i+1) * 50.0), 50.0);
    	}
    
    	//效果5
    	glLineStipple (5, 0x1C47); //重复因子为5
    	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);
    }
    
    void keyboard(unsigned char key, int x, int y)
    {
    	switch (key) {
    	case 27:
    		exit(0);
    		break;
    	}
    }
    
    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); 
    	glutReshapeFunc(reshape); //移动窗口或者改变窗口大小的时候调用
    	glutKeyboardFunc(keyboard);
    	glutMainLoop();
    	return 0;
    }

    4.效果



  • 相关阅读:
    cookie的设置、获取和删除封装
    原生javascript封装ajax和jsonp
    javascript模块化应用
    图解javascript this指向什么?
    学习bootstrap心得
    javascript使用两个逻辑非运算符(!!)的原因
    dubbo小教程
    JSTL与EL表达式(为空判断)
    自己整理的常用SQL Server 2005 语句、
    python基础:迭代器、生成器(yield)详细解读
  • 原文地址:https://www.cnblogs.com/fzll/p/3954575.html
Copyright © 2020-2023  润新知