OpenGL入门--图元的绘制_gldrawelements(gl_lines-程序员宅基地

技术标签: OpenGL  opengl  

目录

平滑着色和恒定着色

alpha测试

平面裁剪


简单的框架,也就是每一个开发的程序公用的代码。下面以绘制一个四边形带为例。

#include <gl/glut.h>

void reshape(int w, int h)
{
 glViewport(0, 0, w, h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-2, 2, -2, 2, -10, 10);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
}


void Display()  //显示
{
 glShadeModel(GL_FLAT);



 //绘图
 glClear(GL_COLOR_BUFFER_BIT);   //清空颜色缓冲

 glBegin(GL_QUAD_STRIP);  //图元
 glColor3f(1, 0, 0);
 
 glVertex2f( -0.3, 0.5);
 glVertex2f(-0.2,-0.5);
 glVertex2f(0.2, 0.5);
 glVertex2f(0.2,-0.5);


 glColor3f(0, 1, 0);
 glVertex2f(0.6, 0.5);
 glVertex2f(0.7, -0.5);
 

 glColor3f(0, 0, 1);
 glVertex2f(1.2, 0.5);
 glVertex2f(0.9, -0.5);

 glColor3f(0, 1, 1);
 glVertex2f(1.8, 0.5);
 glVertex2f(1.3, -0.5);


 glEnd();

 glFlush();  //清空并执行缓冲区指令 
}


int main(int argc, char** argv)
{
 //glut初始化
 glutInit(&argc, argv);   //对命令行参数进行处理
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //初始化窗口显示模式为单缓冲和RGB颜色模式
 glutInitWindowSize(700, 700);    //初始化窗口大小为700px*700px
 glutInitWindowPosition(200, 100);    //初始化窗口显示位置
 glutCreateWindow("显示页面");  //创建窗口

 glutDisplayFunc(Display);   //设置显示回调函数
 glutReshapeFunc(reshape);
 glutMainLoop(); //循环

 return 0;
}

运行结果

 图元的类型

下面提供几种图元绘制的代码,只用替换display()函数中glBegin()和glEnd()函数之间的内容就可以了。

	//点的绘制
	glPointSize(5.0f); //设置点的大小
	glBegin(GL_POINTS);  //图元
	glColor3f(1, 1, 0);
	glVertex2f(1,1);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.3, 0.3);
	glColor3f(1, 0, 1);
	glVertex2f(-1,1);
	glVertex2f(-0.5, 0.5);
	glVertex2f(-0.3, 0.3);
	glVertex2f(-1,-1);
	glColor3f(1,1,1);
	glVertex2f(1,-1);
	glVertex2f(0.5, -0.5);
	glVertex2f(0.3, -0.3);
	glEnd();


    //线的绘制
	glLineWidth(0.5f);    //设置线的宽度
	

	glBegin(GL_LINES);    //图元

	glColor3f(1, 1, 0);
	glVertex2f(0.2,0.4);
	glVertex2f(0, 0);

	glColor3f(1, 0, 0);
	glVertex2f(0.3, 0.5);
	glVertex2f(0.5,0.33);

	glEnd();

	//点划线
	glLineWidth(4.0f);  //设置线的宽度
	glEnable(GL_LINE_STIPPLE);  //控制开始
	glLineStipple(2, 0xff00);
	glColor3f(1, 1, 0);


	glBegin(GL_LINES);   //图元
	//glColor3f(1, 1, 0);
	glVertex2f(0.5, 0.5);
	glVertex2f(-0.5, 0.5);
	//glColor3f(1, 0, 0);
	glVertex2f(-0.5, -0.5);
	glVertex2f(0.5, -0.5);

	glEnd();

	//三角形带的绘制

	glBegin(GL_TRIANGLE_STRIP);
	glColor3f(1, 1, 0);
	glVertex2f(0,0.5);
	glVertex2f(0, 0);
	glVertex2f(0.1, 0.7);

	glColor3f(1, 0, 0);
	glVertex2f(0.3, 0);

	glColor3f(1, 0, 1);
	glVertex2f(0.6,0.8);


	glColor3f(0,1,1);
	glVertex2f(0.7,-0.1);

	glColor3f(1, 1, 0);
	glVertex2f(1, 0.7);

	glColor3f(0, 1, 0);
	glVertex2f(1.1, 0.1);

	glColor3f(0, 1, 1);
	glVertex2f(1.3, 0.6);


	glEnd();

	//画线段
	glLineWidth(4.0f);
	glBegin(GL_LINE_STRIP);
	glColor3f(1,1,0);
	glVertex2f(0,0);
	glVertex2f(0, 0.5);

	glColor3f(1, 0, 1);
	glVertex2f(0.2, 0.4);
	glColor3f(0,1,1);
	glVertex2f(0.3,0);

	glEnd();

	//GL_LINE_LOOP
	glBegin(GL_LINE_LOOP);
	glLineWidth(4.0f);
	glColor3f(1, 1, 0);
	glVertex2f(0,0);
	glVertex2f(0.5,-0.5);
	glVertex2f(0.6, 0.4);
	glVertex2f(0.2, 0.3);
	glEnd();

	//GL_TRIANGLE_FAN

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(1, 1, 0);
	glVertex2f(0,0);
	glVertex2f(0.6, 0.1);
	glVertex2f(0.5, 0.3);
	glColor3f(1, 0, 1);
	glVertex2f(0.4, 0.4);
	glColor3f(0, 1, 0);
	glVertex2f(-0.1,0.3);
	glColor3f(0, 0, 1);
	glVertex2f(-0.2, 0.2);
	glColor3f(0, 1, 1);
	glVertex2f(-0.1, -0.1);
	glEnd();

	//GL_POLYGON
	glBegin(GL_POLYGON);
	glColor3f(1, 1,0);
	glVertex2f(0, 0);
	glVertex2f(0.3,-0.2);
	glVertex2f(0.5, -0.1);
	glVertex2f(0.6, 0.7);
	glVertex2f(0.4, 0.6);
	glVertex2f(0.2, 0.5);
	glEnd();

