【OpenGL学习二】点与线 绘制三角形及其绕法、明暗处理、模式

一、对于点、线学习

主代码

void RenderScene(void)
{
	// 用当前的清除颜色清除窗口
	glClear(GL_COLOR_BUFFER_BIT);
	// 把绘图颜色设置为紫色(RGB)
	glColor3f(1.0f,0.0f,1.0f);

	 用当前颜色绘制一个填充的矩形,参数表示左上角点和右下角点的坐标
	glRectf(100.0f, 150.0f, 150.0f, 100.0f);
	//glRectf(-25.0f, 25.0f, 25.0f, -25.0f);

	GLfloat sizes[2]; //保存绘制点的尺寸范围
	GLfloat step;//保存绘制点尺寸的步长
	GLfloat curSize; //当前绘制的点的大小
	glGetFloatv(GL_POINT_SIZE_RANGE,sizes);//获得点的尺寸范围
	glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);//获得点尺寸的步长

	//绘制不同大小的点
	curSize=sizes[0];
	for (int i=0;i<25;i++)
	{
		glPointSize(curSize); //设置点的大小
		glBegin(GL_POINTS);
		glVertex3f(25.0+i*8,200.0f,0.0f);
		glEnd();
		curSize +=step*2;
	}

	//绘制一条宽度为5的直线
	glLineWidth(5); //设置线宽
	glBegin(GL_LINES);
	glVertex3f(25.0f,160.0f,0.0f);
	glVertex3f(225.0f,160.0f,0.0f);
	glEnd();


	//绘制一条虚线
	glEnable(GL_LINE_STIPPLE);
	glLineStipple(1,0x00FF); //设置点划线模式
	glBegin(GL_LINES);
	glVertex3f(25.0f,120.0f,0.0f);
	glVertex3f(225.0f,120.0f,0.0f);
	glEnd();

	//绘制一条宽度为3的点划线
	glLineWidth(3);
	glLineStipple(1,0xFF0C);
	glBegin(GL_LINES);
	glVertex3f(25.0f,80.0f,0.0f);
	glVertex3f(225.0f,80.0f,0.0f);
	glEnd();

	//增加重复因子绘制的点划线
	glLineStipple(4,0xFF0C);
	glBegin(GL_LINES);
	glVertex3f(25.0f,40.0f,0.0f);
	glVertex3f(225.0f,40.0f,0.0f);
	glEnd();
	glDisable(GL_LINE_STIPPLE);


	// 刷新OpenGL绘图命令队列
	glFlush();
}

运行结果

 

二、三角形的绘制

 主要代码

void ProcessMenu(int value) 
{  switch(value)
{  
case 1: 
    // 修改多边形正面为填充模式
    glPolygonMode(GL_FRONT,GL_FILL);   
    break; 
case 2:    
    //修改多边形正面为线模式
    glPolygonMode(GL_FRONT,GL_LINE);  
    break;  
case 3:  
    //修改多边形正面为点模式
    glPolygonMode(GL_FRONT,GL_POINT);    
    break;   
case 4:  
    //修改多边形反面为填充模式
    glPolygonMode(GL_FRONT,GL_FILL); 
    break;  
case 5:   
    //修改多边形反面为线模式  
    glPolygonMode(GL_FRONT,GL_LINE);   
    break;  
case 6:    
    //修改多边形反面为点模式 
    glPolygonMode(GL_FRONT,GL_POINT);  
    break; 

case 7:   
    //设置多边形的阴影模式为平面明暗模式
    glShadeModel(GL_FLAT);  
    break; 
case 8: 
    //设置多边形的阴影模式为光滑明暗模式 
    glShadeModel(GL_SMOOTH);   
    break;   
case 9:  
    bWinding = !bWinding;
    break; 
default:   
    break; 
} 
glutPostRedisplay(); 
} 

 

int main(int argc, char* argv[]) 
{ 
    int nModeMenu;  
    int nMainMenu;  
    int nColorMenu; 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB );  
    glutCreateWindow("多边形演示"); 
    glutReshapeFunc(ChangeSize); 
    glutSpecialFunc(SpecialKeys);  // 设置特殊键响应回调函数
    glutDisplayFunc(RenderScene); 

    //  创建一个子菜单并定义菜单回调函数
    nModeMenu = glutCreateMenu(ProcessMenu);  
    //添加菜单项,1表示选择菜单条目时传递的参数
    glutAddMenuEntry("正面多边形填充模式",1);
    glutAddMenuEntry("正面线框模式",2); 
    glutAddMenuEntry("正面点模式",3);  
    glutAddMenuEntry("反面多边形填充模式",4); 
    glutAddMenuEntry("反面线框模式",5); 
    glutAddMenuEntry("反面点模式",6);  

    //增加一个子菜单
    nColorMenu = glutCreateMenu(ProcessMenu); 
    glutAddMenuEntry("平面明暗模式",7);  
    glutAddMenuEntry("光滑明暗模式",8); 


    //创建主菜单
    nMainMenu = glutCreateMenu(ProcessMenu); 
    glutAddSubMenu("多边形模式", nModeMenu);  
    glutAddSubMenu("颜色模式", nColorMenu); 
    glutAddMenuEntry("改变绕法",9); 

    //将创建的菜单与右键关联,即把菜单设置为右键弹出式菜单
    glutAttachMenu(GLUT_RIGHT_BUTTON);  

    SetupRC();  
    glutMainLoop(); 
    return 0;
} 

运行结果 

通过按右键选择正反面模式,上下左右键控制旋转:

 按右键,修改图片显示属性

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值