位置: 编程技术 - 正文

OpenGL入门二(opengl入门教程(精))

编辑:rootadmin
本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念。一、点、直线和多边形我们知道数学(具体的说,是几何学)中有点、直线和多边形的概念,但这些概念在计算机中会有所不同。数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点。另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出一个无穷小的点。一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽然它可能足够小,但并不会是无穷小。同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于OpenGL的实现。当然,过度的注意细节就是钻牛角尖,我们大可不必花费过多的精力去研究“多个点如何画到同一像素上”。同样的,数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。多边形是由多条线段首尾相连而形成的闭合区域。OpenGL规定,一个多边形必须是一个“凸多边形”(其定义为:多边形内任意两点所确定的线段都在多边形内,由此也可以推导出,凸多边形不能是空心的)。多边形可以由其边的端点(这里可称为顶点)来确定。(注意:如果使用的多边形不是凸多边形,则最后输出的效果是未定义的——OpenGL为了效率,放宽了检查,这可能导致显示错误。要避免这个错误,尽量使用三角形,因为三角形都是凸多边形)可以想象,通过点、直线和多边形,就可以组合成各种几何图形。甚至于,你可以把一段弧看成是很多短的直线段相连,这些直线段足够短,以至于其长度小于一个像素的宽度。这样一来弧和圆也可以表示出来了。通过位于不同平面的相连的小多边形,我们还可以组成一个“曲面”。二、在OpenGL中指定顶点由以上的讨论可以知道,“点”是一切的基础。如何指定一个点呢?OpenGL提供了一系列函数。它们都以glVertex开头,后面跟一个数字和1~2个字母。例如:glVertex2dglVertex2fglVertex3fglVertex3fv等等。数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个(我知道有点罗嗦~)。字母表示参数的类型,s表示位整数(OpenGL中将这个类型定义为GLshort), i表示位整数(OpenGL中将这个类型定义为GLint和GLsizei), f表示位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf), d表示位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。 v表示传递的几个参数将使用指针的方式,见下面的例子。这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:(一)glVertex2i(1, 3);(二)glVertex2f(1.0f, 3.0f);(三)glVertex3f(1.0f, 3.0f, 0.0f);(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f}; glVertex3fv(VertexArr3);以后我们将用glVertex*来表示这一系列函数。

推荐整理分享OpenGL入门二(opengl入门教程(精)),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl2d,opengl教程48讲,opengl入门教程(精),opengl入门书,opengl入门书,opengl入门视频教程,opengl从入门到精通,opengl入门教程(精),内容如对您有帮助,希望把文章链接给更多的朋友!

注意:OpenGL的很多函数都是采用这样的形式,一个相同的前缀再加上参数说明标记,这一点会随着学习的深入而有更多的体会。

OpenGL入门二(opengl入门教程(精))

三、开始绘制假设现在我已经指定了若干顶点,那么OpenGL是如何知道我想拿这些顶点来干什么呢?是一个一个的画出来,还是连成线?或者构成一个多边形?或者做其它什么事情?为了解决这一问题,OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点。例如我写:glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.0f);glEnd();则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。我们还可以指定更多的顶点,然后画出更复杂的图形。另一方面,glBegin支持的方式除了GL_POINTS和GL_LINES,还有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等.我并不准备在glBegin的各种方式上大作文章。大家可以自己尝试改变glBegin的方式和顶点的位置,生成一些有趣的图案。程序代码:void myDisplay(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin( /* 在这里填上你所希望的模式 */ ); /* 在这里使用glVertex*系列函数 */ /* 指定你所希望的顶点位置 */ glEnd(); glFlush();}把这段代码改成你喜欢的样子,然后用它替换第一课中的myDisplay函数,编译后即可运行。两个例子例一、画一个圆/*正四边形,正五边形,正六边形,……,直到正n边形,当n越大时,这个图形就越接近圆当n大到一定程度后,人&#;将无法把它跟真正的圆相区别这时我们已经成功的画出了一个“圆”(注:画圆的方法很多,这里使用的是比较简单,但效率较低的一种)试修改下面的const int n的&#;,观察当n=3,4,5,8,,,,,等不同数&#;时输出的变化情况将GL_POLYGON改为GL_LINE_LOOP、GL_POINTS等其它方式,观察输出的变化情况*/#include <math.h>const int n = ;const GLfloat R = 0.5f;const GLfloat Pi = 3.f;void myDisplay(void){ int i; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); for(i=0; i<n; &#;&#;i) glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); glEnd(); glFlush();}例二、画一个五角星/*设五角星的五个顶点分布位置关系如下: AE B D C首先,根据余弦定理列方程,计算五角星的中心到顶点的距离a(假设五角星对应正五边形的边长为.0)a = 1 / (2-2*cos(*Pi/));然后,根据正弦和余弦的定义,计算B的x坐标bx和y坐标by,以及C的y坐标(假设五角星的中心在坐标原点)bx = a * cos( * Pi/);by = a * sin( * Pi/);cy = -a * cos( * Pi/);五个点的坐标就可以通过以上四个量和一些常数简单的表示出来*/#include <math.h>const GLfloat Pi = 3.f;void myDisplay(void){ GLfloat a = 1 / (2-2*cos(*Pi/)); GLfloat bx = a * cos( * Pi/); GLfloat by = a * sin( * Pi/); GLfloat cy = -a * cos( * Pi/); GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by }; glClear(GL_COLOR_BUFFER_BIT); // 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出 glBegin(GL_LINE_LOOP); glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush();}例三、画出正弦函数的图形/*由于OpenGL默认坐标&#;只能从-1到1,(可以修改,但方法留到以后讲)所以我们设置一个因子factor,把所有的坐标&#;等比例缩小,这样就可以画出更多个正弦周期试修改factor的&#;,观察变化情况*/#include <math.h>const GLfloat factor = 0.1f;void myDisplay(void){ GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); // 以上两个点可以画x轴 glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); // 以上两个点可以画y轴 glEnd(); glBegin(GL_LINE_STRIP); for(x=-1.0f/factor; x<1.0f/factor; x&#;=0.f) { glVertex2f(x*factor, sin(x)*factor); } glEnd(); glFlush();}小结本课讲述了点、直线和多边形的概念,以及如何使用OpenGL来描述点,并使用点来描述几何图形。大家可以发挥自己的想象,画出各种几何图形,当然,也可以用GL_LINE_STRIP把很多位置相近的点连接起来,构成函数图象。如果有兴趣,也可以去找一些图象比较美观的函数,自己动手,用OpenGL把它画出来。

