OpenGL 使用合批优化渲染 Draw Call 过程~~.docx





《OpenGL 使用合批优化渲染 Draw Call 过程~~.docx》由会员分享,可在线阅读,更多相关《OpenGL 使用合批优化渲染 Draw Call 过程~~.docx(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、OpenGL使用合批优化渲染DrawCall过程什么是DrawCall在渲染物体之前物体模型顶点数据保存在内存中CPU通过向GPU发送渲染指令后数据会复制到显存中然后进展渲染。在这个经过中CPU向GPU发送渲染指令的经过名为DrawCall。OpenGL中的渲染指令是指glDrawArrays(GL_TRIANGLES,0,amount_of_vertices);函数什么是批处理当我们在渲染一个场景时该场景中包含非常多的简单模型比方星星草等这些模型的顶点数据极少但是每次单独渲染一个简单模型时都会调用一次DrawCall渲染的速度很快。但是发送指令的经过是很慢的CPU告诉GPU该从哪个缓冲读取数
2、据从哪寻找顶点属性而且这些都是在相对缓慢的CPU到GPU总线(CPUtoGPUBus)上进展的这就会使渲染整个场景的速度变得非常慢传统的方案就是for(unsignedintiiamount_of_models_to_draw;i)DoSomePreparations();/绑定VAO绑定纹理设置uniform等glDrawArrays(GL_TRIANGLES,0,amount_of_vertices);但假如我们能将这些星星或草一次性全部发给GPU去渲染速度就会非常快这就是批处理。批处理能节省DrawCall的数量极大提升渲染速度因此在Unity中批处理的作用非常大使用批处理使用批处理的前
3、提是多个物体使用同一个shader做渲染在Unity中就是指使用一样的材质球。在OpenGL中使用批处理只需要将glDrawArrays以及glDrawElements的渲染调用分别改为glDrawArraysInstanced以及glDrawElementsInstanced就可以了。这些渲染函数的实例化版本需要一个额外的参数叫做实例数量(InstanceCount)这个函数本身并没有什么用。渲染同一个物体一千次对我们并没有什么用途每个物体都是完全一样的而且还在同一个位置。我们只能看见一个物体出于这个原因GLSL在顶点着色器中嵌入了另一个内建变量gl_InstanceID。在使用实例化渲染调
4、用时gl_InstanceID会从0开场在每个实例被渲染时递增1。比方讲我们正在渲染第43个实例那么顶点着色器中它的gl_InstanceID将会是42。因为每个实例都有唯一的ID我们可以建立一个数组将ID与位置值对应起来将每个实例放置在世界的不同位置。使用gl_InstanceID对多个物体做偏移处理物体顶点数据floatquadVertices/位置/颜色-0.05f,0.05f,1.0f,0.0f,0.0f,0.05f,-0.05f,0.0f,1.0f,0.0f,-0.05f,-0.05f,0.0f,0.0f,1.0f,-0.05f,0.05f,1.0f,0.0f,0.0f,0.05f,
5、-0.05f,0.0f,1.0f,0.0f,0.05f,0.05f,0.0f,1.0f,1.0f;顶点着色器#version330corelayout(location0)invec2aPos;layout(location1)invec3aColor;outvec3fColor;uniformvec2offsets100;voidmain()vec2offsetoffsetsgl_InstanceID;gl_Positionvec4(aPosoffset,0.0,1.0);fColoraColor;片元着色器#version330coreoutvec4FragColor;invec3fCol
6、or;voidmain()FragColorvec4(fColor,1.0);绘制glBindVertexArray(quadVAO);/绘制100个一样的图形glDrawArraysInstanced(GL_TRIANGLES,0,6,100);实例测试顶点着色器#version330corelayout(location0)invec2aPos;layout(location1)invec3aColor;layout(location2)invec2aOffset;outvec3fColor;voidmain()fColoraColor;gl_Positionvec4(aPosaOffse
7、t,0.0,1.0);片元着色器#version330coreoutvec4FragColor;invec3fColor;voidmain()FragColorvec4(fColor,1.0);运行源码#includeglad/glad.h#includeGLFW/glfw3.h#includeshader.h#includeiostreamvoidframebuffer_size_callback(GLFWwindow*window,intwidth,intheight);/settingsconstunsignedintSCR_WIDTH1280;constunsignedintSCR_H
8、EIGHT720;intmain()/glfw:initializeandconfigure/-glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);/glfwwindowcreation/-GLFWwindow*windowglfwCreateWindow(SCR_WIDTH,SCR_HEIGHT,LearnOpenGL,NU
9、LL,NULL);if(windowNULL)std:coutFailedtocreateGLFWwindowstd:endl;glfwTerminate();return-1;glfwMakeContextCurrent(window);/glad:loadallOpenGLfunctionpointers/-if(!gladLoadGLLoader(GLADloadproc)glfwGetProcAddress)std:coutFailedtoinitializeGLADstd:endl;return-1;/configureglobalopenglstate/-glEnable(GL_D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 使用合批优化渲染 Draw Call 过程 使用 优化 渲染 过程

限制150内