[{"data":1,"prerenderedAt":310},["ShallowReactive",2],{"page-\u002Fcpp\u002Fopengel\u002F核心模式和立即渲染模式":3},{"id":4,"title":5,"body":6,"description":302,"extension":303,"meta":304,"navigation":305,"path":306,"seo":307,"stem":308,"__hash__":309},"content\u002Fcpp\u002Fopengel\u002F核心模式和立即渲染模式.md","核心模式和立即渲染模式",{"type":7,"value":8,"toc":294},"minimark",[9,38,43,213,217,227],[10,11,12,13,17,18,21,22,25,26,29,30,33,34,37],"p",{},"​\t早期的OpenGL使用",[14,15,16],"strong",{},"立即渲染模式（Immediate mode，也就是固定渲染管线）","，这个模式下绘制图形很方便。OpenGL的大多数功能都",[14,19,20],{},"被库隐藏起来","，开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移，规范越来越灵活，开发者对绘图细节有了更多的掌控。",[14,23,24],{},"立即渲染模式确实容易使用和理解","，但是效率太低。",[14,27,28],{},"因此从OpenGL3.2开始，规范文档开始废弃立即渲染模式","，并鼓励",[14,31,32],{},"开发者在OpenGL的核心模式(Core-profile)下进行开发","，这个",[14,35,36],{},"分支的规范完全移除了旧的特性","。",[39,40,42],"h2",{"id":41},"核心模式core-profile与立即渲染模式immediate-mode的区别","核心模式（Core Profile）与立即渲染模式（Immediate Mode）的区别",[44,45,46,62],"table",{},[47,48,49],"thead",{},[50,51,52,56,59],"tr",{},[53,54,55],"th",{},"特性",[53,57,58],{},"核心模式 (Core Profile)",[53,60,61],{},"立即渲染模式 (Immediate Mode)",[63,64,65,85,104,129,162,181],"tbody",{},[50,66,67,73,79],{},[68,69,70],"td",{},[14,71,72],{},"编程模型",[68,74,75,78],{},[14,76,77],{},"面向数据（Data-Oriented）","：先准备数据，后发送指令。",[68,80,81,84],{},[14,82,83],{},"面向过程（Procedural）","：一边发送数据，一边发送指令。",[50,86,87,92,98],{},[68,88,89],{},[14,90,91],{},"性能",[68,93,94,97],{},[14,95,96],{},"极高。"," 数据预处理和批处理能力强。",[68,99,100,103],{},[14,101,102],{},"极低。"," 每次调用都会导致大量的 CPU\u002FGPU 通信。",[50,105,106,111,123],{},[68,107,108],{},[14,109,110],{},"数据组织",[68,112,113,116,117,116,120],{},[14,114,115],{},"数据必须存储在"," ",[14,118,119],{},"VBO\u002FVAO",[14,121,122],{},"（显存对象）中。",[68,124,125,126,37],{},"顶点数据在每次绘制时通过 CPU ",[14,127,128],{},"即时发送",[50,130,131,136,147],{},[68,132,133],{},[14,134,135],{},"状态管理",[68,137,138,139,142,143,146],{},"使用 ",[14,140,141],{},"可编程渲染管线","（Programmable Pipeline），所有状态（变换、光照、材质）由 ",[14,144,145],{},"Shader"," 控制。",[68,148,138,149,152,153,157,158,161],{},[14,150,151],{},"固定功能渲染管线","（Fixed-Function Pipeline），通过 ",[154,155,156],"code",{},"glMatrixMode()","、",[154,159,160],{},"glLight()"," 等 API 调用设置状态。",[50,163,164,169,175],{},[68,165,166],{},[14,167,168],{},"兼容性",[68,170,171,174],{},[14,172,173],{},"现代标准","。移除所有旧 API，是主流 GPU 架构和驱动程序的原生模式。",[68,176,177,180],{},[14,178,179],{},"已弃用","。在 OpenGL 3.1+ 版本中被移除，不支持现代 GPU 功能。",[50,182,183,188,202],{},[68,184,185],{},[14,186,187],{},"主要 API",[68,189,190,193,194,193,197,193,200,37],{},[154,191,192],{},"glGenBuffers()",", ",[154,195,196],{},"glBufferData()",[154,198,199],{},"glVertexAttribPointer()",[14,201,145],{},[68,203,204,193,207,193,210,37],{},[154,205,206],{},"glBegin()",[154,208,209],{},"glVertex()",[154,211,212],{},"glEnd()",[214,215,58],"h3",{"id":216},"核心模式-core-profile",[10,218,219,220,223,224,37],{},"​\t这是 OpenGL 的",[14,221,222],{},"现代模式","（OpenGL 3.1+ 引入，当前主流）。它彻底放弃了易用性优先的旧思想，转而拥抱",[14,225,226],{},"高性能",[228,229,230,288],"ul",{},[231,232,233,236],"li",{},[14,234,235],{},"工作方式：",[237,238,239,252,274],"ol",{},[231,240,241,244,245,248,249,37],{},[14,242,243],{},"数据准备："," 将所有顶点、颜色、法线等数据打包，一次性上传到 GPU 内存中的 ",[14,246,247],{},"VBO（顶点缓冲对象）"," 和 ",[14,250,251],{},"VAO（顶点数组对象）",[231,253,254,257,258,261,262,265,266,269,270,273],{},[14,255,256],{},"可编程管线（Shader）："," 开发者使用 ",[14,259,260],{},"GLSL","（OpenGL Shading Language）编写 ",[14,263,264],{},"着色器（Shaders）","。着色器是运行在 GPU 上的小程序，它定义了",[14,267,268],{},"顶点如何变换","（如旋转、投影）以及",[14,271,272],{},"像素如何着色","（如光照计算、纹理采样）。",[231,275,276,279,280,283,284,287],{},[14,277,278],{},"批量绘制："," 只需调用一次 ",[154,281,282],{},"glDrawArrays()"," 或 ",[154,285,286],{},"glDrawElements()","，GPU 就可以访问它自己的内存中的数据，并行地绘制成千上万的顶点。这大大减少了 CPU 的工作量。",[231,289,290,293],{},[14,291,292],{},"高性能优势："," 通过将数据和渲染逻辑（Shader）推向 GPU，核心模式极大地减少了 Draw Call 的数量和驱动程序的负担，从而释放了 CPU 资源，并充分发挥了现代 GPU 的并行处理能力。",{"title":295,"searchDepth":296,"depth":296,"links":297},"",2,[298],{"id":41,"depth":296,"text":42,"children":299},[300],{"id":216,"depth":301,"text":58},3,"​\t早期的OpenGL使用立即渲染模式（Immediate mode，也就是固定渲染管线），这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来，开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移，规范越来越灵活，开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解，但是效率太低。因此从OpenGL3.2开始，规范文档开始废弃立即渲染模式，并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发，这个分支的规范完全移除了旧的特性。","md",{},true,"\u002Fcpp\u002Fopengel\u002F核心模式和立即渲染模式",{"description":302},"cpp\u002Fopengel\u002F核心模式和立即渲染模式","b1UIaCIby7rMXh5G9Z18Jn6nlQb5X9GxCvBhoLo-MbI",1791042463638]