[{"data":1,"prerenderedAt":2889},["ShallowReactive",2],{"page-\u002Fgraphy\u002Fopengel\u002F基础":3},{"id":4,"title":5,"body":6,"description":47,"extension":2882,"meta":2883,"navigation":2884,"path":2885,"seo":2886,"stem":2887,"__hash__":2888},"content\u002Fgraphy\u002Fopengel\u002F基础.md","基础",{"type":7,"value":8,"toc":2854},"minimark",[9,13,38,41,105,108,111,122,129,140,143,146,149,195,202,361,372,375,381,396,600,663,670,676,953,956,966,999,1022,1026,1176,1219,1226,1514,1518,1621,1628,1639,1652,1663,1670,1678,1681,1797,1804,1819,1907,1916,1945,1949,2340,2364,2408,2414,2421,2654,2657,2663,2676,2850],[10,11,12],"h2",{"id":12},"扩展",[14,15,16,17,21,22,25,26,29,30,33,34,37],"p",{},"​\tOpenGL的一大特性就是",[18,19,20],"strong",{},"对扩展(Extension)的支持","，当",[18,23,24],{},"一个显卡公司提出一个新特性或者渲染上的大优化","，通常",[18,27,28],{},"会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行","，开发者可以",[18,31,32],{},"使用这个扩展提供的一些更先进更有效的图形功能","。通过这种方式，",[18,35,36],{},"开发者不必等待一个新的OpenGL规范面世，就可以使用这些新的渲染特性了","，只需要简单地检查一下显卡是否支持此扩展。通常，当一个扩展非常流行或者非常有用的时候，它将最终成为未来的OpenGL规范的一部分。",[14,39,40],{},"使用扩展的代码大多看上去如下：",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-c++ shiki shiki-themes github-light github-dark","if(GL_ARB_extension_name)\n{\n    \u002F\u002F 使用硬件支持的全新的现代特性\n}\nelse\n{\n    \u002F\u002F 不支持此扩展: 用旧的方式去做\n}\n","c++","",[49,50,51,64,70,77,83,89,94,100],"code",{"__ignoreMap":47},[52,53,56,60],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"szBVR","if",[52,61,63],{"class":62},"sVt8B","(GL_ARB_extension_name)\n",[52,65,67],{"class":54,"line":66},2,[52,68,69],{"class":62},"{\n",[52,71,73],{"class":54,"line":72},3,[52,74,76],{"class":75},"sJ8bj","    \u002F\u002F 使用硬件支持的全新的现代特性\n",[52,78,80],{"class":54,"line":79},4,[52,81,82],{"class":62},"}\n",[52,84,86],{"class":54,"line":85},5,[52,87,88],{"class":58},"else\n",[52,90,92],{"class":54,"line":91},6,[52,93,69],{"class":62},[52,95,97],{"class":54,"line":96},7,[52,98,99],{"class":75},"    \u002F\u002F 不支持此扩展: 用旧的方式去做\n",[52,101,103],{"class":54,"line":102},8,[52,104,82],{"class":62},[14,106,107],{},"使用OpenGL3.3时，我们很少需要使用扩展来完成大多数功能，当需要的时候，本教程将提供适当的指示。",[10,109,110],{"id":110},"状态机",[14,112,113,114,117,118,121],{},"​\tOpenGL自身是一个",[18,115,116],{},"巨大的状态机(State Machine)","：一系列的变量描述OpenGL此刻应当如何运行。",[18,119,120],{},"OpenGL的状态通常被称为OpenGL上下文(Context)","。我们通常使用如下途径去更改OpenGL状态：设置选项，操作缓冲。最后，我们使用当前OpenGL上下文来渲染。",[14,123,124,125,128],{},"​\t假设当我们想",[18,126,127],{},"告诉OpenGL去画线段而不是三角形的时候","，我们通过改变一些上下文变量来改变OpenGL状态，从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段，下一个绘制命令就会画出线段而不是三角形。",[14,130,131,132,135,136,139],{},"​\t当",[18,133,134],{},"使用OpenGL的时候，我们会遇到一些状态设置函数(State-changing Function)","，这类函数将会改变上下文。",[18,137,138],{},"以及状态使用函数(State-using Function)，这类函数会根据当前OpenGL的状态执行一些操作","。只要你记住OpenGL本质上是个大状态机，就能更容易理解它的大部分特性。",[10,141,142],{"id":142},"对象",[14,144,145],{},"​\tOpenGL库是用C语言写的，同时也支持多种语言的派生，但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言，因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个。",[14,147,148],{},"​\t在OpenGL中一个对象是指一些选项的集合，它代表OpenGL状态的一个子集。比如，我们可以用一个对象来代表绘图窗口的设置，之后我们就可以设置它的大小、支持的颜色位数等等。可以把对象看做一个C风格的结构体(Struct)：",[42,150,152],{"className":44,"code":151,"language":46,"meta":47,"style":47},"struct object_name {\n    float  option1;\n    int    option2;\n    char[] name;\n};\n",[49,153,154,166,174,182,190],{"__ignoreMap":47},[52,155,156,159,163],{"class":54,"line":55},[52,157,158],{"class":58},"struct",[52,160,162],{"class":161},"sScJk"," object_name",[52,164,165],{"class":62}," {\n",[52,167,168,171],{"class":54,"line":66},[52,169,170],{"class":58},"    float",[52,172,173],{"class":62},"  option1;\n",[52,175,176,179],{"class":54,"line":72},[52,177,178],{"class":58},"    int",[52,180,181],{"class":62},"    option2;\n",[52,183,184,187],{"class":54,"line":79},[52,185,186],{"class":58},"    char",[52,188,189],{"class":62},"[] name;\n",[52,191,192],{"class":54,"line":85},[52,193,194],{"class":62},"};\n",[14,196,197,198,201],{},"​\t当我们使用一个对象时，通常看起来像如下一样（",[18,199,200],{},"把OpenGL上下文看作一个大的结构体","）：",[42,203,205],{"className":44,"code":204,"language":46,"meta":47,"style":47},"\u002F\u002F OpenGL的状态\nstruct OpenGL_Context {\n    ...\n    object* object_Window_Target;\n    ...     \n};\n\u002F\u002F 创建对象\nunsigned int objectId = 0;\nglGenObject(1, &objectId);\n\u002F\u002F 绑定对象至上下文\nglBindObject(GL_WINDOW_TARGET, objectId);\n\u002F\u002F 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项\nglSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);\nglSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);\n\u002F\u002F 将上下文对象设回默认\nglBindObject(GL_WINDOW_TARGET, 0);\n",[49,206,207,212,221,226,237,242,246,251,272,293,299,308,314,329,342,348],{"__ignoreMap":47},[52,208,209],{"class":54,"line":55},[52,210,211],{"class":75},"\u002F\u002F OpenGL的状态\n",[52,213,214,216,219],{"class":54,"line":66},[52,215,158],{"class":58},[52,217,218],{"class":161}," OpenGL_Context",[52,220,165],{"class":62},[52,222,223],{"class":54,"line":72},[52,224,225],{"class":62},"    ...\n",[52,227,228,231,234],{"class":54,"line":79},[52,229,230],{"class":161},"    object",[52,232,233],{"class":58},"*",[52,235,236],{"class":62}," object_Window_Target;\n",[52,238,239],{"class":54,"line":85},[52,240,241],{"class":62},"    ...     \n",[52,243,244],{"class":54,"line":91},[52,245,194],{"class":62},[52,247,248],{"class":54,"line":96},[52,249,250],{"class":75},"\u002F\u002F 创建对象\n",[52,252,253,256,259,262,265,269],{"class":54,"line":102},[52,254,255],{"class":58},"unsigned",[52,257,258],{"class":58}," int",[52,260,261],{"class":62}," objectId ",[52,263,264],{"class":58},"=",[52,266,268],{"class":267},"sj4cs"," 0",[52,270,271],{"class":62},";\n",[52,273,275,278,281,284,287,290],{"class":54,"line":274},9,[52,276,277],{"class":161},"glGenObject",[52,279,280],{"class":62},"(",[52,282,283],{"class":267},"1",[52,285,286],{"class":62},", ",[52,288,289],{"class":58},"&",[52,291,292],{"class":62},"objectId);\n",[52,294,296],{"class":54,"line":295},10,[52,297,298],{"class":75},"\u002F\u002F 绑定对象至上下文\n",[52,300,302,305],{"class":54,"line":301},11,[52,303,304],{"class":161},"glBindObject",[52,306,307],{"class":62},"(GL_WINDOW_TARGET, objectId);\n",[52,309,311],{"class":54,"line":310},12,[52,312,313],{"class":75},"\u002F\u002F 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项\n",[52,315,317,320,323,326],{"class":54,"line":316},13,[52,318,319],{"class":161},"glSetObjectOption",[52,321,322],{"class":62},"(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, ",[52,324,325],{"class":267},"800",[52,327,328],{"class":62},");\n",[52,330,332,334,337,340],{"class":54,"line":331},14,[52,333,319],{"class":161},[52,335,336],{"class":62},"(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, ",[52,338,339],{"class":267},"600",[52,341,328],{"class":62},[52,343,345],{"class":54,"line":344},15,[52,346,347],{"class":75},"\u002F\u002F 将上下文对象设回默认\n",[52,349,351,353,356,359],{"class":54,"line":350},16,[52,352,304],{"class":161},[52,354,355],{"class":62},"(GL_WINDOW_TARGET, ",[52,357,358],{"class":267},"0",[52,360,328],{"class":62},[14,362,363,364,367,368,371],{},"​\t这一小段代码展现了你以后",[18,365,366],{},"使用OpenGL时常见的工作流。我们首先创建一个对象","，然后",[18,369,370],{},"用一个id保存它的引用","（实际数据被储存在后台）。然后我们将对象绑定至上下文的目标位置（例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET）。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0，解绑这个对象。设置的选项将被保存在objectId所引用的对象中，一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置，这些选项就会重新生效。",[14,373,374],{},".vscode配置讲解",[10,376,378],{"id":377},"c_cpp_propertiesjson",[18,379,380],{},"c_cpp_properties.json",[14,382,383,384,387,388,391,392,395],{},"​\t",[18,385,386],{},"Visual Studio Code (VS Code)"," 中 C\u002FC++ 扩展使用的配置文件。这个文件专门用于配置 VS Code 的 ",[18,389,390],{},"IntelliSense","（智能感知）功能，确保代码编辑器",[18,393,394],{},"能够正确地识别和理解你的源代码、库和编译器设置，从而提供自动完成、错误波浪线和代码导航等功能","。",[42,397,401],{"className":398,"code":399,"language":400,"meta":47,"style":47},"language-json shiki shiki-themes github-light github-dark","{\n    \"version\": 4,\n    \"configurations\": [\n        {\n            \"name\": \"Win32\",\n            \"includePath\": [\n                \"${workspaceFolder}\u002F**\",\n                \"${workspaceFolder}\u002Finclude\",\n                \"E:\u002Fvcpkg\u002Fvcpkg\u002Finstalled\u002Fx64-windows\u002Finclude\"\n            ],\n            \"defines\": [\n                \"_DEBUG\",\n                \"UNICODE\",\n                \"_UNICODE\"\n            ],\n            \"windowsSdkVersion\": \"10.0.26100.0\",\n            \"compilerPath\": \"C:\u002FProgram Files (x86)\u002FMicrosoft Visual Studio\u002F2022\u002FBuildTools\u002FVC\u002FTools\u002FMSVC\u002F14.43.34808\u002Fbin\u002FHostx64\u002Fx64\u002Fcl.exe\",\n            \"cStandard\": \"c17\",\n            \"cppStandard\": \"c++17\",\n            \"intelliSenseMode\": \"windows-msvc-x64\",\n            \"configurationProvider\": \"ms-vscode.cmake-tools\"\n        }\n    ]\n}\n\n","json",[49,402,403,407,421,429,434,447,454,461,468,473,478,485,492,499,504,508,520,533,546,559,572,583,589,595],{"__ignoreMap":47},[52,404,405],{"class":54,"line":55},[52,406,69],{"class":62},[52,408,409,412,415,418],{"class":54,"line":66},[52,410,411],{"class":267},"    \"version\"",[52,413,414],{"class":62},": ",[52,416,417],{"class":267},"4",[52,419,420],{"class":62},",\n",[52,422,423,426],{"class":54,"line":72},[52,424,425],{"class":267},"    \"configurations\"",[52,427,428],{"class":62},": [\n",[52,430,431],{"class":54,"line":79},[52,432,433],{"class":62},"        {\n",[52,435,436,439,441,445],{"class":54,"line":85},[52,437,438],{"class":267},"            \"name\"",[52,440,414],{"class":62},[52,442,444],{"class":443},"sZZnC","\"Win32\"",[52,446,420],{"class":62},[52,448,449,452],{"class":54,"line":91},[52,450,451],{"class":267},"            \"includePath\"",[52,453,428],{"class":62},[52,455,456,459],{"class":54,"line":96},[52,457,458],{"class":443},"                \"${workspaceFolder}\u002F**\"",[52,460,420],{"class":62},[52,462,463,466],{"class":54,"line":102},[52,464,465],{"class":443},"                \"${workspaceFolder}\u002Finclude\"",[52,467,420],{"class":62},[52,469,470],{"class":54,"line":274},[52,471,472],{"class":443},"                \"E:\u002Fvcpkg\u002Fvcpkg\u002Finstalled\u002Fx64-windows\u002Finclude\"\n",[52,474,475],{"class":54,"line":295},[52,476,477],{"class":62},"            ],\n",[52,479,480,483],{"class":54,"line":301},[52,481,482],{"class":267},"            \"defines\"",[52,484,428],{"class":62},[52,486,487,490],{"class":54,"line":310},[52,488,489],{"class":443},"                \"_DEBUG\"",[52,491,420],{"class":62},[52,493,494,497],{"class":54,"line":316},[52,495,496],{"class":443},"                \"UNICODE\"",[52,498,420],{"class":62},[52,500,501],{"class":54,"line":331},[52,502,503],{"class":443},"                \"_UNICODE\"\n",[52,505,506],{"class":54,"line":344},[52,507,477],{"class":62},[52,509,510,513,515,518],{"class":54,"line":350},[52,511,512],{"class":267},"            \"windowsSdkVersion\"",[52,514,414],{"class":62},[52,516,517],{"class":443},"\"10.0.26100.0\"",[52,519,420],{"class":62},[52,521,523,526,528,531],{"class":54,"line":522},17,[52,524,525],{"class":267},"            \"compilerPath\"",[52,527,414],{"class":62},[52,529,530],{"class":443},"\"C:\u002FProgram Files (x86)\u002FMicrosoft Visual Studio\u002F2022\u002FBuildTools\u002FVC\u002FTools\u002FMSVC\u002F14.43.34808\u002Fbin\u002FHostx64\u002Fx64\u002Fcl.exe\"",[52,532,420],{"class":62},[52,534,536,539,541,544],{"class":54,"line":535},18,[52,537,538],{"class":267},"            \"cStandard\"",[52,540,414],{"class":62},[52,542,543],{"class":443},"\"c17\"",[52,545,420],{"class":62},[52,547,549,552,554,557],{"class":54,"line":548},19,[52,550,551],{"class":267},"            \"cppStandard\"",[52,553,414],{"class":62},[52,555,556],{"class":443},"\"c++17\"",[52,558,420],{"class":62},[52,560,562,565,567,570],{"class":54,"line":561},20,[52,563,564],{"class":267},"            \"intelliSenseMode\"",[52,566,414],{"class":62},[52,568,569],{"class":443},"\"windows-msvc-x64\"",[52,571,420],{"class":62},[52,573,575,578,580],{"class":54,"line":574},21,[52,576,577],{"class":267},"            \"configurationProvider\"",[52,579,414],{"class":62},[52,581,582],{"class":443},"\"ms-vscode.cmake-tools\"\n",[52,584,586],{"class":54,"line":585},22,[52,587,588],{"class":62},"        }\n",[52,590,592],{"class":54,"line":591},23,[52,593,594],{"class":62},"    ]\n",[52,596,598],{"class":54,"line":597},24,[52,599,82],{"class":62},[601,602,603,619],"table",{},[604,605,606],"thead",{},[607,608,609,613,616],"tr",{},[610,611,612],"th",{},"属性",[610,614,615],{},"值",[610,617,618],{},"解释",[620,621,622,639],"tbody",{},[607,623,624,632,636],{},[625,626,627],"td",{},[18,628,629],{},[49,630,631],{},"version",[625,633,634],{},[49,635,417],{},[625,637,638],{},"指定配置文件的版本。",[607,640,641,648,653],{},[625,642,643],{},[18,644,645],{},[49,646,647],{},"configurations",[625,649,650],{},[49,651,652],{},"[...]",[625,654,655,656,659,660],{},"包含一个或多个配置对象（如 ",[49,657,658],{},"Win32","）。你可以",[18,661,662],{},"为不同的平台或构建类型（Debug\u002FRelease）设置不同的配置。",[664,665,667,669],"h3",{"id":666},"configurations-数组中的配置对象",[49,668,647],{}," 数组中的配置对象",[14,671,672,673,675],{},"​\t您只有一个名为 ",[49,674,444],{}," 的配置对象。",[601,677,678,688],{},[604,679,680],{},[607,681,682,684,686],{},[610,683,612],{},[610,685,615],{},[610,687,618],{},[620,689,690,714,741,753,769,792,808,820,835,851,878,894,910,932],{},[607,691,692,699,703],{},[625,693,694],{},[18,695,696],{},[49,697,698],{},"name",[625,700,701],{},[49,702,444],{},[625,704,705,706,709,710,713],{},"配置的名称。用户可以在 VS Code 状态栏中选择此配置。注意，在 64 位系统上，这个名称可能只是历史遗留，实际编译目标由 ",[49,707,708],{},"compilerPath"," 和 ",[49,711,712],{},"intelliSenseMode"," 决定。",[607,715,716,723,727],{},[625,717,718],{},[18,719,720],{},[49,721,722],{},"includePath",[625,724,725],{},[49,726,652],{},[625,728,729,732,733,736,737,740],{},[18,730,731],{},"最重要的部分。"," 这是一个数组，告诉 IntelliSense 在哪里查找头文件 (",[49,734,735],{},".h"," 或 ",[49,738,739],{},".hpp",")：",[607,742,743,745,750],{},[625,744],{},[625,746,747],{},[49,748,749],{},"\"${workspaceFolder}\u002F**\"",[625,751,752],{},"递归地查找工作区根目录下所有文件夹中的头文件。",[607,754,755,757,762],{},[625,756],{},[625,758,759],{},[49,760,761],{},"\"${workspaceFolder}\u002Finclude\"",[625,763,764,765,768],{},"查找工作区根目录下的 ",[49,766,767],{},"include"," 文件夹中的头文件。",[607,770,771,773,778],{},[625,772],{},[625,774,775],{},[49,776,777],{},"\"E:\u002Fvcpkg\u002Fvcpkg\u002Finstalled\u002Fx64-windows\u002Finclude\"",[625,779,780,783,784,787,788,791],{},[18,781,782],{},"这是你手动添加的路径。"," 它指向 Vcpkg 安装的",[18,785,786],{},"所有"," 64 位 Windows 库的头文件目录。这是让 IntelliSense 识别 ",[18,789,790],{},"GLFW"," 等库的关键。",[607,793,794,801,805],{},[625,795,796],{},[18,797,798],{},[49,799,800],{},"defines",[625,802,803],{},[49,804,652],{},[625,806,807],{},"预处理器宏定义。这些宏在编译时会被定义：",[607,809,810,812,817],{},[625,811],{},[625,813,814],{},[49,815,816],{},"\"_DEBUG\"",[625,818,819],{},"通常用于调试构建。",[607,821,822,824,832],{},[625,823],{},[625,825,826,286,829],{},[49,827,828],{},"\"UNICODE\"",[49,830,831],{},"\"_UNICODE\"",[625,833,834],{},"用于启用 Windows 上的 Unicode 字符集支持。",[607,836,837,844,848],{},[625,838,839],{},[18,840,841],{},[49,842,843],{},"windowsSdkVersion",[625,845,846],{},[49,847,517],{},[625,849,850],{},"指定使用的 Windows SDK 版本。",[607,852,853,859,864],{},[625,854,855],{},[18,856,857],{},[49,858,708],{},[625,860,861],{},[49,862,863],{},"\"C:\u002FProgram Files (x86)\u002F...\u002Fcl.exe\"",[625,865,866,869,870,877],{},[18,867,868],{},"指定 IntelliSense 应该模仿哪个编译器。"," 这里指向了 Visual Studio 2022 Build Tools 中的 ",[18,871,872,873,876],{},"MSVC 编译器 (",[49,874,875],{},"cl.exe",")"," 的 64 位版本。IntelliSense 会读取此编译器的默认头文件和设置。",[607,879,880,887,891],{},[625,881,882],{},[18,883,884],{},[49,885,886],{},"cStandard",[625,888,889],{},[49,890,543],{},[625,892,893],{},"C 语言标准 (C17)。",[607,895,896,903,907],{},[625,897,898],{},[18,899,900],{},[49,901,902],{},"cppStandard",[625,904,905],{},[49,906,556],{},[625,908,909],{},"C++ 语言标准 (C++17)。",[607,911,912,918,922],{},[625,913,914],{},[18,915,916],{},[49,917,712],{},[625,919,920],{},[49,921,569],{},[625,923,924,927,928,931],{},[18,925,926],{},"指定 IntelliSense 的工作模式。"," ",[49,929,930],{},"windows-msvc-x64"," 表示它将模拟 64 位 Windows 上的 Microsoft Visual C++ 编译器行为。",[607,933,934,941,946],{},[625,935,936],{},[18,937,938],{},[49,939,940],{},"configurationProvider",[625,942,943],{},[49,944,945],{},"\"ms-vscode.cmake-tools\"",[625,947,948,949,952],{},"告诉 C\u002FC++ 扩展，",[18,950,951],{},"当前的配置信息实际上由另一个扩展（CMake Tools）提供和管理","。虽然你在这里手动配置了，但 CMake Tools 扩展可以在其配置步骤中覆盖或补充这些路径。",[664,954,955],{"id":955},"该配置的目的",[14,957,958,959,961,962,965],{},"这个 ",[49,960,380],{}," 文件的主要目的是为 VS Code 提供一个 ",[18,963,964],{},"64 位 Windows 环境下的 MSVC 智能感知模型","，并确保 IntelliSense 可以找到：",[967,968,969,980,991],"ol",{},[970,971,972,975,976,979],"li",{},[18,973,974],{},"项目内部的头文件"," (",[49,977,978],{},"${workspaceFolder}\u002F**",")。",[970,981,982,975,985,987,988,990],{},[18,983,984],{},"系统和工具链的头文件",[49,986,708],{}," 决定的 MSVC 默认路径和 ",[49,989,843],{}," 决定的 Windows SDK 路径)。",[970,992,993,975,996,979],{},[18,994,995],{},"Vcpkg 安装的第三方库的头文件",[49,997,998],{},"E:\u002Fvcpkg\u002F...\u002Finclude",[14,1000,1001,1004,1005,1008,1009,1012,1013,709,1018,1021],{},[18,1002,1003],{},"注意："," 这个文件 ",[18,1006,1007],{},"只影响 VS Code 的编辑器功能","。它",[18,1010,1011],{},"不","影响你的实际编译和链接过程。你的 ",[18,1014,1015],{},[49,1016,1017],{},"CMakeLists.txt",[18,1019,1020],{},"Vcpkg Toolchain 文件"," 才是决定项目能否成功编译和运行的关键。",[10,1023,1025],{"id":1024},"launchjson","launch.json",[42,1027,1029],{"className":398,"code":1028,"language":400,"meta":47,"style":47},"{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Debug OpenGL Project\",\n            \"type\": \"cppvsdbg\",\n            \"request\": \"launch\",\n            \"program\": \"${workspaceFolder}\u002Fbuild\u002FDebug\u002Fopengl_project.exe\",\n            \"args\": [],\n            \"stopAtEntry\": false,\n            \"cwd\": \"${workspaceFolder}\",\n            \"environment\": [],\n            \"console\": \"integratedTerminal\",\n            \"preLaunchTask\": \"Build\"\n        }\n    ]\n}\n\n",[49,1030,1031,1035,1046,1052,1056,1067,1079,1091,1103,1111,1123,1135,1142,1154,1164,1168,1172],{"__ignoreMap":47},[52,1032,1033],{"class":54,"line":55},[52,1034,69],{"class":62},[52,1036,1037,1039,1041,1044],{"class":54,"line":66},[52,1038,411],{"class":267},[52,1040,414],{"class":62},[52,1042,1043],{"class":443},"\"0.2.0\"",[52,1045,420],{"class":62},[52,1047,1048,1050],{"class":54,"line":72},[52,1049,425],{"class":267},[52,1051,428],{"class":62},[52,1053,1054],{"class":54,"line":79},[52,1055,433],{"class":62},[52,1057,1058,1060,1062,1065],{"class":54,"line":85},[52,1059,438],{"class":267},[52,1061,414],{"class":62},[52,1063,1064],{"class":443},"\"Debug OpenGL Project\"",[52,1066,420],{"class":62},[52,1068,1069,1072,1074,1077],{"class":54,"line":91},[52,1070,1071],{"class":267},"            \"type\"",[52,1073,414],{"class":62},[52,1075,1076],{"class":443},"\"cppvsdbg\"",[52,1078,420],{"class":62},[52,1080,1081,1084,1086,1089],{"class":54,"line":96},[52,1082,1083],{"class":267},"            \"request\"",[52,1085,414],{"class":62},[52,1087,1088],{"class":443},"\"launch\"",[52,1090,420],{"class":62},[52,1092,1093,1096,1098,1101],{"class":54,"line":102},[52,1094,1095],{"class":267},"            \"program\"",[52,1097,414],{"class":62},[52,1099,1100],{"class":443},"\"${workspaceFolder}\u002Fbuild\u002FDebug\u002Fopengl_project.exe\"",[52,1102,420],{"class":62},[52,1104,1105,1108],{"class":54,"line":274},[52,1106,1107],{"class":267},"            \"args\"",[52,1109,1110],{"class":62},": [],\n",[52,1112,1113,1116,1118,1121],{"class":54,"line":295},[52,1114,1115],{"class":267},"            \"stopAtEntry\"",[52,1117,414],{"class":62},[52,1119,1120],{"class":267},"false",[52,1122,420],{"class":62},[52,1124,1125,1128,1130,1133],{"class":54,"line":301},[52,1126,1127],{"class":267},"            \"cwd\"",[52,1129,414],{"class":62},[52,1131,1132],{"class":443},"\"${workspaceFolder}\"",[52,1134,420],{"class":62},[52,1136,1137,1140],{"class":54,"line":310},[52,1138,1139],{"class":267},"            \"environment\"",[52,1141,1110],{"class":62},[52,1143,1144,1147,1149,1152],{"class":54,"line":316},[52,1145,1146],{"class":267},"            \"console\"",[52,1148,414],{"class":62},[52,1150,1151],{"class":443},"\"integratedTerminal\"",[52,1153,420],{"class":62},[52,1155,1156,1159,1161],{"class":54,"line":331},[52,1157,1158],{"class":267},"            \"preLaunchTask\"",[52,1160,414],{"class":62},[52,1162,1163],{"class":443},"\"Build\"\n",[52,1165,1166],{"class":54,"line":344},[52,1167,588],{"class":62},[52,1169,1170],{"class":54,"line":350},[52,1171,594],{"class":62},[52,1173,1174],{"class":54,"line":522},[52,1175,82],{"class":62},[601,1177,1178,1188],{},[604,1179,1180],{},[607,1181,1182,1184,1186],{},[610,1183,612],{},[610,1185,615],{},[610,1187,618],{},[620,1189,1190,1204],{},[607,1191,1192,1198,1202],{},[625,1193,1194],{},[18,1195,1196],{},[49,1197,631],{},[625,1199,1200],{},[49,1201,1043],{},[625,1203,638],{},[607,1205,1206,1212,1216],{},[625,1207,1208],{},[18,1209,1210],{},[49,1211,647],{},[625,1213,1214],{},[49,1215,652],{},[625,1217,1218],{},"包含一个或多个调试配置对象。",[664,1220,1222,1223],{"id":1221},"配置对象debug-opengl-project","配置对象：",[49,1224,1225],{},"Debug OpenGL Project",[601,1227,1228,1238],{},[604,1229,1230],{},[607,1231,1232,1234,1236],{},[610,1233,612],{},[610,1235,615],{},[610,1237,618],{},[620,1239,1240,1258,1287,1313,1344,1364,1393,1419,1442,1476],{},[607,1241,1242,1248,1252],{},[625,1243,1244],{},[18,1245,1246],{},[49,1247,698],{},[625,1249,1250],{},[49,1251,1064],{},[625,1253,1254,1257],{},[18,1255,1256],{},"配置的显示名称。"," 你在 VS Code 调试面板中看到的名称。",[607,1259,1260,1267,1271],{},[625,1261,1262],{},[18,1263,1264],{},[49,1265,1266],{},"type",[625,1268,1269],{},[49,1270,1076],{},[625,1272,1273,927,1276,1278,1279,1282,1283,1286],{},[18,1274,1275],{},"要使用的调试器类型。",[49,1277,1076],{}," 对应于 ",[18,1280,1281],{},"Microsoft Visual Studio 调试器","，适用于使用 ",[18,1284,1285],{},"MSVC (Visual Studio 编译器)"," 构建的 Windows C++ 程序。",[607,1288,1289,1296,1300],{},[625,1290,1291],{},[18,1292,1293],{},[49,1294,1295],{},"request",[625,1297,1298],{},[49,1299,1088],{},[625,1301,1302,1305,1306,1309,1310,979],{},[18,1303,1304],{},"请求类型。"," 指定调试器应该 ",[18,1307,1308],{},"启动"," 一个新的程序实例，而不是连接到一个已运行的进程 (",[49,1311,1312],{},"attach",[607,1314,1315,1322,1326],{},[625,1316,1317],{},[18,1318,1319],{},[49,1320,1321],{},"program",[625,1323,1324],{},[49,1325,1100],{},[625,1327,1328,1331,1332,1335,1336,1339,1340,1343],{},[18,1329,1330],{},"要启动的可执行文件路径。"," 这是一个关键设置，它使用**环境变量 ",[49,1333,1334],{},"${workspaceFolder}","（项目根目录）**来定位你的程序。它假设你的 CMake 构建将 Debug 版本的 ",[49,1337,1338],{},".exe"," 文件放在 ",[49,1341,1342],{},"build\u002FDebug\u002F"," 目录下。",[607,1345,1346,1353,1358],{},[625,1347,1348],{},[18,1349,1350],{},[49,1351,1352],{},"args",[625,1354,1355],{},[49,1356,1357],{},"[]",[625,1359,1360,1363],{},[18,1361,1362],{},"命令行参数。"," 如果你的程序需要在启动时接收参数，它们会被放在这个数组中。当前为空，表示没有参数。",[607,1365,1366,1373,1377],{},[625,1367,1368],{},[18,1369,1370],{},[49,1371,1372],{},"stopAtEntry",[625,1374,1375],{},[49,1376,1120],{},[625,1378,1379,927,1382,1384,1385,1388,1389,1392],{},[18,1380,1381],{},"是否在程序入口点暂停。",[49,1383,1120],{}," 表示程序将直接运行到你设置的第一个断点处。如果设置为 ",[49,1386,1387],{},"true","，程序会在 ",[49,1390,1391],{},"main()"," 函数开始时立即暂停。",[607,1394,1395,1402,1406],{},[625,1396,1397],{},[18,1398,1399],{},[49,1400,1401],{},"cwd",[625,1403,1404],{},[49,1405,1132],{},[625,1407,1408,1411,1412,1414,1415,1418],{},[18,1409,1410],{},"工作目录（Current Working Directory）。"," 程序启动时所处的目录。设置为 ",[49,1413,1334],{}," 确保程序可以找到它依赖的任何",[18,1416,1417],{},"相对路径文件","（例如：着色器文件、纹理、模型等）。",[607,1420,1421,1428,1432],{},[625,1422,1423],{},[18,1424,1425],{},[49,1426,1427],{},"environment",[625,1429,1430],{},[49,1431,1357],{},[625,1433,1434,1437,1438,1441],{},[18,1435,1436],{},"环境变量。"," 启动程序时需要",[18,1439,1440],{},"设置的特定环境变量","，当前为空。",[607,1443,1444,1451,1455],{},[625,1445,1446],{},[18,1447,1448],{},[49,1449,1450],{},"console",[625,1452,1453],{},[49,1454,1151],{},[625,1456,1457,1460,1461,736,1464,1467,1468,1471,1472,1475],{},[18,1458,1459],{},"控制台输出方式。"," 指定程序的标准输入\u002F输出（如 ",[49,1462,1463],{},"printf",[49,1465,1466],{},"std::cout","）将显示在 VS Code 的",[18,1469,1470],{},"集成终端","中。其他选项包括 ",[49,1473,1474],{},"externalTerminal","（新开一个窗口）等。",[607,1477,1478,1485,1490],{},[625,1479,1480],{},[18,1481,1482],{},[49,1483,1484],{},"preLaunchTask",[625,1486,1487],{},[49,1488,1489],{},"\"Build\"",[625,1491,1492,1495,1496,1499,1500,1502,1503,1506,1507,1510,1511,395],{},[18,1493,1494],{},"启动前的任务。"," 这是一个",[18,1497,1498],{},"极其重要","的设置。它告诉 VS Code 在启动调试之前，必须先运行一个名为 ",[49,1501,1489],{}," 的 ",[18,1504,1505],{},"Task（任务）","。这个任务通常用于执行 ",[18,1508,1509],{},"CMake 构建","，确保调试器",[18,1512,1513],{},"运行的是最新的编译结果",[10,1515,1517],{"id":1516},"settingjson","setting.json",[42,1519,1521],{"className":398,"code":1520,"language":400,"meta":47,"style":47},"{\n    \"cmake.configureArgs\": [\n        \"-DCMAKE_TOOLCHAIN_FILE=E:\u002Fvcpkg\u002Fvcpkg\u002Fscripts\u002Fbuildsystems\u002Fvcpkg.cmake\"\n    ],\n    \"cmake.generator\": \"Visual Studio 17 2022\",\n    \"cmake.preferredGenerators\": [\n        \"Visual Studio 17 2022\"\n    ],\n    \"cmake.buildDirectory\": \"${workspaceFolder}\u002Fbuild\",\n    \"C_Cpp.default.configurationProvider\": \"ms-vscode.cmake-tools\",\n    \"C_Cpp.default.compilerPath\": \"\",\n    \"C_Cpp.default.intelliSenseMode\": \"windows-msvc-x64\"\n}\n\n",[49,1522,1523,1527,1534,1539,1544,1556,1563,1568,1572,1584,1595,1607,1617],{"__ignoreMap":47},[52,1524,1525],{"class":54,"line":55},[52,1526,69],{"class":62},[52,1528,1529,1532],{"class":54,"line":66},[52,1530,1531],{"class":267},"    \"cmake.configureArgs\"",[52,1533,428],{"class":62},[52,1535,1536],{"class":54,"line":72},[52,1537,1538],{"class":443},"        \"-DCMAKE_TOOLCHAIN_FILE=E:\u002Fvcpkg\u002Fvcpkg\u002Fscripts\u002Fbuildsystems\u002Fvcpkg.cmake\"\n",[52,1540,1541],{"class":54,"line":79},[52,1542,1543],{"class":62},"    ],\n",[52,1545,1546,1549,1551,1554],{"class":54,"line":85},[52,1547,1548],{"class":267},"    \"cmake.generator\"",[52,1550,414],{"class":62},[52,1552,1553],{"class":443},"\"Visual Studio 17 2022\"",[52,1555,420],{"class":62},[52,1557,1558,1561],{"class":54,"line":91},[52,1559,1560],{"class":267},"    \"cmake.preferredGenerators\"",[52,1562,428],{"class":62},[52,1564,1565],{"class":54,"line":96},[52,1566,1567],{"class":443},"        \"Visual Studio 17 2022\"\n",[52,1569,1570],{"class":54,"line":102},[52,1571,1543],{"class":62},[52,1573,1574,1577,1579,1582],{"class":54,"line":274},[52,1575,1576],{"class":267},"    \"cmake.buildDirectory\"",[52,1578,414],{"class":62},[52,1580,1581],{"class":443},"\"${workspaceFolder}\u002Fbuild\"",[52,1583,420],{"class":62},[52,1585,1586,1589,1591,1593],{"class":54,"line":295},[52,1587,1588],{"class":267},"    \"C_Cpp.default.configurationProvider\"",[52,1590,414],{"class":62},[52,1592,945],{"class":443},[52,1594,420],{"class":62},[52,1596,1597,1600,1602,1605],{"class":54,"line":301},[52,1598,1599],{"class":267},"    \"C_Cpp.default.compilerPath\"",[52,1601,414],{"class":62},[52,1603,1604],{"class":443},"\"\"",[52,1606,420],{"class":62},[52,1608,1609,1612,1614],{"class":54,"line":310},[52,1610,1611],{"class":267},"    \"C_Cpp.default.intelliSenseMode\"",[52,1613,414],{"class":62},[52,1615,1616],{"class":443},"\"windows-msvc-x64\"\n",[52,1618,1619],{"class":54,"line":316},[52,1620,82],{"class":62},[10,1622,1624,1627],{"id":1623},"settingsjson-配置详解",[49,1625,1626],{},"settings.json"," 配置详解",[14,1629,1630,1631,1634,1635,1638],{},"​\t这个文件主要分为两个部分：针对 ",[18,1632,1633],{},"CMake Tools 扩展"," 的配置和针对 ",[18,1636,1637],{},"C\u002FC++ 扩展"," 的默认配置。",[14,1640,1641,1642,1645,1646,1648,1649,1651],{},"​\t这个配置文件通常是 VS Code 的 ",[18,1643,1644],{},"用户或工作区设置文件","（",[49,1647,1626],{},"），它主要用于配置 ",[18,1650,1633],{},"的行为以及 C\u002FC++ 扩展的一些默认设置。",[14,1653,1654,1655,1658,1659,1662],{},"​\t它将你的 ",[18,1656,1657],{},"CMake 构建系统","与 ",[18,1660,1661],{},"Vcpkg"," 完美地结合了起来。",[14,1664,1665,1666,1634,1668,1638],{},"这个文件主要分为两个部分：针对 ",[18,1667,1633],{},[18,1669,1637],{},[664,1671,1673,1674,1677],{"id":1672},"_1-cmake-tools-配置cmake","1. CMake Tools 配置（",[49,1675,1676],{},"cmake.*","）",[14,1679,1680],{},"​\t这些设置直接控制 VS Code 如何调用 CMake 来配置和生成你的项目。",[601,1682,1683,1693],{},[604,1684,1685],{},[607,1686,1687,1689,1691],{},[610,1688,612],{},[610,1690,615],{},[610,1692,618],{},[620,1694,1695,1721,1751,1771],{},[607,1696,1697,1704,1709],{},[625,1698,1699],{},[18,1700,1701],{},[49,1702,1703],{},"cmake.configureArgs",[625,1705,1706],{},[49,1707,1708],{},"[\"-DCMAKE_TOOLCHAIN_FILE=...\"]",[625,1710,1711,1714,1715,1718,1719,395],{},[18,1712,1713],{},"配置参数。"," 这是最重要的部分，它告诉 CMake 在配置项目时，必须使用 ",[18,1716,1717],{},"Vcpkg 的工具链文件","。这确保了 CMake 能够找到你通过 Vcpkg 安装的所有库，如 ",[18,1720,790],{},[607,1722,1723,1730,1734],{},[625,1724,1725],{},[18,1726,1727],{},[49,1728,1729],{},"cmake.generator",[625,1731,1732],{},[49,1733,1553],{},[625,1735,1736,1739,1740,1743,1744,709,1747,1750],{},[18,1737,1738],{},"默认生成器。"," 指定 CMake 应该使用哪个构建系统来生成项目文件。这里选择的是 ",[18,1741,1742],{},"Visual Studio 2022"," 的生成器，这意味着 CMake 将生成 ",[49,1745,1746],{},".sln",[49,1748,1749],{},".vcxproj"," 文件。",[607,1752,1753,1760,1765],{},[625,1754,1755],{},[18,1756,1757],{},[49,1758,1759],{},"cmake.preferredGenerators",[625,1761,1762],{},[49,1763,1764],{},"[\"Visual Studio 17 2022\"]",[625,1766,1767,1770],{},[18,1768,1769],{},"首选生成器列表。"," 进一步确定了如果用户没有明确选择，CMake Tools 应该优先使用这个生成器。",[607,1772,1773,1780,1784],{},[625,1774,1775],{},[18,1776,1777],{},[49,1778,1779],{},"cmake.buildDirectory",[625,1781,1782],{},[49,1783,1581],{},[625,1785,1786,1789,1790,1793,1794,1796],{},[18,1787,1788],{},"构建目录。"," 指定所有 CMake 生成的临时文件和最终可执行文件（如你的 ",[49,1791,1792],{},"opengl_project.exe","）应该放置的位置。这与你的 ",[49,1795,1025],{}," 中的路径假设一致。",[664,1798,1800,1801,1677],{"id":1799},"_2-cc-扩展默认配置c_cppdefault","2. C\u002FC++ 扩展默认配置（",[49,1802,1803],{},"C_Cpp.default.*",[14,1805,1806,1807,1810,1811,736,1815,1818],{},"​\t这些设置",[18,1808,1809],{},"提供了 C\u002FC++ 扩展","（负责 IntelliSense）的默认行为，但它们通常会被 ",[18,1812,1813],{},[49,1814,380],{},[18,1816,1817],{},"CMake Tools"," 的推送信息所覆盖。",[601,1820,1821,1831],{},[604,1822,1823],{},[607,1824,1825,1827,1829],{},[610,1826,612],{},[610,1828,615],{},[610,1830,618],{},[620,1832,1833,1859,1884],{},[607,1834,1835,1842,1846],{},[625,1836,1837],{},[18,1838,1839],{},[49,1840,1841],{},"C_Cpp.default.configurationProvider",[625,1843,1844],{},[49,1845,945],{},[625,1847,1848,1851,1852,1855,1856,1858],{},[18,1849,1850],{},"智能感知配置提供者。"," 这是最佳实践！它指示 C\u002FC++ 扩展，",[18,1853,1854],{},"不要尝试自己去猜","头文件路径，而是完全信任 ",[18,1857,1633],{},"提供的准确、完整的配置信息。",[607,1860,1861,1868,1872],{},[625,1862,1863],{},[18,1864,1865],{},[49,1866,1867],{},"C_Cpp.default.compilerPath",[625,1869,1870],{},[49,1871,1604],{},[625,1873,1874,1877,1878,1883],{},[18,1875,1876],{},"默认编译器路径。"," 这是一个空字符串，意味着它将",[18,1879,1880,1881],{},"依赖于 ",[49,1882,940],{},"（即 CMake Tools）来确定实际的编译器路径。",[607,1885,1886,1893,1897],{},[625,1887,1888],{},[18,1889,1890],{},[49,1891,1892],{},"C_Cpp.default.intelliSenseMode",[625,1894,1895],{},[49,1896,569],{},[625,1898,1899,1902,1903,1906],{},[18,1900,1901],{},"默认智能感知模式。"," 设置为模拟 64 位 Windows 上的 ",[18,1904,1905],{},"MSVC 编译器","行为。这确保了在 CMake Tools 尚未提供配置信息时，IntelliSense 也能有一个合理的默认环境。",[14,1908,958,1909,1911,1912,1915],{},[49,1910,1626],{}," 文件是你的 ",[18,1913,1914],{},"VS Code C++\u002FCMake 工作流的核心枢纽","。它的目标是：",[967,1917,1918,1927,1936],{},[970,1919,1920,1923,1924,1926],{},[18,1921,1922],{},"自动化 Vcpkg 集成："," 通过 ",[49,1925,1703],{}," 自动将 Vcpkg 链接到你的 CMake 项目。",[970,1928,1929,1932,1933,1935],{},[18,1930,1931],{},"统一构建系统："," 确保 CMake 始终使用 ",[18,1934,1742],{}," 作为生成器。",[970,1937,1938,1941,1942,1944],{},[18,1939,1940],{},"强化智能感知："," 通过将配置职责完全交给 ",[18,1943,1633],{},"，确保 IntelliSense 的路径（包括所有 GLFW 等 Vcpkg 库的头文件）总是正确且同步的，极大地提高了代码编辑的准确性。",[10,1946,1948],{"id":1947},"taskjson","task.json",[42,1950,1952],{"className":398,"code":1951,"language":400,"meta":47,"style":47},"{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"Configure CMake\",\n            \"type\": \"shell\",\n            \"command\": \"cmake\",\n            \"args\": [\n                \"-B\", \"build\",\n                \"-S\", \".\",\n                \"-DCMAKE_TOOLCHAIN_FILE=E:\u002Fvcpkg\u002Fvcpkg\u002Fscripts\u002Fbuildsystems\u002Fvcpkg.cmake\",\n                \"-G\", \"Visual Studio 17 2022\",\n                \"-A\", \"x64\"\n            ],\n            \"group\": \"build\",\n            \"presentation\": {\n                \"echo\": true,\n                \"reveal\": \"always\",\n                \"focus\": false,\n                \"panel\": \"shared\"\n            },\n            \"problemMatcher\": []\n        },\n        {\n            \"label\": \"Build\",\n            \"type\": \"shell\",\n            \"command\": \"cmake\",\n            \"args\": [\"--build\", \"build\", \"--config\", \"Debug\"],\n            \"group\": {\n                \"kind\": \"build\",\n                \"isDefault\": true\n            },\n            \"presentation\": {\n                \"echo\": true,\n                \"reveal\": \"always\",\n                \"focus\": false,\n                \"panel\": \"shared\"\n            },\n            \"problemMatcher\": [\"$msCompile\"]\n        }\n    ]\n}\n\n",[49,1953,1954,1958,1969,1976,1980,1992,2003,2015,2021,2033,2045,2052,2063,2073,2077,2088,2096,2107,2119,2130,2140,2145,2153,2158,2162,2173,2184,2195,2223,2230,2242,2253,2258,2265,2276,2287,2298,2307,2312,2325,2330,2335],{"__ignoreMap":47},[52,1955,1956],{"class":54,"line":55},[52,1957,69],{"class":62},[52,1959,1960,1962,1964,1967],{"class":54,"line":66},[52,1961,411],{"class":267},[52,1963,414],{"class":62},[52,1965,1966],{"class":443},"\"2.0.0\"",[52,1968,420],{"class":62},[52,1970,1971,1974],{"class":54,"line":72},[52,1972,1973],{"class":267},"    \"tasks\"",[52,1975,428],{"class":62},[52,1977,1978],{"class":54,"line":79},[52,1979,433],{"class":62},[52,1981,1982,1985,1987,1990],{"class":54,"line":85},[52,1983,1984],{"class":267},"            \"label\"",[52,1986,414],{"class":62},[52,1988,1989],{"class":443},"\"Configure CMake\"",[52,1991,420],{"class":62},[52,1993,1994,1996,1998,2001],{"class":54,"line":91},[52,1995,1071],{"class":267},[52,1997,414],{"class":62},[52,1999,2000],{"class":443},"\"shell\"",[52,2002,420],{"class":62},[52,2004,2005,2008,2010,2013],{"class":54,"line":96},[52,2006,2007],{"class":267},"            \"command\"",[52,2009,414],{"class":62},[52,2011,2012],{"class":443},"\"cmake\"",[52,2014,420],{"class":62},[52,2016,2017,2019],{"class":54,"line":102},[52,2018,1107],{"class":267},[52,2020,428],{"class":62},[52,2022,2023,2026,2028,2031],{"class":54,"line":274},[52,2024,2025],{"class":443},"                \"-B\"",[52,2027,286],{"class":62},[52,2029,2030],{"class":443},"\"build\"",[52,2032,420],{"class":62},[52,2034,2035,2038,2040,2043],{"class":54,"line":295},[52,2036,2037],{"class":443},"                \"-S\"",[52,2039,286],{"class":62},[52,2041,2042],{"class":443},"\".\"",[52,2044,420],{"class":62},[52,2046,2047,2050],{"class":54,"line":301},[52,2048,2049],{"class":443},"                \"-DCMAKE_TOOLCHAIN_FILE=E:\u002Fvcpkg\u002Fvcpkg\u002Fscripts\u002Fbuildsystems\u002Fvcpkg.cmake\"",[52,2051,420],{"class":62},[52,2053,2054,2057,2059,2061],{"class":54,"line":310},[52,2055,2056],{"class":443},"                \"-G\"",[52,2058,286],{"class":62},[52,2060,1553],{"class":443},[52,2062,420],{"class":62},[52,2064,2065,2068,2070],{"class":54,"line":316},[52,2066,2067],{"class":443},"                \"-A\"",[52,2069,286],{"class":62},[52,2071,2072],{"class":443},"\"x64\"\n",[52,2074,2075],{"class":54,"line":331},[52,2076,477],{"class":62},[52,2078,2079,2082,2084,2086],{"class":54,"line":344},[52,2080,2081],{"class":267},"            \"group\"",[52,2083,414],{"class":62},[52,2085,2030],{"class":443},[52,2087,420],{"class":62},[52,2089,2090,2093],{"class":54,"line":350},[52,2091,2092],{"class":267},"            \"presentation\"",[52,2094,2095],{"class":62},": {\n",[52,2097,2098,2101,2103,2105],{"class":54,"line":522},[52,2099,2100],{"class":267},"                \"echo\"",[52,2102,414],{"class":62},[52,2104,1387],{"class":267},[52,2106,420],{"class":62},[52,2108,2109,2112,2114,2117],{"class":54,"line":535},[52,2110,2111],{"class":267},"                \"reveal\"",[52,2113,414],{"class":62},[52,2115,2116],{"class":443},"\"always\"",[52,2118,420],{"class":62},[52,2120,2121,2124,2126,2128],{"class":54,"line":548},[52,2122,2123],{"class":267},"                \"focus\"",[52,2125,414],{"class":62},[52,2127,1120],{"class":267},[52,2129,420],{"class":62},[52,2131,2132,2135,2137],{"class":54,"line":561},[52,2133,2134],{"class":267},"                \"panel\"",[52,2136,414],{"class":62},[52,2138,2139],{"class":443},"\"shared\"\n",[52,2141,2142],{"class":54,"line":574},[52,2143,2144],{"class":62},"            },\n",[52,2146,2147,2150],{"class":54,"line":585},[52,2148,2149],{"class":267},"            \"problemMatcher\"",[52,2151,2152],{"class":62},": []\n",[52,2154,2155],{"class":54,"line":591},[52,2156,2157],{"class":62},"        },\n",[52,2159,2160],{"class":54,"line":597},[52,2161,433],{"class":62},[52,2163,2165,2167,2169,2171],{"class":54,"line":2164},25,[52,2166,1984],{"class":267},[52,2168,414],{"class":62},[52,2170,1489],{"class":443},[52,2172,420],{"class":62},[52,2174,2176,2178,2180,2182],{"class":54,"line":2175},26,[52,2177,1071],{"class":267},[52,2179,414],{"class":62},[52,2181,2000],{"class":443},[52,2183,420],{"class":62},[52,2185,2187,2189,2191,2193],{"class":54,"line":2186},27,[52,2188,2007],{"class":267},[52,2190,414],{"class":62},[52,2192,2012],{"class":443},[52,2194,420],{"class":62},[52,2196,2198,2200,2203,2206,2208,2210,2212,2215,2217,2220],{"class":54,"line":2197},28,[52,2199,1107],{"class":267},[52,2201,2202],{"class":62},": [",[52,2204,2205],{"class":443},"\"--build\"",[52,2207,286],{"class":62},[52,2209,2030],{"class":443},[52,2211,286],{"class":62},[52,2213,2214],{"class":443},"\"--config\"",[52,2216,286],{"class":62},[52,2218,2219],{"class":443},"\"Debug\"",[52,2221,2222],{"class":62},"],\n",[52,2224,2226,2228],{"class":54,"line":2225},29,[52,2227,2081],{"class":267},[52,2229,2095],{"class":62},[52,2231,2233,2236,2238,2240],{"class":54,"line":2232},30,[52,2234,2235],{"class":267},"                \"kind\"",[52,2237,414],{"class":62},[52,2239,2030],{"class":443},[52,2241,420],{"class":62},[52,2243,2245,2248,2250],{"class":54,"line":2244},31,[52,2246,2247],{"class":267},"                \"isDefault\"",[52,2249,414],{"class":62},[52,2251,2252],{"class":267},"true\n",[52,2254,2256],{"class":54,"line":2255},32,[52,2257,2144],{"class":62},[52,2259,2261,2263],{"class":54,"line":2260},33,[52,2262,2092],{"class":267},[52,2264,2095],{"class":62},[52,2266,2268,2270,2272,2274],{"class":54,"line":2267},34,[52,2269,2100],{"class":267},[52,2271,414],{"class":62},[52,2273,1387],{"class":267},[52,2275,420],{"class":62},[52,2277,2279,2281,2283,2285],{"class":54,"line":2278},35,[52,2280,2111],{"class":267},[52,2282,414],{"class":62},[52,2284,2116],{"class":443},[52,2286,420],{"class":62},[52,2288,2290,2292,2294,2296],{"class":54,"line":2289},36,[52,2291,2123],{"class":267},[52,2293,414],{"class":62},[52,2295,1120],{"class":267},[52,2297,420],{"class":62},[52,2299,2301,2303,2305],{"class":54,"line":2300},37,[52,2302,2134],{"class":267},[52,2304,414],{"class":62},[52,2306,2139],{"class":443},[52,2308,2310],{"class":54,"line":2309},38,[52,2311,2144],{"class":62},[52,2313,2315,2317,2319,2322],{"class":54,"line":2314},39,[52,2316,2149],{"class":267},[52,2318,2202],{"class":62},[52,2320,2321],{"class":443},"\"$msCompile\"",[52,2323,2324],{"class":62},"]\n",[52,2326,2328],{"class":54,"line":2327},40,[52,2329,588],{"class":62},[52,2331,2333],{"class":54,"line":2332},41,[52,2334,594],{"class":62},[52,2336,2338],{"class":54,"line":2337},42,[52,2339,82],{"class":62},[14,2341,2342,2343,2346,2347,2350,2351,2354,2355,2359,2360,2363],{},"​\t这个文件",[18,2344,2345],{},"定义了你在 VS Code 中可以运行的自定义任务","，比如编译、",[18,2348,2349],{},"运行脚本或执行外部命令","。它主要用于将你的 ",[18,2352,2353],{},"CMake 构建流程","集成到 VS Code 的工作流中，特别是与你之前的 ",[18,2356,2357],{},[49,2358,1025],{}," 文件（其中的 ",[49,2361,2362],{},"\"preLaunchTask\": \"Build\"","）配合使用。",[601,2365,2366,2376],{},[604,2367,2368],{},[607,2369,2370,2372,2374],{},[610,2371,612],{},[610,2373,615],{},[610,2375,618],{},[620,2377,2378,2392],{},[607,2379,2380,2386,2390],{},[625,2381,2382],{},[18,2383,2384],{},[49,2385,631],{},[625,2387,2388],{},[49,2389,1966],{},[625,2391,638],{},[607,2393,2394,2401,2405],{},[625,2395,2396],{},[18,2397,2398],{},[49,2399,2400],{},"tasks",[625,2402,2403],{},[49,2404,652],{},[625,2406,2407],{},"包含一个或多个任务定义。",[664,2409,2411,2412],{"id":2410},"任务一configure-cmake","任务一：",[49,2413,1989],{},[14,2415,2416,2417,2420],{},"​\t这个任务负责首次",[18,2418,2419],{},"配置你的 CMake 项目","，即生成项目文件。",[601,2422,2423,2433],{},[604,2424,2425],{},[607,2426,2427,2429,2431],{},[610,2428,612],{},[610,2430,615],{},[610,2432,618],{},[620,2434,2435,2454,2476,2498,2519,2540,2561,2576,2594,2615,2635],{},[607,2436,2437,2444,2448],{},[625,2438,2439],{},[18,2440,2441],{},[49,2442,2443],{},"label",[625,2445,2446],{},[49,2447,1989],{},[625,2449,2450,2453],{},[18,2451,2452],{},"任务名称。"," 用于在 VS Code 命令面板中识别这个任务。",[607,2455,2456,2462,2466],{},[625,2457,2458],{},[18,2459,2460],{},[49,2461,1266],{},[625,2463,2464],{},[49,2465,2000],{},[625,2467,2468,2471,2472,2475],{},[18,2469,2470],{},"任务类型。"," 表示它将运行一个外部 shell 命令（在这里是 ",[49,2473,2474],{},"cmake","）。",[607,2477,2478,2485,2489],{},[625,2479,2480],{},[18,2481,2482],{},[49,2483,2484],{},"command",[625,2486,2487],{},[49,2488,2012],{},[625,2490,2491,2494,2495,2497],{},[18,2492,2493],{},"执行的程序。"," 假设 ",[49,2496,2474],{}," 已经在系统的 PATH 中。",[607,2499,2500,2506,2510],{},[625,2501,2502],{},[18,2503,2504],{},[49,2505,1352],{},[625,2507,2508],{},[49,2509,652],{},[625,2511,2512,2518],{},[18,2513,2514,2515,2517],{},"传递给 ",[49,2516,2474],{}," 的参数。"," 这些参数定义了你的构建配置：",[607,2520,2521,2523,2528],{},[625,2522],{},[625,2524,2525],{},[49,2526,2527],{},"\"-B\", \"build\"",[625,2529,2530,2536,2537,1343],{},[18,2531,2532,2535],{},[49,2533,2534],{},"-B"," (Build Directory)。"," 指定生成的文件放在 ",[49,2538,2539],{},"build",[607,2541,2542,2544,2549],{},[625,2543],{},[625,2545,2546],{},[49,2547,2548],{},"\"-S\", \".\"",[625,2550,2551,2557,2558,979],{},[18,2552,2553,2556],{},[49,2554,2555],{},"-S"," (Source Directory)。"," 指定源代码的根目录是当前目录 (",[49,2559,2560],{},".",[607,2562,2563,2565,2570],{},[625,2564],{},[625,2566,2567],{},[49,2568,2569],{},"\"-DCMAKE_TOOLCHAIN_FILE=...\"",[625,2571,2572,2575],{},[18,2573,2574],{},"Vcpkg 集成。"," 明确指定 Vcpkg 工具链文件，确保 CMake 找到所有 Vcpkg 依赖项（如 GLFW）。",[607,2577,2578,2580,2585],{},[625,2579],{},[625,2581,2582],{},[49,2583,2584],{},"\"-G\", \"Visual Studio 17 2022\"",[625,2586,2587,2593],{},[18,2588,2589,2592],{},[49,2590,2591],{},"-G"," (Generator)。"," 指定使用 Visual Studio 2022 生成器来创建构建系统。",[607,2595,2596,2598,2603],{},[625,2597],{},[625,2599,2600],{},[49,2601,2602],{},"\"-A\", \"x64\"",[625,2604,2605,2611,2612,395],{},[18,2606,2607,2610],{},[49,2608,2609],{},"-A"," (Architecture)。"," 指定目标架构为 ",[18,2613,2614],{},"x64 (64位)",[607,2616,2617,2624,2628],{},[625,2618,2619],{},[18,2620,2621],{},[49,2622,2623],{},"group",[625,2625,2626],{},[49,2627,2030],{},[625,2629,2630,2631,2634],{},"将此任务归类为 ",[18,2632,2633],{},"构建"," 任务。",[607,2636,2637,2644,2648],{},[625,2638,2639],{},[18,2640,2641],{},[49,2642,2643],{},"problemMatcher",[625,2645,2646],{},[49,2647,1357],{},[625,2649,2650,2653],{},[18,2651,2652],{},"问题匹配器。"," 空数组表示这个任务不负责编译代码，所以不需要匹配编译器错误。",[2655,2656],"hr",{},[664,2658,2660,2661],{"id":2659},"任务二build","任务二：",[49,2662,1489],{},[14,2664,2665,2666,2669,2670,2672,2673,2675],{},"​\t这个任务",[18,2667,2668],{},"负责实际编译你的项目","。它是你在 ",[49,2671,1025],{}," 中用作 ",[49,2674,1484],{}," 的任务。",[601,2677,2678,2688],{},[604,2679,2680],{},[607,2681,2682,2684,2686],{},[610,2683,612],{},[610,2685,615],{},[610,2687,618],{},[620,2689,2690,2710,2727,2746,2765,2782,2798,2825],{},[607,2691,2692,2698,2702],{},[625,2693,2694],{},[18,2695,2696],{},[49,2697,2443],{},[625,2699,2700],{},[49,2701,1489],{},[625,2703,2704,2706,2707,2709],{},[18,2705,2452],{}," 这是 ",[49,2708,1025],{}," 中引用的名称。",[607,2711,2712,2718,2722],{},[625,2713,2714],{},[18,2715,2716],{},[49,2717,1266],{},[625,2719,2720],{},[49,2721,2000],{},[625,2723,2724,2726],{},[18,2725,2470],{}," 运行一个 shell 命令。",[607,2728,2729,2735,2739],{},[625,2730,2731],{},[18,2732,2733],{},[49,2734,2484],{},[625,2736,2737],{},[49,2738,2012],{},[625,2740,2741,2743,2744,395],{},[18,2742,2493],{}," 再次使用 ",[49,2745,2474],{},[607,2747,2748,2754,2759],{},[625,2749,2750],{},[18,2751,2752],{},[49,2753,1352],{},[625,2755,2756],{},[49,2757,2758],{},"[\"--build\", \"build\", \"--config\", \"Debug\"]",[625,2760,2761],{},[18,2762,2514,2763,2517],{},[49,2764,2474],{},[607,2766,2767,2769,2774],{},[625,2768],{},[625,2770,2771],{},[49,2772,2773],{},"\"--build\", \"build\"",[625,2775,2776,2777,2781],{},"告诉 CMake 运行 ",[18,2778,2779],{},[49,2780,2539],{}," 目录中的生成器（即 Visual Studio）。",[607,2783,2784,2786,2791],{},[625,2785],{},[625,2787,2788],{},[49,2789,2790],{},"\"--config\", \"Debug\"",[625,2792,2793,2794,2797],{},"指定要构建的配置是 ",[18,2795,2796],{},"Debug"," 版本。",[607,2799,2800,2806,2811],{},[625,2801,2802],{},[18,2803,2804],{},[49,2805,2623],{},[625,2807,2808],{},[49,2809,2810],{},"{ \"kind\": \"build\", \"isDefault\": true }",[625,2812,2813,2816,2817,2820,2821,2824],{},[18,2814,2815],{},"默认构建任务。"," 将此任务设置为默认构建任务，按下 ",[49,2818,2819],{},"Ctrl+Shift+B"," (Windows\u002FLinux) 或 ",[49,2822,2823],{},"Cmd+Shift+B"," (Mac) 时，就会执行它。",[607,2826,2827,2833,2838],{},[625,2828,2829],{},[18,2830,2831],{},[49,2832,2643],{},[625,2834,2835],{},[49,2836,2837],{},"[\"$msCompile\"]",[625,2839,2840,2842,2843,2846,2847,2849],{},[18,2841,2652],{}," 使用 ",[49,2844,2845],{},"$msCompile"," 模式来识别 ",[18,2848,1905],{}," 输出的错误和警告，并在 VS Code 中显示为波浪线。",[2851,2852,2853],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":47,"searchDepth":66,"depth":66,"links":2855},[2856,2857,2858,2859,2864,2868,2869,2876],{"id":12,"depth":66,"text":12},{"id":110,"depth":66,"text":110},{"id":142,"depth":66,"text":142},{"id":377,"depth":66,"text":380,"children":2860},[2861,2863],{"id":666,"depth":72,"text":2862},"configurations 数组中的配置对象",{"id":955,"depth":72,"text":955},{"id":1024,"depth":66,"text":1025,"children":2865},[2866],{"id":1221,"depth":72,"text":2867},"配置对象：Debug OpenGL Project",{"id":1516,"depth":66,"text":1517},{"id":1623,"depth":66,"text":2870,"children":2871},"settings.json 配置详解",[2872,2874],{"id":1672,"depth":72,"text":2873},"1. CMake Tools 配置（cmake.*）",{"id":1799,"depth":72,"text":2875},"2. C\u002FC++ 扩展默认配置（C_Cpp.default.*）",{"id":1947,"depth":66,"text":1948,"children":2877},[2878,2880],{"id":2410,"depth":72,"text":2879},"任务一：\"Configure CMake\"",{"id":2659,"depth":72,"text":2881},"任务二：\"Build\"","md",{},true,"\u002Fgraphy\u002Fopengel\u002F基础",{"description":47},"graphy\u002Fopengel\u002F基础","yuj_IzJ_BrSsmayKB3VxSU5fN93KtbWmUbkdnVj0vMo",1792338203661]