平滑着色和恒定着色

为了模拟光滑表面,OpenGL在渲染时根据顶点颜色通过插值计算各片元的颜色;为了模拟平面,可调用glShadeModel(GL_FLAT)将默认着色器从GL_SMOOTH改为GL_FLAT

void glShadeModel(GL_SMOOTH);  //平滑着色
void glShadeModel(GL_FLAT);    //恒定着色

 GL_FLAT导致OpenGL渲染后续图元的时候,使用最后一个顶点的颜色给图元着色。

alpha测试

如果片元alpha值未通过应用程序指定的比较测试,alpha测试特性将其丢弃。要使用alpha测试,应用程序必须启用它并指定比较测试。要启用和禁用alpha测试,可使用参数GL_ALPHA_TEST调用相应函数。

glEnable(GL_ALPHA_TEST);   //启用alpha测试
glAlphaFunc(GL_GREATER, 0.f); //大于接受

还有以下参数

GL_ALWAYS(始终通过),
GL_NEVER(始终不通过),
GL_LESS(小于则通过),
GL_LEQUAL(小于等于则通过),
GL_EQUAL(等于则通过),
GL_GEQUAL(大于等于则通过),
GL_NOTEQUAL(不等于则通过) 

例子

	   //alpha测试
	glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_FALSE);
	glEnable(GL_ALPHA_TEST);   //启用alpha测试
	glAlphaFunc(GL_GREATER, 0.4); //大于接受
	

	glBegin(GL_QUAD_STRIP);  //图元
	glColor4f(1, 1, 0,0.3);
	glVertex2f(-0.2, 0.5);
	glVertex2f(-0.2, -0.5);

	glColor4f(1, 0, 0,0.5);
	glVertex2f(0.2, 0.5);
	glVertex2f(0.2, -0.5);

	glEnd();

平面裁剪

		//定义裁剪平面数组
	GLdouble equn[4] = { 1,-1,0,0 };

	//设置裁剪平面
	glEnable(GL_CLIP_PLANE0);
	glClipPlane(GL_CLIP_PLANE0, equn);

Ax+By+Cz+D>=0 部分会被保留。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44799122/article/details/119519192

智能推荐

MATLAB-ones函数_matlab中ones函数-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏7次。在MATLAB中,ones函数用于创建一个指定大小的由1组成的矩阵或数组。_matlab中ones函数

解决PS等软件出现应用程序无法正常启动(0xc000007b)_photoshop应用程序无法正常启动0xc000007b。请单击“确认”关闭应用程序。-程序员宅基地

文章浏览阅读3.9w次,点赞2次,收藏9次。  在使用电脑办公过程中,安装应用程序时难免遇到无法安装或者无法正常启动的问题,这对我们使用电脑带来了诸多不便。那遇到应用程序无法正常启动的问题要如何解决呢?相信大家肯定都是十分疑问的,每次都是只能忍痛重新安装软件。今天,小编就和大家探讨下应用程序无法正常启动的解决方法,帮助大家排忧解难。0xc000007b电脑图解1  第一种方案:SFC检查系统完整性来尝试修复丢失文件  1、打开电脑搜索输入cmd.exe,选择以管理员身份运行,跳出提示框时选择继续。0xc000007b电脑图解2_photoshop应用程序无法正常启动0xc000007b。请单击“确认”关闭应用程序。

