位置: 编程技术 - 正文

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

  • 增值税发票开票软件金税盘
  • 什么情况下需要补牙
  • 未确认融资收益对应的科目是什么
  • 会计忘记申报税款会有什么影响
  • 工会基金是扣个人还是扣企业的
  • 所得税费用期初有余额吗
  • 忘记先抄税再申报了怎么办
  • 员工补充医疗保险报销范围
  • 企业年报 工商
  • 购买基金会计分录怎么填
  • 企业所得税营业收入包括什么
  • 广告公司制作警示牌可以开具什么样的发票?
  • 单位处置车辆账务处理
  • 收到对方的预付款,需要多久开发票
  • 进口货物要交消费税吗
  • 去年多计提费用,汇算清缴时做纳税调增处理
  • 延迟抵扣的税务风险
  • 营改增后税金由哪几项费用组成
  • 税收征收管理法
  • 母公司开票给子公司有什么税务风险吗
  • 海运费怎么做会计分录
  • 银行收取年费是什么意思
  • 企业购买二手车需要缴纳哪些税
  • 补缴城镇土地使用税会计分录怎么做
  • Win11安装如何跳过以太网
  • deepin隐藏分区
  • 购入研发设备
  • 设置pin是什么意思
  • .php是什么
  • php中文出现乱码
  • php 随机数
  • php获取地理位置
  • 微信小程序基于什么技术
  • linux mput命令
  • 用于应酬用的烟有哪些
  • 增值税普通发票几个点
  • 帝国cms什么语言
  • python怎么创建
  • windows11/windows10专业清理的系统工具Duplicate Cleaner5.0.13中文破解免费下载
  • 残保金滞纳金可以税前扣除吗
  • 税法上未投入使用的无形资产摊销所得税能扣除吗
  • 个人所得税两处或两处以上工资、薪金所得纳税申报表
  • 软件使用权计入什么科目
  • 购买无形资产的入账价值包括增值税吗
  • 工业用地便宜
  • 一般纳税人购买固定资产进项税可以抵扣吗
  • 保险再保业务
  • 对外担保产生诉讼费用吗
  • 企业贷款受托支付如何收税
  • 企业其他应付款减少说明什么
  • 进口ddp税款如何缴纳
  • 注销的企业
  • 同一控股下并合并的股票
  • 什么是限制性股票激励
  • 发票金额大于实际报销怎么做账
  • 国家高新技术企业补贴
  • 咨询企业发生的费用计入
  • 研发费用范围不包括
  • 工会经费支出范围
  • win10连接ubuntu20.04远程桌面
  • linux 匹配字符
  • winmysqladmin.exe - winmysqladmin进程是什么意思
  • windows任务管理器打不开
  • windows10bug严重
  • grub修复引导windows10
  • win10更新后安装包会自动删除吗
  • w10点击没反应
  • windowsxp的主要特点是什么
  • win7怎么修改开机启动
  • 动态设置class
  • webpack 构建流程
  • cocos2dx4.0教程
  • jquery的checked
  • nodejs 读取文件
  • jquery mobile demo
  • node.js express koa
  • js教程
  • 江苏省税务局官网电话
  • 重庆新电子税务局入口
  • 20 百望九赋税控盘管理员默认指令多少?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设