位置: 编程技术 - 正文

Tutorial2 Hello dot!

编辑:rootadmin

推荐整理分享Tutorial2 Hello dot!,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

本文源自: dotbackgroundSource walkthru

Hello dot!background

这是我们第一次遇到GLEW,OpenGL的扩展库。GLEW帮助你解决管理OpenGL扩展上伴随而至的一些头痛的问题。一旦(GLEW)初始化,它将查询你所在平台所有可用的扩展并动态的载入,通过调用一个头文件便能够提供访问。 在这个教程中我们将第一次见识到顶点缓冲对象(VBOs)的用法。正如名字所暗示的一样,它们被用作保存一些顶点。那些你想使之可视化的3D世界物体,比如:怪物,城堡或者一个简单的旋转立方体,它们通常由一组顶点互相连接所构成。VBOs就是把顶点载入GPU的最有效的方式。它们是显存里面的缓冲区,并能够用最短的时间访问GPU,所以受到很大地推荐。

在所有教程中,只有这一个和下一个教程是依靠固定管线,而不是可编程管线。事实上,这两个教程均没有发生任何变换。我们简单使用数据穿梭于管线中的方式。下一个教程中会深入的学习管线,但是光栅化(在屏幕坐标系里面绘制一些点、线和三角形)之前,我们很容易理解,每个需要显示的顶点有X,Y,Z三个坐标分量,他们的取值是在[-1.0,1.0]区间里。光栅能够把这些坐标映射到屏幕空间里面(比如,如果屏幕的宽度是,那么X坐标为-1.0时会映射到0,1。0则会被映射到)。最后,光栅器会按照在绘制调用的拓扑顺序,逐个画出绘制调用中的图元。由于我们并没有为管线关联着色器,所以我们的顶点并没有发生任何变换。这就意味着我们只需要给予顶点在这个范围内的取值,这样就可以显示出来。事实上,当X和Y都为0的时候正好是这两个坐标轴的中间,换句话来说就是屏幕的中央。

GLEW的安装:GLEW可以从他的主页 walkthru

这里我们GLEW的头文件包含进去。如果你包含了其他的OpenGL的头文件,那你必须要在需要再他们之前包含这个头文件,否则GLEW会出错。另外你需要把“-lGLEW”加入makefile文件中以保证程序能够链接成功。

在我们的教程里,我们开始使用一些实用性的数据结构比如向量vector。在后面我们会更深入探索这个头文件。

在这里,我们初始化了GLEW并检查是否出现了其他问题。需要注意的是这个步骤必须在GLUT初始化后去完成。

我们创建了一个Vector3f结构体(这个类型是再math_3d.h头文件中定义的),并把XYZ都初始化为零。这个数据会让一个点显示在屏幕的正中央。

我们在程序的全局部分配了一个GLuint的变量,这个变量储存顶点缓冲对象的句柄。而在后面你会发现,大多数OpengGL的对象的访问需要调用一些GLuint类型对象。

Tutorial2 Hello dot!

OpenGL定义了一系列用于产生不同类型对象glGen*的函数。他们经常拥有两个参数-第一个指定了需要产生多少个对象,另一个则是用于存取驱动为你分配的句柄的数组的地址(你要保证数组要足够长以满足你的请求)。在后面调用这个函数并不会产生相同的对象,除非你先用glDeleteBuffers函数先删除他们。需要注意的是,你并没有指明你在缓冲区(buffer)上的意图,所以他们会被认作是“通用的(generic)”。而这个正是下个函数所做的事情。

OpenGL用有一个相当特殊的使用句柄的方式。在大多数的APIs中,句柄是直接传入相关函数中,并直接作用于句柄上。在OpenGL中我们直接把句柄与target绑定在一块,然后直接在目标上处理命令。这些命令会一直影响这个绑定过的句柄,直到用另一个句柄或者是一个空句柄代替前一个绑定。Target GL_ARRAY_BUFFER意味着缓冲区会包含一个顶点数组。另一个实用的target是GL_ELEMENT_ARRAY_BUFFER,它意味着缓冲区包含这另一个顶点缓冲区的顶点索引。其他的Target同样是可用的,我们会再后面的教程中看到他们。

