当前位置: 首页 > news >正文

网站如何做宣传网站建设讠金手指科杰

网站如何做宣传,网站建设讠金手指科杰,西安市住房和城乡建设局网站,做游戏直播什么游戏视频网站#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在#xff0c;OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成#xff0c;在此基础之上#xff0c;才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成在此基础之上才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式从之前的立即渲染模式开始转向核心模式从而大幅提升显示性能。下图就是通过VBO、VAO和EBO应用画出的一个矩形矩形虽然简单但它的意义却不凡。 2、立即渲染模式 OpenGL的绘图的函数模式很多比如绘制点的模式GL_POINTS、直线GL_LINES 、三角形GL_TRAINGLES、四边形GL_QUADS等等。OpenGL的绘图必须在glBegin()和glEnd()函数之间完成这种方式使我们简单、直观的进行了基本几何绘图函数。像下面这个绘制三角形的操作 //绘画一个三角形glBegin( GL_TRIANGLES );glVertex3f(-1.0f,-0.5f,-2.0f);glVertex3f( 1.0f,-0.5f,-2.0f);glVertex3f( 0.0f,0.5f,-2.0f);glEnd();客观的说这种绘图方式最主要的特点就是看起来比较简单容易理解就是我们所说的立即显示模式。但是这种方式也有缺点就是画图形的显示效率较低。原因是在于glVertex函数每次调用只把一个顶点坐标数据从客户端CPU或内存传输到显示处理设备GPU)而这个传输的过程相对于GPU处理数据的过程是很慢的。如果显示的图形数量不多的情况下不会出现问题但后期随着绘制图形的越来越复杂位置的图形数量越来越多需要使用的glVertex函数的调用次数就会越来越多这将直接导致传统的立即显示模式执行效率有所下降。 3、什么是GPU和显存 首先我们需要了解一下GPU和显存的基本概念。GPU全称图形处理器Graphics Processing Unit是一种专门用于处理图像和视频信息的微处理器。它拥有强大的并行处理能力可以高效地执行复杂的图形渲染任务GPU是显卡的核心部件。显存也就是显卡里的内存。显卡的GPU访问显存比访问内存CPU里的内存区域要快很多。而且显卡做渲染运算一般都是访问显存的数据再对数据进行运算并把运算结果保存在显存中。所以一般我们为了提示游戏性能需要先把数据先从内存一次性传输到显存中去后期由GPU对显存中数据进行显示和渲染。 4、核心模式下图形渲染方式 了解以上铺垫知识了以后我们就明白此后我们将尽可能少在使用立即显示模式去显示图形。当我们使用OpenGL绘制图形时需要将顶点的位置、颜色等信息传递给显卡让显卡进行绘制为了提高效率我们需要把数据先从内存一次性传输到显存中去后期由GPU对显存中数据进行显示和渲染。该操作主要包括以下内容 VBOVertex Buffer Object是用来存储这些顶点数据的特殊缓冲区可以将数据保存在显卡中避免频繁地从CPU传输数 据到显卡提高绘制效率。 VAOVertex Array Object则是用来管理这些顶点数据的设置的。绘制一个图形通常需要多个顶点属性比如位置、颜色等VAO帮助我们预先指定这些属性在VBO中的排列方式避免在每次绘制时重新设置属性简化绘制代码。 EBOElement Buffer Object是用来存储图元的索引数据的缓冲区比如三角形的三个顶点索引。它可以帮助我们避免重复存储顶点数据只需存储少量的索引数据就可以描述复杂的图形提高绘制效率。 综合来说VBO、VAO和EBO是帮助我们优化OpenGL绘制图形的工具。它们的组合可以让我们更高效地绘制图形让图形的渲染速度更快性能更好。也就是说从现在开始我们开始去了解GPU的操作相关知识这才是游戏设计的灵魂所在。 5、VBO(Vertex Buffer Object)顶点缓冲对象 VBO(Vertex Buffer Object)顶点缓冲对象是在显卡存储空间中开辟出的一块内存缓存区用于存储顶点的各类属性信息如顶点坐标顶点法向量顶点颜色数据等。在渲染时可以直接从VBO中取出顶点的各类属性数据由于VBO在显存而不是在内存中不需要从CPU传输数据处理效率更高。所以可以理解为VBO就是显存中的一个存储区域可以保持大量的顶点属性信息。并且可以开辟很多个VBO每个VBO在OpenGL中有它的唯一标识ID这个ID对应着具体的VBO的显存地址通过这个ID可以对特定的VBO内的数据进行存取操作。比如我们有以下三个顶点数据信息 //自定义顶点float vertices[] {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f};以上三个顶点我们是通过数组保持的后期发送到顶点缓冲区也会是连续顶点的存储模式每一个点VERTEX的位置坐标数据包含xyz三个分量每个点位置信息存储占用为12个字节。这些点位置信息之间没有空隙或其他值在数组中紧密排列。如下图 当然数据信息也可能包含了颜色和纹理坐标信息 顶点缓冲对象VBO就像OpenGL中的其它对象一样这个缓冲有一个独一无二的ID所以我们可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象。随后glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数。它的第一个参数是目标缓冲的类型当前绑定到GL_ARRAY_BUFFER目标上的顶点缓冲对象。第二个参数指定传输数据的大小(以字节为单位)用一个简单的sizeof计算出顶点数据大小就行。第三个参数是我们希望发送的实际数据。 //生成VBO对象缓冲ID为VBOunsigned int VBO;//使用元素缓冲对象EBOglGenBuffers(1, EBO); //第一个就是缓冲对象的类型第二个参数就是要绑定的缓冲对象的名称glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//数据传入缓冲内存中GL_STATIC_DRAW数据不会或几乎不会改变 GL_DYNAMIC_DRAW数据会被改变很多glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//设置完属性解绑VBO glBindBuffer(GL_ARRAY_BUFFER, 0);VBO是CPU和GPU传递信息的桥梁我们把数据存入VBO是在CPU上操作VBO会自动将数据送至GPU。送至GPU不需要任何人为操作。关于VBO另外补充解释使用VBO管理内存(GPU上储存顶点数据)使用VBO好处就是将内存一次性发送大批数据到显卡而不是每次发送一个顶点数据。从CPU把这些数据发送到显卡相对较慢所以只要可能就尝试尽量一次性尽可能多的数据。发送到显卡的内存后顶点着色器几乎能立即访问顶点过程比较快。 Buffer Object就是由OpenGL维护的一块显存区域。比如说在一块显存为2G的显卡里分配了128K大小的内存区域给OpenGL使用这个128K大小的内存区域就叫一个Buffer Object。 我们已经把顶点数据发送给了GPU但OpenGL还不知道它该如何解释内存中的顶点数据。也就是说GPU内的这块显存区域里是紧密连续的一个个数据OpenGL并不知道从哪里到哪里是一个顶点的数据从哪里到哪里是这个顶点的RGB值如果有的话因此要显示这些顶点我们还需要顶点数组对象(Vertex Array Object, VAO)配合使用。同时我们也该告诉OpenGL该如何将顶点数据链接到顶点着色器的属性上着色器部分我们下节课在详细描述。 VBO是顶点缓冲对象是CPU和GPU中间的桥梁开发者只需要将数据存入VBO中VBO自动将数据送入GPU中。而VBO传输的只是一堆数字GPU怎么解释这些顶点数据就需要VAO来解释。 6、VAO(Vertex Array Object)顶点数组对象 VAO(Vertex Array Object)顶点数组对象可以像顶点缓冲对象那样被绑定任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是当配置顶点属性指针时你只需要将那些调用执行一次刚刚设置的所有状态顶点坐标属性、颜色属性、纹理坐标属性等都将同时绑定并存储在一个VAO中之后再绘制物体的时候只需要绑定相应的VAO就行了。这使在不同顶点数据和属性配置之间切换变得非常简单只需要绑定不同的VAO就行了。 //生成VAOglGenVertexArrays(1, VAO);//绑定VAO从绑定之后起我们应该绑定和配置对应的VBO和属性指针之后解绑VAO供之后使用glBindVertexArray(VAO);//第一个参数GLsizei是要生成的缓冲对象的数量第二个GLuint是要输入用来存储缓冲对象名称的数组glGenBuffers(1, VBO);//绑定到目标对象VBO变成了一个顶点缓冲类型第一个就是缓冲对象的类型第二个参数就是要绑定的缓冲对象的名称glBindBuffer(GL_ARRAY_BUFFER, VBO);//数据传入缓冲内存中GL_STATIC_DRAW数据不会或几乎不会改变 GL_DYNAMIC_DRAW数据会被改变很多glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//启用顶点属性layout(location 0)顶点属性默认是禁用的。供着色器使用着色器操作下节课详细介绍glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//设置完属性解绑VBO glBindBuffer(GL_ARRAY_BUFFER, 0);//配置完VBO及其属性解绑VAO后期显示图元的时候再次绑定VAO glBindVertexArray(0);在 OpenGL 中使用顶点数组对象VAO可以方便地管理顶点属性的状态。绑定 VAO、设置顶点属性、然后解绑 VAO 的顺序是为了确保顶点属性的设置被正确地记录在 VAO 中从而简化渲染代码并提高效率。OpenGL的核心模式要求我们使用VAO所以它知道该如何处理我们的顶点输入。以下就是通过VAO显示对应VBO中三角形的方法 //绑定VAOglBindVertexArray(VAO);//从VAO中读取数据画出三角形glDrawArrays(GL_TRIANGLES, 0, 3);//使用完毕后解绑VAOglBindVertexArray(0);如果你像我这样成功绘制出了这个三角形或矩形那么恭喜你你成功地通过了现代OpenGL入门的拦路虎之一绘制你自己的第一个三角形或矩形因为这些操作确实很抽象。当然我们这里暂时没有使用着色器下节课我们会详细介绍着色器内容。如果我们绑定VAO失败OpenGL会拒绝绘制任何东西。 7、EBO(Element Buffer Object)元素缓冲对象 EBO(Element Buffer Object)元素缓冲对象,也叫索引缓冲对象(Index Buffer ObjectIBO)。要解释元素缓冲对象的工作方式最好还是举个例子假设我们不再绘制一个三角形而是绘制一个矩形。我们可以绘制两个三角形来组成一个矩形OpenGL主要处理三角形。这会生成下面的顶点的集合 GLfloat vertices[] {// 第一个三角形0.5f, 0.5f, 0.0f, // 右上角0.5f, -0.5f, 0.0f, // 右下角-0.5f, 0.5f, 0.0f, // 左上角// 第二个三角形0.5f, -0.5f, 0.0f, // 右下角-0.5f, -0.5f, 0.0f, // 左下角-0.5f, 0.5f, 0.0f // 左上角};可以看到有几个顶点叠加了。我们指定了右下角和左上角两次一个矩形只有4个点而不是6个顶点这样就产生50%的额外开销。当我们有包括上千个三角形的模型之后这个问题会更糟糕这会产生一大堆浪费。更好的解决方案是只储存不同的顶点并设定绘制这些顶点的顺序。这样子我们只要储存4个顶点就能绘制矩形了之后只要指定绘制的顺序就行了。首先我们先要定义不重复的顶点和绘制出矩形所需的索引 GLfloat vertices[] {0.5f, 0.5f, 0.0f, // 右上角0.5f, -0.5f, 0.0f, // 右下角-0.5f, -0.5f, 0.0f, // 左下角-0.5f, 0.5f, 0.0f // 左上角};GLuint indices[] { 0, 1, 3, // 第一个三角形注意索引从0开始1, 2, 3 // 第二个三角形注意索引从0开始};创建元素缓冲对象与VBO类似我们先绑定EBO然后用glBufferData把索引复制到缓冲里。同样EBO的使用和VBO类似我们会把这些EBO的相关操作放在VAO绑定和VAO解绑操作调用之间只不过这次我们把缓冲的类型由VBO的GL_ARRAY_BUFFER改变成为GL_ELEMENT_ARRAY_BUFFER。 //使用元素缓冲对象EBOglGenBuffers(1, EBO); //第一个就是缓冲对象的类型第二个参数就是要绑定的缓冲对象的名称glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//数据传入缓冲内存中GL_STATIC_DRAW数据不会或几乎不会改变 GL_DYNAMIC_DRAW数据会被改变很多glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);最后一件要做的事是用glDrawElements来替换glDrawArrays函数表示我们要从索引缓冲区渲染三角形。使用glDrawElements时我们会使用当前绑定的索引缓冲对象中的索引进行绘制 //绑定VAOglBindVertexArray(VAO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glDrawElements(GL_TRIANGLES,sizeof(indices),GL_UNSIGNED_INT,0);//使用完毕后解绑VAOglBindVertexArray(0);这部分操作很难因为在绘制第一个三角形之前你需要了解很多知识。幸运的是我们现在已经越过了这个障碍接下来的教程会比较容易理解一些。 8、绑定和解绑顺序 我们通常绑定和解绑有一定的顺序创建顺序VAO-VBO-EBO 解绑顺序VAO-VBO-EBO。需要注意的是当VAO处于活动状态时不能解绑EBO 因为绑定的元素缓冲区对象存储在VAO中。其实VAO每次使用都需要调用glBindVertexArray它会直接解绑旧的对象并且绑定一个新的因此通常情况下我们不需要通过调用 glBindVertexArray(0) 来解绑VAO当然VBO也是这样。所以在使用中无需过度在意是否解绑了VAO和VBO通常是不需要解绑的。 9、核心模式渲染实例 我们以上讲解了和核心模式下VBO、VAO和EBO的相关知识所举得实例相对较为分散那么我们现在就接合以上三部分知识完成个简单的综合实例生成一个矩形直观的感受一下核心模式渲染实例。 //自定义VAO对象缓冲ID为VAO当然这里VAO就是一个变量名名字可以自己随便起比如VaoExample等等unsigned int VAO;//自定义VBO对象缓冲ID为VBOunsigned int VBO;//自定义VBO对象缓冲ID为VBOunsigned int EBO;自定义顶点数据 //定义顶点对象float vertices[] {//位置信息 //颜色信息 -5.0f, 0.0f, 6.0f, 1.0f,0.0f,0.0f, 5.0f, 0.0f, 6.0f, 0.0f,1.0f,0.0f, 5.0f, 10.0f, 6.0f, 0.0f,0.0f,1.0f, -5.0f, 10.0f, 6.0f, 1.0f,1.0f,1.0f };unsigned int indices[]{0, 1, 3, // 第一个三角形注意索引从0开始1, 2, 3 // 第二个三角形注意索引从0开始};生成并绑定VAO //生成VAOglGenVertexArrays(1, VAO);//绑定VAO,从绑定之后起我们应该绑定和配置对应的VBO和属性指针之后解绑VAO供之后使用glBindVertexArray(VAO);生成并绑定VBO //第一个参数是要生成的缓冲对象的数量第二个GLuint是要输入用来存储缓冲对象名称的数组glGenBuffers(1, VBO);//绑定到目标对象第一个就是缓冲对象的类型第二个参数就是要绑定的缓冲对象的名称glBindBuffer(GL_ARRAY_BUFFER, VBO);//数据传入缓冲内存中GL_STATIC_DRAW数据不会或几乎不会改变 GL_DYNAMIC_DRAW数据会被改变很多glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);生成并绑定EBO //使用元素缓冲对象EBOglGenBuffers(1, EBO); //第一个就是缓冲对象的类型第二个参数就是要绑定的缓冲对象的名称glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//数据传入缓冲内存中GL_STATIC_DRAW数据不会或几乎不会改变 GL_DYNAMIC_DRAW数据会被改变很多glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);这里是着色器相关设置下节课详细讲解着色器 //启用顶点属性layout(location 0)顶点属性默认是禁用的。供着色器使用下节课详细讲解着色器glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);//启用顶点属性layout(location 1)顶点属性默认是禁用的。供着色器使用下节课详细讲解着色器glEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));使用完毕后解绑相关对象 //配置完VBO及其属性后解绑VAO后期显示图元的时候再次绑定VAO glBindVertexArray(0);//设置完属性解绑VBO glBindBuffer(GL_ARRAY_BUFFER, 0);显示图像需要先绑定VAO //使用着色器下节课详细介绍着色器//glUseProgram(shaderProgram);//绑定VAOglBindVertexArray(VAO); //不使用EBO方式绘制三角形起始索引0绘制顶点数量3//glDrawArrays(GL_TRIANGLES,0,3);//使用EBO方式绘制三角形共绘制6个顶点glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);//解绑VAOglBindVertexArray(0); //不在使用着色器下节课详细介绍着色器//glUseProgram(0);通过以上过程我们应该能够在三维空间中显示一个四边形但是你会发现它并没有颜色主要时由于本节课为了简化我们暂未使用着色器去处理颜色信息待下节课结合着色器进行学习后就能显示四边形正常的颜色了。 10、总结 在介绍VBO、VAO和EBO三个要素时大家有可能觉得很迷茫很多教程中并没有说明为什么要由立即渲染模式转变为核心模式搞不明白我们为什么原来用的好好的显示函数我们为什么突然又要讲这VBO、VAO和EBO这三个全新的东西本节课我就接合学习过程中的一些感触简单解释了一下这个问题希望能对您有所帮助。但也值得庆幸的是特别是我们在随后的游戏设计时已经开始慢慢从CPU接触到了GPU游戏的意义从这里才开了一个新的纪元。而且在我们下节课讲到着色器时会更加体会到OpenGL3.2之后3D世界重大变革的方向开发者在VBO、VAO和EBO结合着色器的核心模式下进行开发程序设计自由度更高游戏设计的魅力又增加了许多。 【上一节】C和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解 【下一节】C和OpenGL实现3D游戏编程【连载14】——着色器初步
http://www.hkea.cn/news/14536300/