oracle介质恢复和实例恢复的异同-程序员宅基地

文章浏览阅读396次。1、概念 REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制。实际上REDO LOG的存在是为两种场景准备的:实例恢复(INSTANCE RECOVERY);介质恢复(MEDIA RECOVERY)。 实例恢复的目的是在数据库发生故障时,确保BUFFER CACHE中的数据不会丢失,不会造成数据库的..._oracle 实例恢复和介质恢复

Map中的putAll方法_java map putall-程序员宅基地

文章浏览阅读7k次。HashMap map1=new HashMap(); HashMap map2 = new HashMap();map2.putAll(map1)上面的代码的意思是将map1中所有的<key,value>插入到map2中去。具体参考: HashMap map1=new HashMap(); map1.put("..._java map putall

基于javaweb仿京东商城管理系统的设计与实现(含论文和程序源码及数据库文件)_基于java web的网店管理系统的设计与实现-程序员宅基地

文章浏览阅读1w次,点赞8次,收藏60次。网上购物商城系统以弥补传统购物方式的弊端。在目前的商城里,如果采用网上商城方式,用户购物时就不需要到店里面排队,这样不仅能实时地了解商品的特色,而且方便了顾客,同时也减轻了商城的服务压力。随着WLAN技术的普及,一些规模较大的商城开始考虑利用这种最为先进、最具时尚潮流的网络技术来建设一套灵活、快捷的信息管理系统,以优化管理流程,使网上的服务和管理得到实质性的提升,提高品牌形象和行业核心竞争力。 本课题是实现了网上购物系统的功能,如:商品分类、订单管理等功能。本设计采用安装 JAVA JDK 、安装 IDEA_基于java web的网店管理系统的设计与实现

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)_python爬取数据-程序员宅基地

文章浏览阅读10w+次,点赞9k次,收藏2.4w次。关于Python爬虫的超详细讲解,用例子来给大家一步步分析爬虫的代码原理,由浅入深,老年人来了,我也给你整明白。_python爬取数据

随便推点

Angular6 和 RXJS6 的一些改动_angular6,requestoptions改成了什么-程序员宅基地

文章浏览阅读3.1k次。例一:import { Injectable } from '@angular/core';import { Observable } from 'rxjs';import { User } from "./model/User";import { map } from 'rxjs/operators';import { Http, Response, Headers, RequestOp..._angular6,requestoptions改成了什么

C++解析XML文件_c++ xml解析-程序员宅基地

文章浏览阅读7.9k次,点赞17次,收藏110次。C++读取XML文件_c++ xml解析

R语言使用caret包的train函数构建多元自适应回归样条(MARS)模型构建分类模型、trainControl函数设置交叉验证参数、自定义调优评估指标_多元自适应回归样条 r-程序员宅基地

文章浏览阅读235次。R语言使用caret包的train函数构建多元自适应回归样条(MARS)模型构建分类模型、trainControl函数设置交叉验证参数、自定义调优评估指标、tuneLength参数和tuneGrid参数超参数调优_多元自适应回归样条 r

Android ListView控件显示数据库中图片_安卓获取listview里的图片并显示-程序员宅基地

文章浏览阅读5.8k次。Android中ListView是比较常用的控件,但一直都觉得创建ListView步骤有点繁琐,故在此总结一下,方便查阅。程序效果是实现一个显示联系人的简单信息。使用ListView控件,数据有姓名,和照片,并加入点击事件响应。布局文件:

python123程序改错题库,2016最新二级C语言考试题库及答案(程序改错专项练习 精华版)...-程序员宅基地

文章浏览阅读535次。《2016最新二级C语言考试题库及答案(程序改错专项练习 精华版)》由会员分享,可在线阅读,更多相关《2016最新二级C语言考试题库及答案(程序改错专项练习 精华版)(4页珍藏版)》请在人人文库网上搜索。1、程序改错题(共15题)1、在考生文件夹下,给定程序MODI.C的功能是:求一维数组a中所有元素的平均值,结果保留两位小数。例如,当一维数组a中的元素为:10,4,2,7,3,12,5,34,5..._安徽二级python考试有程序改错题吗?

Roser S.Pressman在UMLChina交流实录-程序员宅基地

文章浏览阅读2.2k次。 UMLChina第十三期专家交流实录返回首页 返回目录北京时间2002年1月10日(星期四)晚上21:30-23:30 嘉宾:Roser S.Pressman博士是软件工程领域国际知名的咨询专家和作者,R.S. Pressman & Associates, Inc的创始人,已有超过30年的产业经验,主要从事工程产品软件和系统软件的开发技术工

推荐文章

热门文章

相关标签