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