位置: 编程技术 - 正文
推荐整理分享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类型对象。
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全屏处理情况
友情链接: 武汉网站建设