位置: 编程技术 - 正文

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编程宝典)

  • 增值税发票管理办法
  • 金蝶怎么增加凭证行数
  • 个税填报后怎么撤销申报
  • 怎么用一证通报税
  • 企业所得税资产总额怎么算出来的呢
  • 可供出售金融资产会计处理
  • 备用金三栏式明细账图片
  • 两免三减半的概率是多少
  • 对外投资借款费用计入
  • 怎么不用关税
  • 销售货物的价外费用有哪些
  • 生产中的原料回收如何做会计帐务处理?
  • 提取法定盈余公积比例
  • 转销无形资产的处置流程
  • 通信服务费计入什么科目
  • 关联业务报告表需要填吗
  • 协会会费入账科目是哪个
  • 收入与应收款
  • 小规模企业企业所得税优惠政策2022年
  • 复核未通过
  • 营运资金主要包括什么
  • 暂估成本的会计处理
  • 日历怎么不能添加事件了
  • XP系统,右下角本地连接图标消失的解决办法
  • php常用的开发工具
  • 农产品核定扣除的扣除率是多少
  • 固定资产的计量属性
  • 国有控股企业改制
  • Web渗透测试新手实操详解
  • vue3打包优化
  • php中实现文件上传需要用到哪几个函数
  • 会计处理的正确顺序
  • thinkphp import
  • thinkphp框架怎么用
  • php发送邮箱
  • 什么是累计预扣预缴应纳税所得额
  • git简明教程
  • 人工智能 深度
  • 详解Yii2 rules 的验证规则
  • 股权转让税收规定
  • 利润表的格式分为哪几种
  • 帝国cms文件夹介绍
  • PostgreSQL中使用dblink实现跨库查询的方法
  • 个人发票抬头和公司发票抬头有什么区别
  • 虚开发票是指怎样?
  • 企业正常性停产什么意思
  • 什么样的差旅费津贴可以税前扣除
  • sql server 视图排序
  • 增值税申报抵扣联数据没有
  • 盈余公积的会计科目
  • 销售收入发生变动的影响
  • 专用发票丢失怎么入账
  • 公司利润如何提取避税
  • 融资租赁租金利息怎么算
  • 质押发票
  • 软件企业技术开发增值税税率
  • 疫情期间购买消毒弥雾机的请示
  • 企业代扣个人社保最新会计处理
  • 生产车间生产工人的薪酬计入什么
  • 冲减和冲销的会计分录
  • 培训奖励怎么写
  • 库存商品记账
  • xp系统怎样打开隐藏文件
  • linux的命令行指的是什么
  • 怎样设置禁
  • windows7怎么打开开机启动项
  • groove音乐怎么添加本地音乐
  • won10安装
  • win10系统打开图片内存忽大忽小
  • 在Linux操作系统中哪些命令可以正确关闭系统防火墙
  • windows7开机
  • win7定时开关怎么定时
  • bat读取文件内所有内容
  • python中while用法
  • unity更新下载文件
  • JavaScript中的数据类型
  • 修改jquery版本号不生效
  • 江苏省全电发票开通流程
  • 苏州税务中心
  • 国家土地征收管理办法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设