在绑定了我们的对象后,我们需要位置填充数据。上面的调用传入了target的名字(和我们用于绑定所使用过的一致)、顶点数组的地址和一个用于表明数据的使用模式的标志。因为我们并不打算直接修改缓冲区的内容所以我们指定了GL_STATIC_DRAW。与之相反的是GL_DYNAMIC_DRAW。尽管这些标志对于OpenGL来说只是很小的变动,但使用确切的标志不失为一件好的事情。驱动可以通过这个标志做一些启发性优化(比如在内存中找到最好的位置储存缓冲区)

在着色器的教程中,你会发现着色器所使用的顶点属性(位置,法线等等)都有一个映射索引,这个索引可以把在你C/C++程序中的数据与相应着色器中的属性名绑定在一起。此外你必须开启每一个顶点属性索引。在这个教程里我们并没有使用任何一个着色器,但是在固定管线中(在没有绑定任何一个着色器的时候会被激活),我们载入进缓冲区的顶点位置的顶点属性索引会被设置为0。你必须开启每一个顶点属性索引,否则数据不会被渲染管线所访问。

这里,我们再次为绘制调用绑定我们的缓冲区。在这个小的程序里面,我们只有一个顶点缓冲区所以在每一个帧里面调用这个命令是多余的。但是再更复杂的程序里面,他们包含了各种各样的缓冲区去储存你各式各样的模型,这样你就必须根据需求实时更新渲染管线中的状态。

这个调用告诉渲染管线如何阐述再缓冲区里面的数据。第一个参数指定了属性的索引。在我们的例子中,我们使用0作为索引的默认值,但当我们使用着色器的时候我们既需要明确的设置在着色器中的索引,也需要查询这个索引。第二个参数在属性的组件内部的数目(3 代表x y 和z)。第三个参数就是每个组件的数据类型。下一个参数这暗示了我们是否需要我们的属性在渲染管线使用前进行标准化。显然,再我们不想让我们传入的数据作任何变化。第五个参数(称作“幅度”),它代表缓冲区中两个属性点的字节数。由于只有一个属性(比如缓冲区仅仅包含了顶点位置),那么数据是紧密相连的的我们便传入0.如果我们有一个结构体的数组,这个结构体包含了位置和法线(他们均为一个向量既3个浮点型),我们需要传入结构体的比特单位的大小(6*4=)。最后一个参数在前面的例子中相当地实用。我们需要指定渲染管线所找到的属性结构体的偏移值。在这种位置和法线的结构体的情况下,位置的偏移量是0,法线的偏移量则为。

最后,我们终于使用了绘制几何图元调用。我们看到的所有在绘制命令之前的命令都是至关重要的。这才是GPU真正开始工作的地方。在已经搭建好的状态上,它将综合绘图调用的一系列参数,并把结果渲染到屏幕上面。

OpenGL提供了多种类型的绘制调用,每一个调用适用于不同的状态下。通常情况下,你可以把他们划归为两类——顺序性绘制和索引性绘制。顺序性绘制更简单一点。GPU会逐个遍历你的顶点缓冲中的顶点,并根据指定在绘制调用中的拓扑顺序去解释。比如,如果你指定了GL_TRIANGLES那么0-2的顶点会成为第一个三角形,3-5第二个,等等。如果你想让同样的顶点显示在不止一个三角形中,你需要两次在顶点缓冲中指定,这样是及其浪费空间的。

索引绘制就更复杂了,包含了一个称作索引缓冲的缓冲区。索引缓冲包含了在顶点缓冲区中顶点的索引。GPU会以类似索引0-2可以成为第一个三角形这种方式和其他的方式来扫描索引缓冲区。如果你想要再两个三角形使用同一个顶点,那么你只需要在索引缓冲区中指定两次。而顶点缓冲区则需要一份拷贝。索引绘制再游戏中更常见一些,因为大多数的模型由一系列可以代表表面(人的皮肤,堡垒城墙,等等)的三角形产生,他们之间会共用许多顶点。

在这个教程中我们使用了那个到了最简单的绘制调用——glDrawArrays。这是一个顺序性的绘制所以它没有使用到索引缓冲。我们指定了以点作为拓扑顺序,这就意味着每个顶点就是一个点。下一个参数便是我们第一个要绘制顶点的索引。在我们的例子中,我们想要再缓冲区的开始部分进行绘制,所以我们指定了0,但是这个可以让我们能够再一个缓冲区中存储多个模型,然后选择其中一个并指定它在缓冲区的偏移值。最后一个参数是要绘制顶点的数目。