相关文章:

  • 四川省住房与城乡建设厅网站管网兴山县铁路建设协调指挥部网站
  • 招聘网站源码下载做网站seo的公司
  • 旅游网站建设方案两百字免费建立手机网站
  • ps个人网站首页怎么制作网页设计的流程是什么
  • 中企动力成都分公司网站建设案例动画片是怎么制作出来的
  • 百家号和网站同步做有些网站仿出问题
  • 浙江省住房城乡建设厅官方网站做企业网站设计手机站
  • 郑州网站制作-中国互联怎么才能有自己的网站
  • .net做网站教程全国做临期进口食品的网站
  • html旅游网站模板软件企业网站建设栏目结构图
  • 长春企业网站建设高校后勤网站建设
  • 抚顺网站建设费用公众平台账号授权怎么弄
  • 网站自己做需要多少钱网站做到赣州第一名要多少钱
  • 沈阳求做商城 网站网上推广赚钱项目
  • 建设网站产品图片显示不全保险行业网站建设
  • 张槎九江网站建设兼职设计师在哪里接活
  • 郑州的网站建设公司哪家好成都公司做网站的
  • 网站开发协议书 英文版手机网站吧
  • 网站上线注意问题德阳企业网站建设
  • 厦门建站最新消息阿里巴巴电脑版
  • 专业维护网站的公司wordpress feed源
  • 手机网站开发环境搭建福州网站建设金森
  • 广州网站排名优化服务湖南有实力的关键词优化
  • 通辽网站建设招聘做介绍的英文网站
  • 住房和城乡建设部注册中心网站网站建设推广实训总结
  • 化妆品网站的建设 论文北京seo课程
  • 网站微信登录怎么做的电商入门基础知识
  • 泰州网站模板wordpress固定链接目录
  • 长沙做网站设计公司网站设计制作培训
  • 怎么建立博客网站电子购物网站建设目的