OpenGL编程逐步深入(九)插值处理 注:文中VS代指顶点着色器,FS代指片段着色器。准备知识这个教程和大家展示3d管道中非常重要的部分,即Interpolation(插值)。光栅化程序执行的插值

OpenG: 光照 1.绘制带有光照效果的场景;2.场景包含3个茶壶,通过键盘1,2,3可以分别选中三个茶壶,然后用鼠标对每个茶壶进行分别的旋转;3.使用点光源,点光源

OpenGL教程翻译 第十七课 环境光(Ambient Lighting) OpenGL教程翻译第十七课环境光(AmbientLighting)原文地址:

标签: opengl入门教程(精)

本文链接地址:https://www.jiuchutong.com/biancheng/369588.html 转载请保留说明!

上一篇:OpenGL入门一(opengl入门教程(精))

下一篇:OpenGL编程逐步深入(九)插值处理(opengl编程宝典)

  • 计提税费如何写分录
  • 跨区域涉税事项报验
  • 收到社保局退回的社保费
  • 小规模未达起征点的增值税怎么做账
  • 收到货款没开票做应收还还应付
  • 工资薪金所得和全年一次性奖金
  • 天然气安装工程施工劳务协议
  • 预计负债收回的会计分录
  • 建筑业附加税税率是多少
  • 房屋转租收入会计分录
  • 退票费可以开公司发票吗
  • 申报是不是就是报税
  • 金融企业的代理贷款什么意思
  • 报销抵冲银行日记帐要怎么入帐?
  • 制造费用月末怎么结转到生产成本
  • 1697509310
  • 股份支付的会计处理?
  • 大额保险缴费
  • 短期借款有没有上年结转
  • 王者荣耀电脑版操作
  • 无法加载响应数据 对于预检请求没有可显示的内容
  • 闲置设备怎么处理
  • 结转人工费会计分录
  • 域名服务费属于什么会计科目
  • schupd.exe - schupd是什么进程 有什么用
  • 收到发票未抵扣需要做账吗
  • 房地产企业哪些成本上升了
  • 微软发布windows
  • 销售折扣的税票怎么开
  • 冲销上月计提费用
  • 格拉斯伯格
  • 职工工资扣税比例
  • 厂区绿化工程计入什么科目
  • 简述php的概念和特点
  • php输出隔行变色的表格
  • 阿里月薪3万到手多少
  • php实现页面静态化
  • 商场售后返租
  • 上月未记账,本月不能记账
  • flex:4
  • 车船税为什么没有发票
  • mysql union和join
  • php判断数据库用户名是否存在
  • 开票信息修改
  • mysql显示数据库中的表
  • 应付账款的入账价值为未来偿还额
  • 哪些合同不用计提印花税
  • 材料盘盈如何入账
  • 房地产行业账务处理和主要税种
  • 预付卡充值入什么科目
  • 微信提现手续费1000扣多少
  • 分期付款购车需要什么
  • 股本是什么类科目怎么记
  • 收到所得税退税的账务处理
  • 聘用残疾人优惠政策
  • 持有待售流动资产减值
  • 如何判断企业处于什么阶段
  • 苹果电脑安全性
  • win8更新到win8.1
  • avgorange是什么文件夹
  • instmsiw.exe进程简介
  • win8一键恢复出厂设置
  • os x yosemite wifi断线怎么办?yosemite wifi掉线解决详细步骤
  • win10rs2是哪个版本
  • reg.exec
  • win7玩穿越火线电脑应该怎么设置
  • win7系统按Ctrl+Shift不能切换输入法的图文教程
  • windows8使用教程
  • 安装samba服务器步骤
  • iframe移动端自适应
  • nodejs怎么启动服务
  • 相片管理必备知识
  • python文件管理系统难点总结
  • jquery 添加
  • android studio 开发语言
  • 安卓手机 监听功能
  • 数据字典实例详解
  • 什么是城建税和土地税
  • 企业购车需要交消费税吗
  • 车辆购置税查询不到应征欠税信息,不能进行扣款操作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设