在不立即使用顶点属性的时候,关闭这些顶点属性是一种相当良好的习惯。在着色器不使用这些顶点属性的时候,让它们处于开启状态无疑是自讨麻烦。

opengl 绘制绕远点转的飞机 1、绘制飞机方法draw_plane()voiddraw_plane(){floatscale=1.0f;glLineWidth(6.0f);glColor3f(1.0,0.0,1.0);glPushMatrix();glScaled(0.f*scale,0.f*scale,0.f*scale);glPushMatrix();glRotated(.0f,

opengl 4.X off-screen rendering openGL可以渲染屏幕的framebuffer,自然可以渲染不直接显示的framebuffer,把数据存入非直接显示的framebuffer中以便后续的渲染需求,或者直接存入纹理贴图te

GLSL 卡通shader 浏览Geeks3D,发现一个好玩儿的shader,改了个gles版本,用cocos2dx在iphone上跑了一下,效果如图:原文shader是gl版,在手机上跑的很慢,iphone5全屏处理情况

标签: Tutorial2 Hello dot!

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

上一篇:对Android opengl ES世界坐标系和纹理坐标系的理解(安卓opengl es)

下一篇:opengl 绘制绕远点转的飞机(opengl画曲线)

  • 金税盘抵减增值税的账务处理
  • 电子设备租赁费专票税率
  • 个税要计提吗?
  • 城建税及教育费附加怎么计算
  • 实缴时间不能超过申请时间怎么办
  • 出口退税进项税
  • 红冲去年暂估的费用怎么做账
  • 增值税附表一填错了,主表没错可以不更正不
  • 电子发票会自动发送到邮箱吗
  • 残保金每次缴纳都是一样的吗
  • 企业工商注销啥意思
  • 酒店收取的赔偿费是什么
  • 政府购买服务合同最多签几年
  • 结算业务申请书和转账支票区别
  • 私营独资企业可以变更法人吗
  • 债务重组的会计处理方法
  • 企业所得税季报时间
  • 公司承揽员工租房个税如何入账?
  • 建筑服务 1%
  • 企业为员工提供住宿会计科目
  • 生产性生物资产折旧年限
  • 现金比率在多少比较合适
  • 小规模农产品可以抵扣吗
  • 已收发票是什么意思
  • 计提折旧会计分录的借方不可能是
  • 新版关闭edge地址栏建议
  • win11如何修改任务栏颜色
  • 跨年会计科目用什么软件
  • hue环境搭建
  • nginx加php
  • 分支机构分摊税款的计算
  • 出口零退税率商品目录
  • php aes
  • php访问数据库的一般步骤
  • php和mysql关系
  • 过年回家的你
  • 缴纳残保金会计分录最新
  • 外经证还有几天到期延期需要的资料
  • 货款收不回来了怎么做账
  • 公司在银行买的理财产品怎么做账
  • 交通运输发票票样
  • python中模块的概念
  • MYSQL explain 执行计划
  • 固定资产折旧费计入成本吗
  • 原材料用于加工什么
  • 城建税的减免规定有哪些
  • 保险公司的奖励制度
  • 固定资产后续计量包括哪些内容
  • 开出银行承兑汇票
  • 资金周转率计算公式
  • 现金流量表是指现金还是银行存款
  • 公司收到股东的投资款以后怎么处理
  • 取得工程款发票计入什么会计科目里
  • 包含个人社保的保险
  • 公司财务部门工作职责
  • mysql第五章上机
  • Fedora 21顶栏日期显示不全的解决方法
  • win7 win8.1双系统安装教程
  • win8创建新用户
  • unix系统的最大特点
  • 怎么用uefi装win7
  • RunClubSanDisk.exe是什么程序? 闪迪U盘广告推介程序
  • win7系统怎么备份文件
  • windows 10的屏幕键盘快捷键在哪里
  • windows7修改注册表
  • windows102021年更新
  • linux lvm2_member
  • linux安装glibc.i686
  • windows10 正式版
  • 如何选择适合你的颂钵
  • nodejs初始化
  • android线程间通信的几种方法
  • 给自己的网站制作软件
  • linux实现shell
  • great 搬运工
  • 西安大修基金和契税怎么计算
  • 国税发票查询能查出什么项目
  • 中国地税国税
  • 要深化税收制度改革健全
  • 消费税记不记入成本
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设