[{"data":1,"prerenderedAt":5982},["ShallowReactive",2],{"page-\u002Fgraphy\u002Fopengel\u002F光照贴图":3},{"id":4,"title":5,"body":6,"description":5975,"extension":5976,"meta":5977,"navigation":259,"path":5978,"seo":5979,"stem":5980,"__hash__":5981},"content\u002Fgraphy\u002Fopengel\u002F光照贴图.md","光照贴图",{"type":7,"value":8,"toc":5972},"minimark",[9,30,34,37,51,60,66,81,95,114,121,168,174,201,211,224,227,322,325,5675,5678,5689,5697,5702,5712,5715,5718,5729,5733,5740,5783,5792,5833,5836,5938,5945,5948,5951,5956,5965,5968],[10,11,12,13,17,18,21,22,25,26,29],"p",{},"上一节中的那个材质系统是肯定不够的，它只是一个最简单的模型，所以我们需要拓展之前的系统，引入",[14,15,16],"strong",{},"漫反射","和",[14,19,20],{},"镜面光","贴图(Map)。",[14,23,24],{},"这允许我们对物体的漫反射分量","（以及间接地对环境光分量，它们几乎总是一样的）和",[14,27,28],{},"镜面光分量有着更精确的控制","。",[31,32,33],"h1",{"id":33},"漫反射贴图",[10,35,36],{},"我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。有能够让我们根据片段在物体上的位置来获取颜色值的系统吗？",[10,38,39,40,46,47,50],{},"这可能听起来很熟悉，而且事实上这个系统我们已经使用很长时间了。这听起来很像在[之前](",[41,42,43],"a",{"href":43,"rel":44},"https:\u002F\u002Flearnopengl-cn.github.io\u002F01",[45],"nofollow"," Getting started\u002F06 Textures\u002F)教程中详细讨论过的",[14,48,49],{},"纹理","，而这基本就是这样：一个纹理。我们仅仅是对同样的原理使用了不同的名字：其实都是使用一张覆盖物体的图像，让我们能够逐片段索引其独立的颜色值。在光照场景中，它通常叫做一个漫反射贴图(Diffuse Map)（在PBR之前3D艺术家通常都这么叫它），它是一个表现了物体所有的漫反射颜色的纹理图像。",[10,52,53,54,59],{},"为了演示漫反射贴图，我们将会使用",[41,55,58],{"href":56,"rel":57},"https:\u002F\u002Flearnopengl-cn.github.io\u002Fimg\u002F02\u002F04\u002Fcontainer2.png",[45],"下面的图片","，它是一个有钢边框的木箱：",[10,61,62],{},[63,64],"img",{"alt":63,"src":65},".\u002Fassets\u002Fcontainer2.png",[10,67,68,71,72,76,77,80],{},[14,69,70],{},"在着色器中使用漫反射贴图的方法和纹理教程中是完全一样的","。但这次我们会将纹理储存为Material结构体中的一个",[73,74,75],"code",{},"sampler2D","。我们将之前定义的",[73,78,79],{},"vec3","漫反射颜色向量替换为漫反射贴图。",[10,82,83,84,86,87,90,91,94],{},"注意",[73,85,75],{},"是所谓的不透明类型(Opaque Type)，",[14,88,89],{},"也就是说我们不能将它实例化","，只能",[14,92,93],{},"通过uniform来定义它","。如果我们使用除uniform以外的方法（比如函数的参数）实例化这个结构体，GLSL会抛出一些奇怪的错误。这同样也适用于任何封装了不透明类型的结构体。",[96,97,98,104],"blockquote",{},[10,99,100],{},[101,102,103],"span",{},"!NOTE",[10,105,106,107,109,110,113],{},"如果你非常固执，仍想将环境光颜色设置为一个（漫反射值之外）不同的值，你也可以保留这个环境光的",[73,108,79],{},"，但",[14,111,112],{},"整个物体仍只能拥有一个环境光颜色","。如果想要对不同片段有不同的环境光值，你需要对环境光值单独使用另外一个纹理。",[10,115,116,117,120],{},"注意我们将在片段着色器中再次需要纹理坐标，所以我们声明一个额外的输入变量。接下来我们",[14,118,119],{},"只需要从纹理中采样片段的漫反射颜色值即可","：",[122,123,128],"pre",{"className":124,"code":125,"language":126,"meta":127,"style":127},"language-glsl shiki shiki-themes github-light github-dark","vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));\n","glsl","",[73,129,130],{"__ignoreMap":127},[101,131,134,137,141,144,147,150,153,155,158,161,165],{"class":132,"line":133},"line",1,[101,135,79],{"class":136},"szBVR",[101,138,140],{"class":139},"sVt8B"," diffuse ",[101,142,143],{"class":136},"=",[101,145,146],{"class":139}," light.diffuse ",[101,148,149],{"class":136},"*",[101,151,152],{"class":139}," diff ",[101,154,149],{"class":136},[101,156,157],{"class":136}," vec3",[101,159,160],{"class":139},"(",[101,162,164],{"class":163},"sScJk","texture",[101,166,167],{"class":139},"(material.diffuse, TexCoords));\n",[10,169,170,171,29],{},"不要忘记将环境光的材质颜色",[14,172,173],{},"设置为漫反射材质颜色同样的值",[122,175,177],{"className":124,"code":176,"language":126,"meta":127,"style":127},"vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));\n",[73,178,179],{"__ignoreMap":127},[101,180,181,183,186,188,191,193,195,197,199],{"class":132,"line":133},[101,182,79],{"class":136},[101,184,185],{"class":139}," ambient ",[101,187,143],{"class":136},[101,189,190],{"class":139}," light.ambient ",[101,192,149],{"class":136},[101,194,157],{"class":136},[101,196,160],{"class":139},[101,198,164],{"class":163},[101,200,167],{"class":139},[10,202,203,204,207,208],{},"这就是使用漫反射贴图的全部步骤了。你可以看到，这并不是什么新的东西，但这能够极大地提高视觉品质。",[14,205,206],{},"为了让它正常工作，我们还需要使用纹理坐标更新顶点数据","，将它们作为顶点属性传递到片段着色器，",[14,209,210],{},"加载材质并绑定材质到合适的纹理单元。",[212,213,214,218,221],"ul",{},[215,216,217],"li",{},"纹理模式：颜色来自纹理，光照强度来自光源",[215,219,220],{},"纯颜色模式：颜色来自材质属性，光照强度来自光源",[215,222,223],{},"混合模式：颜色 = 纹理颜色 × 材质颜色，光照强度来自光源",[10,225,226],{},"当前代码使用的是：纹理颜色（环境光\u002F漫反射）+ 材质颜色（镜面反射）",[122,228,230],{"className":124,"code":229,"language":126,"meta":127,"style":127},"\u002F\u002F 环境光：使用纹理颜色\nvec3 ambient = light.ambient * textureColor;\n\n\u002F\u002F 漫反射：使用纹理颜色\nvec3 diffuse = light.diffuse * (diff * textureColor);\n\n\u002F\u002F 镜面反射：使用材质颜色（material.specular）\nvec3 specular = light.specular * (spec * material.specular);\n",[73,231,232,238,254,261,267,288,293,299],{"__ignoreMap":127},[101,233,234],{"class":132,"line":133},[101,235,237],{"class":236},"sJ8bj","\u002F\u002F 环境光：使用纹理颜色\n",[101,239,241,243,245,247,249,251],{"class":132,"line":240},2,[101,242,79],{"class":136},[101,244,185],{"class":139},[101,246,143],{"class":136},[101,248,190],{"class":139},[101,250,149],{"class":136},[101,252,253],{"class":139}," textureColor;\n",[101,255,257],{"class":132,"line":256},3,[101,258,260],{"emptyLinePlaceholder":259},true,"\n",[101,262,264],{"class":132,"line":263},4,[101,265,266],{"class":236},"\u002F\u002F 漫反射：使用纹理颜色\n",[101,268,270,272,274,276,278,280,283,285],{"class":132,"line":269},5,[101,271,79],{"class":136},[101,273,140],{"class":139},[101,275,143],{"class":136},[101,277,146],{"class":139},[101,279,149],{"class":136},[101,281,282],{"class":139}," (diff ",[101,284,149],{"class":136},[101,286,287],{"class":139}," textureColor);\n",[101,289,291],{"class":132,"line":290},6,[101,292,260],{"emptyLinePlaceholder":259},[101,294,296],{"class":132,"line":295},7,[101,297,298],{"class":236},"\u002F\u002F 镜面反射：使用材质颜色（material.specular）\n",[101,300,302,304,307,309,312,314,317,319],{"class":132,"line":301},8,[101,303,79],{"class":136},[101,305,306],{"class":139}," specular ",[101,308,143],{"class":136},[101,310,311],{"class":139}," light.specular ",[101,313,149],{"class":136},[101,315,316],{"class":139}," (spec ",[101,318,149],{"class":136},[101,320,321],{"class":139}," material.specular);\n",[10,323,324],{},"完整代码如下：",[122,326,330],{"className":327,"code":328,"language":329,"meta":127,"style":127},"language-c++ shiki shiki-themes github-light github-dark","#include \u003Cglad\u002Fglad.h>\n#include \u003CGLFW\u002Fglfw3.h>\n#include \u003Ciostream>\n#include \u003Ccmath>\n#include \u003Cimgui.h>\n#include \u003Cimgui_impl_glfw.h>\n#include \u003Cimgui_impl_opengl3.h>\n#include \u003Copencv2\u002Fopencv.hpp>\n#include \u003Copencv2\u002Fimgcodecs.hpp>\n#include \"utils\u002Fshader.h\"\n#include \"utils\u002FglmCompute.h\"\n#include \"include\u002Fdpi_stabilizer.h\"\n#include \"include\u002Fimgui_manager.h\"\n\nusing namespace glm;\nusing namespace cv;\n\n\u002F\u002F 使用 OpenCV 加载纹理\nunsigned int loadTexture(const char* path) {\n    unsigned int textureID;\n    glGenTextures(1, &textureID);\n    \n    \u002F\u002F 使用 OpenCV 读取图像\n    Mat image = imread(path, IMREAD_COLOR);\n    if (image.empty()) {\n        std::cout \u003C\u003C \"Failed to load texture at path: \" \u003C\u003C path \u003C\u003C std::endl;\n        return textureID;\n    }\n    \n    \u002F\u002F OpenCV 使用 BGR，OpenGL 使用 RGB，需要转换\n    Mat rgbImage;\n    cvtColor(image, rgbImage, COLOR_BGR2RGB);\n    \n    \u002F\u002F 翻转图像（OpenGL 期望的 Y 轴方向）\n    flip(rgbImage, rgbImage, 0);\n    \n    glBindTexture(GL_TEXTURE_2D, textureID);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, rgbImage.cols, rgbImage.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, rgbImage.data);\n    glGenerateMipmap(GL_TEXTURE_2D);\n    \n    \u002F\u002F 设置纹理参数\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    \n    return textureID;\n}\n\n\u002F\u002F 窗口大小改变时的回调函数\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height) {\n    glViewport(0, 0, width, height);\n}\n\n\n\u002F\u002F 全局变量\nfloat deltaTime = 0.0f; \u002F\u002F 当前帧与上一帧的时间差\nfloat lastFrame = 0.0f; \u002F\u002F 上一帧的时间\n\n\u002F\u002F DPI 稳定器实例\nDPIStabilizer dpiStabilizer(0.1f, 50.0f, 0.8f);\n\n\u002F\u002F ImGui 管理器实例\nImGuiManager imguiManager;\n\n\u002F\u002F 简化的输入处理函数\nvoid processInput(GLFWwindow *window){\n    \u002F\u002F 使用 DPI 稳定器处理所有输入\n    dpiStabilizer.processKeyboardInput(window);\n\n    if (glfwGetKey(window, GLFW_KEY_F2) == GLFW_PRESS) {\n        imguiManager.toggleWindow(\"控制面板\");\n    }\n    if (glfwGetKey(window, GLFW_KEY_F3) == GLFW_PRESS) {\n        imguiManager.toggleWindow(\"性能监控\");\n    }\n    if (glfwGetKey(window, GLFW_KEY_F4) == GLFW_PRESS) {\n        imguiManager.toggleWindow(\"调试信息\");\n    }\n    \n    \u002F\u002F 显示统计信息 (按 T 键)\n    if (glfwGetKey(window, GLFW_KEY_T) == GLFW_PRESS) {\n        std::cout \u003C\u003C dpiStabilizer.getStats() \u003C\u003C std::endl;\n    }\n}\n\nint main() {\n\n    \u002F\u002F 模型矩阵\n    mat4 model = mat4(1.0f);\n    model = rotate(model, radians(-55.0f), vec3(1.0f, 0.0f, 0.0f));\n\n    \u002F\u002F 投影矩阵\n    mat4 projection = perspective(radians(45.0f), (float)800 \u002F (float)600, 0.1f, 100.0f);\n\n    \u002F\u002F 初始化GLFW\n    glfwInit();\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);\n    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n    \n    \u002F\u002F 设置 DPI 感知提示\n    DPIStabilizer::setDPIHint();\n\n    \u002F\u002F 创建窗口\n    GLFWwindow* window = glfwCreateWindow(800, 600, \"OpenGL Window\", NULL, NULL);\n    if (window == NULL) {\n        std::cout \u003C\u003C \"Failed to create GLFW window\" \u003C\u003C std::endl;\n        glfwTerminate();\n        return -1;\n    }\n\n    glfwMakeContextCurrent(window);\n    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n    \n    \u002F\u002F 初始化 DPI 稳定器\n    dpiStabilizer.initialize(window);\n\n    \u002F\u002F 初始化GLAD\n    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {\n        std::cout \u003C\u003C \"Failed to initialize GLAD\" \u003C\u003C std::endl;\n        return -1;\n    }\n\n    \u002F\u002F 初始化 ImGui 管理器\n    imguiManager.initialize(window);\n    \n    \u002F\u002F 注册窗口\n    imguiManager.registerWindow(\"Hello ImGui!\", []() {\n        ImGui::Text(\"DPI 稳定器状态: %s\", dpiStabilizer.isMouseCaptured() ? \"已捕获\" : \"已释放\");\n        ImGui::Text(\"鼠标敏感度: %.3f\", dpiStabilizer.getSensitivity());\n        \n        if (ImGui::Button(\"重置统计\")) {\n            dpiStabilizer.resetStats();\n        }\n        \n        float sensitivity = dpiStabilizer.getSensitivity();\n        if (ImGui::SliderFloat(\"鼠标敏感度\", &sensitivity, 0.01f, 0.5f)) {\n            dpiStabilizer.setSensitivity(sensitivity);\n        }\n    });\n    \n    imguiManager.registerWindow(\"控制面板\", []() {\n        ImGuiIO& io = ImGui::GetIO();\n        ImGui::Text(\"FPS: %.1f\", io.Framerate);\n        ImGui::Text(\"帧时间: %.3f ms\", 1000.0f \u002F io.Framerate);\n    });\n    \n\n    \u002F\u002F 启用深度测试\n    glEnable(GL_DEPTH_TEST);\n\n    float vertices[] = {\n    \u002F\u002F 立方体顶点数据（位置 + 法线 + 纹理坐标）\n    \u002F\u002F 位置(3) + 法线(3) + 纹理坐标(2) = 8个浮点数\n    \u002F\u002F 前面\n    -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  0.0f, 0.0f,\n     0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  1.0f, 0.0f,\n     0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  1.0f, 1.0f,\n     0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  1.0f, 1.0f,\n    -0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  0.0f, 1.0f,\n    -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  0.0f, 0.0f,\n    \n    \u002F\u002F 后面\n    -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  0.0f, 0.0f,\n     0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  1.0f, 0.0f,\n     0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  1.0f, 1.0f,\n     0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  1.0f, 1.0f,\n    -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  0.0f, 1.0f,\n    -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  0.0f, 0.0f,\n    \n    \u002F\u002F 左面\n    -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,  1.0f, 0.0f,\n    -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,  1.0f, 1.0f,\n    -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,  0.0f, 1.0f,\n    -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,  0.0f, 1.0f,\n    -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,  0.0f, 0.0f,\n    -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,  1.0f, 0.0f,\n    \n    \u002F\u002F 右面\n     0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,  1.0f, 0.0f,\n     0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,  1.0f, 1.0f,\n     0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,  0.0f, 1.0f,\n     0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,  0.0f, 1.0f,\n     0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,  0.0f, 0.0f,\n     0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,  1.0f, 0.0f,\n    \n    \u002F\u002F 下面\n    -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,  0.0f, 1.0f,\n     0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,  1.0f, 1.0f,\n     0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,  1.0f, 0.0f,\n     0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,  1.0f, 0.0f,\n    -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,  0.0f, 0.0f,\n    -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,  0.0f, 1.0f,\n    \n    \u002F\u002F 上面\n    -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  0.0f, 1.0f,\n     0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  1.0f, 1.0f,\n     0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,  1.0f, 0.0f,\n     0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,  1.0f, 0.0f,\n    -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,  0.0f, 0.0f,\n    -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  0.0f, 1.0f\n};\n    \n    \u002F\u002F 创建VAO\n    unsigned int VAO;\n    glGenVertexArrays(1, &VAO);\n    glBindVertexArray(VAO); \u002F\u002F 绑定VAO\n\n    \u002F\u002F 创建VBO\n    unsigned int VBO;\n    glGenBuffers(1, &VBO);\n    glBindBuffer(GL_ARRAY_BUFFER, VBO); \u002F\u002F 绑定VBO\n    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n    int nrAttributes;\n    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);\n    std::cout \u003C\u003C \"Maximum nr of vertex attributes supported: \" \u003C\u003C nrAttributes \u003C\u003C std::endl;\n\n    \u002F\u002F 位置属性\n    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);\n    glEnableVertexAttribArray(0); \u002F\u002F 启用顶点属性\n    \n    \u002F\u002F 法线属性\n    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));\n    glEnableVertexAttribArray(1); \u002F\u002F 启用法线属性\n    \n    \u002F\u002F 纹理坐标属性\n    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));\n    glEnableVertexAttribArray(2); \u002F\u002F 启用纹理坐标属性\n\n    \u002F\u002F 构建并编译着色器程序\n    Shader lightingShader(\"shader\u002Flighting.vert\", \"shader\u002Flighting.frag\");\n    Shader lampShader(\"shader\u002Flamp.vert\", \"shader\u002Flamp.frag\");\n\n    \u002F\u002F 加载纹理\n    unsigned int texture1 = loadTexture(\"Assets\u002Fimage.png\");\n    if (texture1 == 0) {\n        std::cout \u003C\u003C \"Failed to load texture\" \u003C\u003C std::endl;\n    }\n\n    \u002F\u002F 创建光源的 VAO\n    unsigned int lightVAO;\n    glGenVertexArrays(1, &lightVAO);\n    glBindVertexArray(lightVAO);\n    glBindBuffer(GL_ARRAY_BUFFER, VBO);\n    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);\n    glEnableVertexAttribArray(0);\n\n    \u002F\u002F 光源位置\n    vec3 lightPos(1.2f, 1.0f, 2.0f);\n    \n    \u002F\u002F 相机位置（观察空间）\n    vec3 viewPos = dpiStabilizer.getCameraPosition();\n\n    \u002F\u002F 渲染循环\n    while (!glfwWindowShouldClose(window)) {\n        \u002F\u002F 处理输入\n        processInput(window);\n        glfwPollEvents();\n\n        \u002F\u002F 从 DPI 稳定器获取 view 矩阵\n        mat4 view = dpiStabilizer.getViewMatrix();\n        \n        float currentFrame = glfwGetTime();\n        deltaTime = currentFrame - lastFrame;\n        lastFrame = currentFrame;\n\n        \u002F\u002F 渲染指令\n        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);\n        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n        \n        \u002F\u002F 使用光照着色器绘制物体\n        lightingShader.use();\n        \n        \u002F\u002F 绑定纹理\n        glActiveTexture(GL_TEXTURE0);\n        glBindTexture(GL_TEXTURE_2D, texture1);\n        lightingShader.setInt(\"material.diffuse\", 0);\n        \n        lightingShader.setMat4(\"projection\", projection);\n        lightingShader.setMat4(\"view\", view);\n        lightingShader.setMat4(\"model\", model);\n        lightingShader.setVec3(\"light.position\", lightPos.x, lightPos.y, lightPos.z);\n        lightingShader.setVec3(\"light.ambient\",  1.0f, 1.0f, 1.0f);   \u002F\u002F 最大环境光强度\n        lightingShader.setVec3(\"light.diffuse\",  1.0f, 1.0f, 1.0f);   \u002F\u002F 增加漫反射强度\n        lightingShader.setVec3(\"light.specular\", 1.0f, 1.0f, 1.0f); \n        lightingShader.setVec3(\"material.specular\", 0.633f, 0.727811f, 0.633f);\n        \u002F\u002F 高光指数：通常乘以 128 (OpenGL 最大的 1.0 对应 128)\n        lightingShader.setFloat(\"material.shininess\", 0.6f * 128.0f); \u002F\u002F 76.8\n        \n        \u002F\u002F 设置相机位置（观察空间）\n        vec3 currentViewPos = dpiStabilizer.getCameraPosition();\n        lightingShader.setVec3(\"viewPos\", currentViewPos.x, currentViewPos.y, currentViewPos.z);\n        \n        glBindVertexArray(VAO);\n        glDrawArrays(GL_TRIANGLES, 0, 36);\n        \n        \u002F\u002F 绘制光源立方体\n        lampShader.use();\n        lampShader.setMat4(\"projection\", projection);\n        lampShader.setMat4(\"view\", view);\n        \n        \u002F\u002F 光源立方体的模型矩阵\n        mat4 lampModel = mat4(1.0f);\n        lampModel = translate(lampModel, lightPos);\n        lampModel = scale(lampModel, vec3(0.2f)); \u002F\u002F 缩小光源立方体\n        lampShader.setMat4(\"model\", lampModel);\n        \n        glBindVertexArray(lightVAO);\n        glDrawArrays(GL_TRIANGLES, 0, 36);\n        \n        \u002F\u002F 使用 ImGui 管理器渲染所有窗口\n        imguiManager.render();\n\n        \u002F\u002F 交换缓冲区和检查IO事件\n        glfwSwapBuffers(window);\n    }\n\n    \u002F\u002F 清理 ImGui 管理器\n    imguiManager.shutdown();\n\n    \u002F\u002F 清理资源\n    glDeleteVertexArrays(1, &VAO);\n    glDeleteVertexArrays(1, &lightVAO);\n    glDeleteBuffers(1, &VBO);\n    glDeleteTextures(1, &texture1);\n    glfwTerminate();\n    return 0;\n}\n\n","c++",[73,331,332,341,348,355,362,369,376,383,390,398,406,414,422,430,435,450,462,467,473,500,511,532,538,544,561,576,605,613,619,624,630,638,647,652,658,673,678,687,706,715,720,726,735,743,751,759,764,772,778,783,789,825,842,847,852,857,863,886,905,910,916,948,953,959,965,970,976,997,1003,1015,1020,1040,1056,1061,1077,1091,1096,1112,1126,1131,1136,1142,1158,1182,1187,1192,1197,1208,1213,1219,1242,1296,1301,1307,1369,1374,1380,1389,1403,1415,1423,1428,1434,1448,1453,1459,1499,1514,1532,1540,1552,1557,1562,1570,1579,1584,1590,1600,1605,1611,1627,1645,1656,1661,1666,1672,1682,1687,1693,1709,1753,1780,1786,1810,1821,1827,1832,1849,1889,1900,1905,1911,1916,1929,1952,1974,2005,2010,2015,2020,2026,2035,2040,2054,2060,2066,2072,2130,2184,2235,2286,2339,2394,2399,2405,2464,2521,2576,2631,2688,2747,2752,2758,2813,2870,2929,2988,3045,3100,3105,3111,3162,3215,3270,3325,3378,3429,3434,3440,3499,3556,3611,3666,3723,3782,3787,3793,3848,3901,3952,4003,4056,4110,4116,4121,4127,4137,4154,4166,4171,4177,4187,4204,4216,4231,4236,4245,4259,4283,4288,4294,4334,4350,4355,4361,4406,4420,4425,4431,4476,4490,4495,4501,4522,4542,4547,4553,4574,4589,4607,4612,4617,4623,4633,4649,4657,4665,4700,4711,4716,4722,4753,4758,4764,4781,4786,4792,4808,4814,4822,4830,4835,4841,4859,4864,4879,4894,4905,4910,4916,4950,4965,4970,4976,4987,4992,4998,5007,5016,5035,5040,5056,5071,5086,5102,5137,5172,5205,5239,5245,5277,5282,5288,5305,5320,5325,5334,5352,5357,5363,5373,5386,5399,5404,5410,5430,5444,5471,5485,5490,5497,5512,5517,5523,5533,5538,5544,5552,5557,5562,5568,5578,5583,5589,5605,5620,5636,5653,5661,5670],{"__ignoreMap":127},[101,333,334,337],{"class":132,"line":133},[101,335,336],{"class":136},"#include",[101,338,340],{"class":339},"sZZnC"," \u003Cglad\u002Fglad.h>\n",[101,342,343,345],{"class":132,"line":240},[101,344,336],{"class":136},[101,346,347],{"class":339}," \u003CGLFW\u002Fglfw3.h>\n",[101,349,350,352],{"class":132,"line":256},[101,351,336],{"class":136},[101,353,354],{"class":339}," \u003Ciostream>\n",[101,356,357,359],{"class":132,"line":263},[101,358,336],{"class":136},[101,360,361],{"class":339}," \u003Ccmath>\n",[101,363,364,366],{"class":132,"line":269},[101,365,336],{"class":136},[101,367,368],{"class":339}," \u003Cimgui.h>\n",[101,370,371,373],{"class":132,"line":290},[101,372,336],{"class":136},[101,374,375],{"class":339}," \u003Cimgui_impl_glfw.h>\n",[101,377,378,380],{"class":132,"line":295},[101,379,336],{"class":136},[101,381,382],{"class":339}," \u003Cimgui_impl_opengl3.h>\n",[101,384,385,387],{"class":132,"line":301},[101,386,336],{"class":136},[101,388,389],{"class":339}," \u003Copencv2\u002Fopencv.hpp>\n",[101,391,393,395],{"class":132,"line":392},9,[101,394,336],{"class":136},[101,396,397],{"class":339}," \u003Copencv2\u002Fimgcodecs.hpp>\n",[101,399,401,403],{"class":132,"line":400},10,[101,402,336],{"class":136},[101,404,405],{"class":339}," \"utils\u002Fshader.h\"\n",[101,407,409,411],{"class":132,"line":408},11,[101,410,336],{"class":136},[101,412,413],{"class":339}," \"utils\u002FglmCompute.h\"\n",[101,415,417,419],{"class":132,"line":416},12,[101,418,336],{"class":136},[101,420,421],{"class":339}," \"include\u002Fdpi_stabilizer.h\"\n",[101,423,425,427],{"class":132,"line":424},13,[101,426,336],{"class":136},[101,428,429],{"class":339}," \"include\u002Fimgui_manager.h\"\n",[101,431,433],{"class":132,"line":432},14,[101,434,260],{"emptyLinePlaceholder":259},[101,436,438,441,444,447],{"class":132,"line":437},15,[101,439,440],{"class":136},"using",[101,442,443],{"class":136}," namespace",[101,445,446],{"class":163}," glm",[101,448,449],{"class":139},";\n",[101,451,453,455,457,460],{"class":132,"line":452},16,[101,454,440],{"class":136},[101,456,443],{"class":136},[101,458,459],{"class":163}," cv",[101,461,449],{"class":139},[101,463,465],{"class":132,"line":464},17,[101,466,260],{"emptyLinePlaceholder":259},[101,468,470],{"class":132,"line":469},18,[101,471,472],{"class":236},"\u002F\u002F 使用 OpenCV 加载纹理\n",[101,474,476,479,482,485,487,490,493,497],{"class":132,"line":475},19,[101,477,478],{"class":136},"unsigned",[101,480,481],{"class":136}," int",[101,483,484],{"class":163}," loadTexture",[101,486,160],{"class":139},[101,488,489],{"class":136},"const",[101,491,492],{"class":136}," char*",[101,494,496],{"class":495},"s4XuR"," path",[101,498,499],{"class":139},") {\n",[101,501,503,506,508],{"class":132,"line":502},20,[101,504,505],{"class":136},"    unsigned",[101,507,481],{"class":136},[101,509,510],{"class":139}," textureID;\n",[101,512,514,517,519,523,526,529],{"class":132,"line":513},21,[101,515,516],{"class":163},"    glGenTextures",[101,518,160],{"class":139},[101,520,522],{"class":521},"sj4cs","1",[101,524,525],{"class":139},", ",[101,527,528],{"class":136},"&",[101,530,531],{"class":139},"textureID);\n",[101,533,535],{"class":132,"line":534},22,[101,536,537],{"class":139},"    \n",[101,539,541],{"class":132,"line":540},23,[101,542,543],{"class":236},"    \u002F\u002F 使用 OpenCV 读取图像\n",[101,545,547,550,553,555,558],{"class":132,"line":546},24,[101,548,549],{"class":163},"    Mat",[101,551,552],{"class":139}," image ",[101,554,143],{"class":136},[101,556,557],{"class":163}," imread",[101,559,560],{"class":139},"(path, IMREAD_COLOR);\n",[101,562,564,567,570,573],{"class":132,"line":563},25,[101,565,566],{"class":136},"    if",[101,568,569],{"class":139}," (image.",[101,571,572],{"class":163},"empty",[101,574,575],{"class":139},"()) {\n",[101,577,579,582,585,588,591,594,597,599,602],{"class":132,"line":578},26,[101,580,581],{"class":163},"        std",[101,583,584],{"class":139},"::cout ",[101,586,587],{"class":136},"\u003C\u003C",[101,589,590],{"class":339}," \"Failed to load texture at path: \"",[101,592,593],{"class":136}," \u003C\u003C",[101,595,596],{"class":139}," path ",[101,598,587],{"class":136},[101,600,601],{"class":163}," std",[101,603,604],{"class":139},"::endl;\n",[101,606,608,611],{"class":132,"line":607},27,[101,609,610],{"class":136},"        return",[101,612,510],{"class":139},[101,614,616],{"class":132,"line":615},28,[101,617,618],{"class":139},"    }\n",[101,620,622],{"class":132,"line":621},29,[101,623,537],{"class":139},[101,625,627],{"class":132,"line":626},30,[101,628,629],{"class":236},"    \u002F\u002F OpenCV 使用 BGR，OpenGL 使用 RGB，需要转换\n",[101,631,633,635],{"class":132,"line":632},31,[101,634,549],{"class":163},[101,636,637],{"class":139}," rgbImage;\n",[101,639,641,644],{"class":132,"line":640},32,[101,642,643],{"class":163},"    cvtColor",[101,645,646],{"class":139},"(image, rgbImage, COLOR_BGR2RGB);\n",[101,648,650],{"class":132,"line":649},33,[101,651,537],{"class":139},[101,653,655],{"class":132,"line":654},34,[101,656,657],{"class":236},"    \u002F\u002F 翻转图像（OpenGL 期望的 Y 轴方向）\n",[101,659,661,664,667,670],{"class":132,"line":660},35,[101,662,663],{"class":163},"    flip",[101,665,666],{"class":139},"(rgbImage, rgbImage, ",[101,668,669],{"class":521},"0",[101,671,672],{"class":139},");\n",[101,674,676],{"class":132,"line":675},36,[101,677,537],{"class":139},[101,679,681,684],{"class":132,"line":680},37,[101,682,683],{"class":163},"    glBindTexture",[101,685,686],{"class":139},"(GL_TEXTURE_2D, textureID);\n",[101,688,690,693,696,698,701,703],{"class":132,"line":689},38,[101,691,692],{"class":163},"    glTexImage2D",[101,694,695],{"class":139},"(GL_TEXTURE_2D, ",[101,697,669],{"class":521},[101,699,700],{"class":139},", GL_RGB, rgbImage.cols, rgbImage.rows, ",[101,702,669],{"class":521},[101,704,705],{"class":139},", GL_RGB, GL_UNSIGNED_BYTE, rgbImage.data);\n",[101,707,709,712],{"class":132,"line":708},39,[101,710,711],{"class":163},"    glGenerateMipmap",[101,713,714],{"class":139},"(GL_TEXTURE_2D);\n",[101,716,718],{"class":132,"line":717},40,[101,719,537],{"class":139},[101,721,723],{"class":132,"line":722},41,[101,724,725],{"class":236},"    \u002F\u002F 设置纹理参数\n",[101,727,729,732],{"class":132,"line":728},42,[101,730,731],{"class":163},"    glTexParameteri",[101,733,734],{"class":139},"(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n",[101,736,738,740],{"class":132,"line":737},43,[101,739,731],{"class":163},[101,741,742],{"class":139},"(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n",[101,744,746,748],{"class":132,"line":745},44,[101,747,731],{"class":163},[101,749,750],{"class":139},"(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n",[101,752,754,756],{"class":132,"line":753},45,[101,755,731],{"class":163},[101,757,758],{"class":139},"(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n",[101,760,762],{"class":132,"line":761},46,[101,763,537],{"class":139},[101,765,767,770],{"class":132,"line":766},47,[101,768,769],{"class":136},"    return",[101,771,510],{"class":139},[101,773,775],{"class":132,"line":774},48,[101,776,777],{"class":139},"}\n",[101,779,781],{"class":132,"line":780},49,[101,782,260],{"emptyLinePlaceholder":259},[101,784,786],{"class":132,"line":785},50,[101,787,788],{"class":236},"\u002F\u002F 窗口大小改变时的回调函数\n",[101,790,792,795,798,800,803,805,808,810,813,816,818,820,823],{"class":132,"line":791},51,[101,793,794],{"class":136},"void",[101,796,797],{"class":163}," framebuffer_size_callback",[101,799,160],{"class":139},[101,801,802],{"class":163},"GLFWwindow",[101,804,149],{"class":136},[101,806,807],{"class":495}," window",[101,809,525],{"class":139},[101,811,812],{"class":136},"int",[101,814,815],{"class":495}," width",[101,817,525],{"class":139},[101,819,812],{"class":136},[101,821,822],{"class":495}," height",[101,824,499],{"class":139},[101,826,828,831,833,835,837,839],{"class":132,"line":827},52,[101,829,830],{"class":163},"    glViewport",[101,832,160],{"class":139},[101,834,669],{"class":521},[101,836,525],{"class":139},[101,838,669],{"class":521},[101,840,841],{"class":139},", width, height);\n",[101,843,845],{"class":132,"line":844},53,[101,846,777],{"class":139},[101,848,850],{"class":132,"line":849},54,[101,851,260],{"emptyLinePlaceholder":259},[101,853,855],{"class":132,"line":854},55,[101,856,260],{"emptyLinePlaceholder":259},[101,858,860],{"class":132,"line":859},56,[101,861,862],{"class":236},"\u002F\u002F 全局变量\n",[101,864,866,869,872,874,877,880,883],{"class":132,"line":865},57,[101,867,868],{"class":136},"float",[101,870,871],{"class":139}," deltaTime ",[101,873,143],{"class":136},[101,875,876],{"class":521}," 0.0",[101,878,879],{"class":136},"f",[101,881,882],{"class":139},";",[101,884,885],{"class":236}," \u002F\u002F 当前帧与上一帧的时间差\n",[101,887,889,891,894,896,898,900,902],{"class":132,"line":888},58,[101,890,868],{"class":136},[101,892,893],{"class":139}," lastFrame ",[101,895,143],{"class":136},[101,897,876],{"class":521},[101,899,879],{"class":136},[101,901,882],{"class":139},[101,903,904],{"class":236}," \u002F\u002F 上一帧的时间\n",[101,906,908],{"class":132,"line":907},59,[101,909,260],{"emptyLinePlaceholder":259},[101,911,913],{"class":132,"line":912},60,[101,914,915],{"class":236},"\u002F\u002F DPI 稳定器实例\n",[101,917,919,922,925,927,930,932,934,937,939,941,944,946],{"class":132,"line":918},61,[101,920,921],{"class":163},"DPIStabilizer",[101,923,924],{"class":163}," dpiStabilizer",[101,926,160],{"class":139},[101,928,929],{"class":521},"0.1",[101,931,879],{"class":136},[101,933,525],{"class":139},[101,935,936],{"class":521},"50.0",[101,938,879],{"class":136},[101,940,525],{"class":139},[101,942,943],{"class":521},"0.8",[101,945,879],{"class":136},[101,947,672],{"class":139},[101,949,951],{"class":132,"line":950},62,[101,952,260],{"emptyLinePlaceholder":259},[101,954,956],{"class":132,"line":955},63,[101,957,958],{"class":236},"\u002F\u002F ImGui 管理器实例\n",[101,960,962],{"class":132,"line":961},64,[101,963,964],{"class":139},"ImGuiManager imguiManager;\n",[101,966,968],{"class":132,"line":967},65,[101,969,260],{"emptyLinePlaceholder":259},[101,971,973],{"class":132,"line":972},66,[101,974,975],{"class":236},"\u002F\u002F 简化的输入处理函数\n",[101,977,979,981,984,986,988,991,994],{"class":132,"line":978},67,[101,980,794],{"class":136},[101,982,983],{"class":163}," processInput",[101,985,160],{"class":139},[101,987,802],{"class":163},[101,989,990],{"class":136}," *",[101,992,993],{"class":495},"window",[101,995,996],{"class":139},"){\n",[101,998,1000],{"class":132,"line":999},68,[101,1001,1002],{"class":236},"    \u002F\u002F 使用 DPI 稳定器处理所有输入\n",[101,1004,1006,1009,1012],{"class":132,"line":1005},69,[101,1007,1008],{"class":139},"    dpiStabilizer.",[101,1010,1011],{"class":163},"processKeyboardInput",[101,1013,1014],{"class":139},"(window);\n",[101,1016,1018],{"class":132,"line":1017},70,[101,1019,260],{"emptyLinePlaceholder":259},[101,1021,1023,1025,1028,1031,1034,1037],{"class":132,"line":1022},71,[101,1024,566],{"class":136},[101,1026,1027],{"class":139}," (",[101,1029,1030],{"class":163},"glfwGetKey",[101,1032,1033],{"class":139},"(window, GLFW_KEY_F2) ",[101,1035,1036],{"class":136},"==",[101,1038,1039],{"class":139}," GLFW_PRESS) {\n",[101,1041,1043,1046,1049,1051,1054],{"class":132,"line":1042},72,[101,1044,1045],{"class":139},"        imguiManager.",[101,1047,1048],{"class":163},"toggleWindow",[101,1050,160],{"class":139},[101,1052,1053],{"class":339},"\"控制面板\"",[101,1055,672],{"class":139},[101,1057,1059],{"class":132,"line":1058},73,[101,1060,618],{"class":139},[101,1062,1064,1066,1068,1070,1073,1075],{"class":132,"line":1063},74,[101,1065,566],{"class":136},[101,1067,1027],{"class":139},[101,1069,1030],{"class":163},[101,1071,1072],{"class":139},"(window, GLFW_KEY_F3) ",[101,1074,1036],{"class":136},[101,1076,1039],{"class":139},[101,1078,1080,1082,1084,1086,1089],{"class":132,"line":1079},75,[101,1081,1045],{"class":139},[101,1083,1048],{"class":163},[101,1085,160],{"class":139},[101,1087,1088],{"class":339},"\"性能监控\"",[101,1090,672],{"class":139},[101,1092,1094],{"class":132,"line":1093},76,[101,1095,618],{"class":139},[101,1097,1099,1101,1103,1105,1108,1110],{"class":132,"line":1098},77,[101,1100,566],{"class":136},[101,1102,1027],{"class":139},[101,1104,1030],{"class":163},[101,1106,1107],{"class":139},"(window, GLFW_KEY_F4) ",[101,1109,1036],{"class":136},[101,1111,1039],{"class":139},[101,1113,1115,1117,1119,1121,1124],{"class":132,"line":1114},78,[101,1116,1045],{"class":139},[101,1118,1048],{"class":163},[101,1120,160],{"class":139},[101,1122,1123],{"class":339},"\"调试信息\"",[101,1125,672],{"class":139},[101,1127,1129],{"class":132,"line":1128},79,[101,1130,618],{"class":139},[101,1132,1134],{"class":132,"line":1133},80,[101,1135,537],{"class":139},[101,1137,1139],{"class":132,"line":1138},81,[101,1140,1141],{"class":236},"    \u002F\u002F 显示统计信息 (按 T 键)\n",[101,1143,1145,1147,1149,1151,1154,1156],{"class":132,"line":1144},82,[101,1146,566],{"class":136},[101,1148,1027],{"class":139},[101,1150,1030],{"class":163},[101,1152,1153],{"class":139},"(window, GLFW_KEY_T) ",[101,1155,1036],{"class":136},[101,1157,1039],{"class":139},[101,1159,1161,1163,1165,1167,1170,1173,1176,1178,1180],{"class":132,"line":1160},83,[101,1162,581],{"class":163},[101,1164,584],{"class":139},[101,1166,587],{"class":136},[101,1168,1169],{"class":139}," dpiStabilizer.",[101,1171,1172],{"class":163},"getStats",[101,1174,1175],{"class":139},"() ",[101,1177,587],{"class":136},[101,1179,601],{"class":163},[101,1181,604],{"class":139},[101,1183,1185],{"class":132,"line":1184},84,[101,1186,618],{"class":139},[101,1188,1190],{"class":132,"line":1189},85,[101,1191,777],{"class":139},[101,1193,1195],{"class":132,"line":1194},86,[101,1196,260],{"emptyLinePlaceholder":259},[101,1198,1200,1202,1205],{"class":132,"line":1199},87,[101,1201,812],{"class":136},[101,1203,1204],{"class":163}," main",[101,1206,1207],{"class":139},"() {\n",[101,1209,1211],{"class":132,"line":1210},88,[101,1212,260],{"emptyLinePlaceholder":259},[101,1214,1216],{"class":132,"line":1215},89,[101,1217,1218],{"class":236},"    \u002F\u002F 模型矩阵\n",[101,1220,1222,1225,1228,1230,1233,1235,1238,1240],{"class":132,"line":1221},90,[101,1223,1224],{"class":163},"    mat4",[101,1226,1227],{"class":139}," model ",[101,1229,143],{"class":136},[101,1231,1232],{"class":163}," mat4",[101,1234,160],{"class":139},[101,1236,1237],{"class":521},"1.0",[101,1239,879],{"class":136},[101,1241,672],{"class":139},[101,1243,1245,1248,1250,1253,1256,1259,1261,1264,1267,1269,1272,1274,1276,1278,1280,1282,1285,1287,1289,1291,1293],{"class":132,"line":1244},91,[101,1246,1247],{"class":139},"    model ",[101,1249,143],{"class":136},[101,1251,1252],{"class":163}," rotate",[101,1254,1255],{"class":139},"(model, ",[101,1257,1258],{"class":163},"radians",[101,1260,160],{"class":139},[101,1262,1263],{"class":136},"-",[101,1265,1266],{"class":521},"55.0",[101,1268,879],{"class":136},[101,1270,1271],{"class":139},"), ",[101,1273,79],{"class":163},[101,1275,160],{"class":139},[101,1277,1237],{"class":521},[101,1279,879],{"class":136},[101,1281,525],{"class":139},[101,1283,1284],{"class":521},"0.0",[101,1286,879],{"class":136},[101,1288,525],{"class":139},[101,1290,1284],{"class":521},[101,1292,879],{"class":136},[101,1294,1295],{"class":139},"));\n",[101,1297,1299],{"class":132,"line":1298},92,[101,1300,260],{"emptyLinePlaceholder":259},[101,1302,1304],{"class":132,"line":1303},93,[101,1305,1306],{"class":236},"    \u002F\u002F 投影矩阵\n",[101,1308,1310,1312,1315,1317,1320,1322,1324,1326,1329,1331,1334,1336,1339,1342,1345,1347,1349,1351,1354,1356,1358,1360,1362,1365,1367],{"class":132,"line":1309},94,[101,1311,1224],{"class":163},[101,1313,1314],{"class":139}," projection ",[101,1316,143],{"class":136},[101,1318,1319],{"class":163}," perspective",[101,1321,160],{"class":139},[101,1323,1258],{"class":163},[101,1325,160],{"class":139},[101,1327,1328],{"class":521},"45.0",[101,1330,879],{"class":136},[101,1332,1333],{"class":139},"), (",[101,1335,868],{"class":136},[101,1337,1338],{"class":139},")",[101,1340,1341],{"class":521},"800",[101,1343,1344],{"class":136}," \u002F",[101,1346,1027],{"class":139},[101,1348,868],{"class":136},[101,1350,1338],{"class":139},[101,1352,1353],{"class":521},"600",[101,1355,525],{"class":139},[101,1357,929],{"class":521},[101,1359,879],{"class":136},[101,1361,525],{"class":139},[101,1363,1364],{"class":521},"100.0",[101,1366,879],{"class":136},[101,1368,672],{"class":139},[101,1370,1372],{"class":132,"line":1371},95,[101,1373,260],{"emptyLinePlaceholder":259},[101,1375,1377],{"class":132,"line":1376},96,[101,1378,1379],{"class":236},"    \u002F\u002F 初始化GLFW\n",[101,1381,1383,1386],{"class":132,"line":1382},97,[101,1384,1385],{"class":163},"    glfwInit",[101,1387,1388],{"class":139},"();\n",[101,1390,1392,1395,1398,1401],{"class":132,"line":1391},98,[101,1393,1394],{"class":163},"    glfwWindowHint",[101,1396,1397],{"class":139},"(GLFW_CONTEXT_VERSION_MAJOR, ",[101,1399,1400],{"class":521},"3",[101,1402,672],{"class":139},[101,1404,1406,1408,1411,1413],{"class":132,"line":1405},99,[101,1407,1394],{"class":163},[101,1409,1410],{"class":139},"(GLFW_CONTEXT_VERSION_MINOR, ",[101,1412,1400],{"class":521},[101,1414,672],{"class":139},[101,1416,1418,1420],{"class":132,"line":1417},100,[101,1419,1394],{"class":163},[101,1421,1422],{"class":139},"(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n",[101,1424,1426],{"class":132,"line":1425},101,[101,1427,537],{"class":139},[101,1429,1431],{"class":132,"line":1430},102,[101,1432,1433],{"class":236},"    \u002F\u002F 设置 DPI 感知提示\n",[101,1435,1437,1440,1443,1446],{"class":132,"line":1436},103,[101,1438,1439],{"class":163},"    DPIStabilizer",[101,1441,1442],{"class":139},"::",[101,1444,1445],{"class":163},"setDPIHint",[101,1447,1388],{"class":139},[101,1449,1451],{"class":132,"line":1450},104,[101,1452,260],{"emptyLinePlaceholder":259},[101,1454,1456],{"class":132,"line":1455},105,[101,1457,1458],{"class":236},"    \u002F\u002F 创建窗口\n",[101,1460,1462,1465,1467,1470,1472,1475,1477,1479,1481,1483,1485,1488,1490,1493,1495,1497],{"class":132,"line":1461},106,[101,1463,1464],{"class":163},"    GLFWwindow",[101,1466,149],{"class":136},[101,1468,1469],{"class":139}," window ",[101,1471,143],{"class":136},[101,1473,1474],{"class":163}," glfwCreateWindow",[101,1476,160],{"class":139},[101,1478,1341],{"class":521},[101,1480,525],{"class":139},[101,1482,1353],{"class":521},[101,1484,525],{"class":139},[101,1486,1487],{"class":339},"\"OpenGL Window\"",[101,1489,525],{"class":139},[101,1491,1492],{"class":521},"NULL",[101,1494,525],{"class":139},[101,1496,1492],{"class":521},[101,1498,672],{"class":139},[101,1500,1502,1504,1507,1509,1512],{"class":132,"line":1501},107,[101,1503,566],{"class":136},[101,1505,1506],{"class":139}," (window ",[101,1508,1036],{"class":136},[101,1510,1511],{"class":521}," NULL",[101,1513,499],{"class":139},[101,1515,1517,1519,1521,1523,1526,1528,1530],{"class":132,"line":1516},108,[101,1518,581],{"class":163},[101,1520,584],{"class":139},[101,1522,587],{"class":136},[101,1524,1525],{"class":339}," \"Failed to create GLFW window\"",[101,1527,593],{"class":136},[101,1529,601],{"class":163},[101,1531,604],{"class":139},[101,1533,1535,1538],{"class":132,"line":1534},109,[101,1536,1537],{"class":163},"        glfwTerminate",[101,1539,1388],{"class":139},[101,1541,1543,1545,1548,1550],{"class":132,"line":1542},110,[101,1544,610],{"class":136},[101,1546,1547],{"class":136}," -",[101,1549,522],{"class":521},[101,1551,449],{"class":139},[101,1553,1555],{"class":132,"line":1554},111,[101,1556,618],{"class":139},[101,1558,1560],{"class":132,"line":1559},112,[101,1561,260],{"emptyLinePlaceholder":259},[101,1563,1565,1568],{"class":132,"line":1564},113,[101,1566,1567],{"class":163},"    glfwMakeContextCurrent",[101,1569,1014],{"class":139},[101,1571,1573,1576],{"class":132,"line":1572},114,[101,1574,1575],{"class":163},"    glfwSetFramebufferSizeCallback",[101,1577,1578],{"class":139},"(window, framebuffer_size_callback);\n",[101,1580,1582],{"class":132,"line":1581},115,[101,1583,537],{"class":139},[101,1585,1587],{"class":132,"line":1586},116,[101,1588,1589],{"class":236},"    \u002F\u002F 初始化 DPI 稳定器\n",[101,1591,1593,1595,1598],{"class":132,"line":1592},117,[101,1594,1008],{"class":139},[101,1596,1597],{"class":163},"initialize",[101,1599,1014],{"class":139},[101,1601,1603],{"class":132,"line":1602},118,[101,1604,260],{"emptyLinePlaceholder":259},[101,1606,1608],{"class":132,"line":1607},119,[101,1609,1610],{"class":236},"    \u002F\u002F 初始化GLAD\n",[101,1612,1614,1616,1618,1621,1624],{"class":132,"line":1613},120,[101,1615,566],{"class":136},[101,1617,1027],{"class":139},[101,1619,1620],{"class":136},"!",[101,1622,1623],{"class":163},"gladLoadGLLoader",[101,1625,1626],{"class":139},"((GLADloadproc)glfwGetProcAddress)) {\n",[101,1628,1630,1632,1634,1636,1639,1641,1643],{"class":132,"line":1629},121,[101,1631,581],{"class":163},[101,1633,584],{"class":139},[101,1635,587],{"class":136},[101,1637,1638],{"class":339}," \"Failed to initialize GLAD\"",[101,1640,593],{"class":136},[101,1642,601],{"class":163},[101,1644,604],{"class":139},[101,1646,1648,1650,1652,1654],{"class":132,"line":1647},122,[101,1649,610],{"class":136},[101,1651,1547],{"class":136},[101,1653,522],{"class":521},[101,1655,449],{"class":139},[101,1657,1659],{"class":132,"line":1658},123,[101,1660,618],{"class":139},[101,1662,1664],{"class":132,"line":1663},124,[101,1665,260],{"emptyLinePlaceholder":259},[101,1667,1669],{"class":132,"line":1668},125,[101,1670,1671],{"class":236},"    \u002F\u002F 初始化 ImGui 管理器\n",[101,1673,1675,1678,1680],{"class":132,"line":1674},126,[101,1676,1677],{"class":139},"    imguiManager.",[101,1679,1597],{"class":163},[101,1681,1014],{"class":139},[101,1683,1685],{"class":132,"line":1684},127,[101,1686,537],{"class":139},[101,1688,1690],{"class":132,"line":1689},128,[101,1691,1692],{"class":236},"    \u002F\u002F 注册窗口\n",[101,1694,1696,1698,1701,1703,1706],{"class":132,"line":1695},129,[101,1697,1677],{"class":139},[101,1699,1700],{"class":163},"registerWindow",[101,1702,160],{"class":139},[101,1704,1705],{"class":339},"\"Hello ImGui!\"",[101,1707,1708],{"class":139},", []() {\n",[101,1710,1712,1715,1717,1720,1722,1725,1728,1731,1734,1737,1739,1742,1745,1748,1751],{"class":132,"line":1711},130,[101,1713,1714],{"class":163},"        ImGui",[101,1716,1442],{"class":139},[101,1718,1719],{"class":163},"Text",[101,1721,160],{"class":139},[101,1723,1724],{"class":339},"\"DPI 稳定器状态: ",[101,1726,1727],{"class":521},"%s",[101,1729,1730],{"class":339},"\"",[101,1732,1733],{"class":139},", dpiStabilizer.",[101,1735,1736],{"class":163},"isMouseCaptured",[101,1738,1175],{"class":139},[101,1740,1741],{"class":136},"?",[101,1743,1744],{"class":339}," \"已捕获\"",[101,1746,1747],{"class":136}," :",[101,1749,1750],{"class":339}," \"已释放\"",[101,1752,672],{"class":139},[101,1754,1756,1758,1760,1762,1764,1767,1770,1772,1774,1777],{"class":132,"line":1755},131,[101,1757,1714],{"class":163},[101,1759,1442],{"class":139},[101,1761,1719],{"class":163},[101,1763,160],{"class":139},[101,1765,1766],{"class":339},"\"鼠标敏感度: ",[101,1768,1769],{"class":521},"%.3f",[101,1771,1730],{"class":339},[101,1773,1733],{"class":139},[101,1775,1776],{"class":163},"getSensitivity",[101,1778,1779],{"class":139},"());\n",[101,1781,1783],{"class":132,"line":1782},132,[101,1784,1785],{"class":139},"        \n",[101,1787,1789,1792,1794,1797,1799,1802,1804,1807],{"class":132,"line":1788},133,[101,1790,1791],{"class":136},"        if",[101,1793,1027],{"class":139},[101,1795,1796],{"class":163},"ImGui",[101,1798,1442],{"class":139},[101,1800,1801],{"class":163},"Button",[101,1803,160],{"class":139},[101,1805,1806],{"class":339},"\"重置统计\"",[101,1808,1809],{"class":139},")) {\n",[101,1811,1813,1816,1819],{"class":132,"line":1812},134,[101,1814,1815],{"class":139},"            dpiStabilizer.",[101,1817,1818],{"class":163},"resetStats",[101,1820,1388],{"class":139},[101,1822,1824],{"class":132,"line":1823},135,[101,1825,1826],{"class":139},"        }\n",[101,1828,1830],{"class":132,"line":1829},136,[101,1831,1785],{"class":139},[101,1833,1835,1838,1841,1843,1845,1847],{"class":132,"line":1834},137,[101,1836,1837],{"class":136},"        float",[101,1839,1840],{"class":139}," sensitivity ",[101,1842,143],{"class":136},[101,1844,1169],{"class":139},[101,1846,1776],{"class":163},[101,1848,1388],{"class":139},[101,1850,1852,1854,1856,1858,1860,1863,1865,1868,1870,1872,1875,1878,1880,1882,1885,1887],{"class":132,"line":1851},138,[101,1853,1791],{"class":136},[101,1855,1027],{"class":139},[101,1857,1796],{"class":163},[101,1859,1442],{"class":139},[101,1861,1862],{"class":163},"SliderFloat",[101,1864,160],{"class":139},[101,1866,1867],{"class":339},"\"鼠标敏感度\"",[101,1869,525],{"class":139},[101,1871,528],{"class":136},[101,1873,1874],{"class":139},"sensitivity, ",[101,1876,1877],{"class":521},"0.01",[101,1879,879],{"class":136},[101,1881,525],{"class":139},[101,1883,1884],{"class":521},"0.5",[101,1886,879],{"class":136},[101,1888,1809],{"class":139},[101,1890,1892,1894,1897],{"class":132,"line":1891},139,[101,1893,1815],{"class":139},[101,1895,1896],{"class":163},"setSensitivity",[101,1898,1899],{"class":139},"(sensitivity);\n",[101,1901,1903],{"class":132,"line":1902},140,[101,1904,1826],{"class":139},[101,1906,1908],{"class":132,"line":1907},141,[101,1909,1910],{"class":139},"    });\n",[101,1912,1914],{"class":132,"line":1913},142,[101,1915,537],{"class":139},[101,1917,1919,1921,1923,1925,1927],{"class":132,"line":1918},143,[101,1920,1677],{"class":139},[101,1922,1700],{"class":163},[101,1924,160],{"class":139},[101,1926,1053],{"class":339},[101,1928,1708],{"class":139},[101,1930,1932,1935,1937,1940,1942,1945,1947,1950],{"class":132,"line":1931},144,[101,1933,1934],{"class":163},"        ImGuiIO",[101,1936,528],{"class":136},[101,1938,1939],{"class":139}," io ",[101,1941,143],{"class":136},[101,1943,1944],{"class":163}," ImGui",[101,1946,1442],{"class":139},[101,1948,1949],{"class":163},"GetIO",[101,1951,1388],{"class":139},[101,1953,1955,1957,1959,1961,1963,1966,1969,1971],{"class":132,"line":1954},145,[101,1956,1714],{"class":163},[101,1958,1442],{"class":139},[101,1960,1719],{"class":163},[101,1962,160],{"class":139},[101,1964,1965],{"class":339},"\"FPS: ",[101,1967,1968],{"class":521},"%.1f",[101,1970,1730],{"class":339},[101,1972,1973],{"class":139},", io.Framerate);\n",[101,1975,1977,1979,1981,1983,1985,1988,1990,1993,1995,1998,2000,2002],{"class":132,"line":1976},146,[101,1978,1714],{"class":163},[101,1980,1442],{"class":139},[101,1982,1719],{"class":163},[101,1984,160],{"class":139},[101,1986,1987],{"class":339},"\"帧时间: ",[101,1989,1769],{"class":521},[101,1991,1992],{"class":339}," ms\"",[101,1994,525],{"class":139},[101,1996,1997],{"class":521},"1000.0",[101,1999,879],{"class":136},[101,2001,1344],{"class":136},[101,2003,2004],{"class":139}," io.Framerate);\n",[101,2006,2008],{"class":132,"line":2007},147,[101,2009,1910],{"class":139},[101,2011,2013],{"class":132,"line":2012},148,[101,2014,537],{"class":139},[101,2016,2018],{"class":132,"line":2017},149,[101,2019,260],{"emptyLinePlaceholder":259},[101,2021,2023],{"class":132,"line":2022},150,[101,2024,2025],{"class":236},"    \u002F\u002F 启用深度测试\n",[101,2027,2029,2032],{"class":132,"line":2028},151,[101,2030,2031],{"class":163},"    glEnable",[101,2033,2034],{"class":139},"(GL_DEPTH_TEST);\n",[101,2036,2038],{"class":132,"line":2037},152,[101,2039,260],{"emptyLinePlaceholder":259},[101,2041,2043,2046,2049,2051],{"class":132,"line":2042},153,[101,2044,2045],{"class":136},"    float",[101,2047,2048],{"class":139}," vertices[] ",[101,2050,143],{"class":136},[101,2052,2053],{"class":139}," {\n",[101,2055,2057],{"class":132,"line":2056},154,[101,2058,2059],{"class":236},"    \u002F\u002F 立方体顶点数据（位置 + 法线 + 纹理坐标）\n",[101,2061,2063],{"class":132,"line":2062},155,[101,2064,2065],{"class":236},"    \u002F\u002F 位置(3) + 法线(3) + 纹理坐标(2) = 8个浮点数\n",[101,2067,2069],{"class":132,"line":2068},156,[101,2070,2071],{"class":236},"    \u002F\u002F 前面\n",[101,2073,2075,2078,2080,2082,2084,2086,2088,2090,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127],{"class":132,"line":2074},157,[101,2076,2077],{"class":136},"    -",[101,2079,1884],{"class":521},[101,2081,879],{"class":136},[101,2083,525],{"class":139},[101,2085,1263],{"class":136},[101,2087,1884],{"class":521},[101,2089,879],{"class":136},[101,2091,2092],{"class":139},",  ",[101,2094,1884],{"class":521},[101,2096,879],{"class":136},[101,2098,2092],{"class":139},[101,2100,1284],{"class":521},[101,2102,879],{"class":136},[101,2104,2092],{"class":139},[101,2106,1284],{"class":521},[101,2108,879],{"class":136},[101,2110,2092],{"class":139},[101,2112,1237],{"class":521},[101,2114,879],{"class":136},[101,2116,2092],{"class":139},[101,2118,1284],{"class":521},[101,2120,879],{"class":136},[101,2122,525],{"class":139},[101,2124,1284],{"class":521},[101,2126,879],{"class":136},[101,2128,2129],{"class":139},",\n",[101,2131,2133,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182],{"class":132,"line":2132},158,[101,2134,2135],{"class":521},"     0.5",[101,2137,879],{"class":136},[101,2139,525],{"class":139},[101,2141,1263],{"class":136},[101,2143,1884],{"class":521},[101,2145,879],{"class":136},[101,2147,2092],{"class":139},[101,2149,1884],{"class":521},[101,2151,879],{"class":136},[101,2153,2092],{"class":139},[101,2155,1284],{"class":521},[101,2157,879],{"class":136},[101,2159,2092],{"class":139},[101,2161,1284],{"class":521},[101,2163,879],{"class":136},[101,2165,2092],{"class":139},[101,2167,1237],{"class":521},[101,2169,879],{"class":136},[101,2171,2092],{"class":139},[101,2173,1237],{"class":521},[101,2175,879],{"class":136},[101,2177,525],{"class":139},[101,2179,1284],{"class":521},[101,2181,879],{"class":136},[101,2183,2129],{"class":139},[101,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233],{"class":132,"line":2186},159,[101,2188,2135],{"class":521},[101,2190,879],{"class":136},[101,2192,2092],{"class":139},[101,2194,1884],{"class":521},[101,2196,879],{"class":136},[101,2198,2092],{"class":139},[101,2200,1884],{"class":521},[101,2202,879],{"class":136},[101,2204,2092],{"class":139},[101,2206,1284],{"class":521},[101,2208,879],{"class":136},[101,2210,2092],{"class":139},[101,2212,1284],{"class":521},[101,2214,879],{"class":136},[101,2216,2092],{"class":139},[101,2218,1237],{"class":521},[101,2220,879],{"class":136},[101,2222,2092],{"class":139},[101,2224,1237],{"class":521},[101,2226,879],{"class":136},[101,2228,525],{"class":139},[101,2230,1237],{"class":521},[101,2232,879],{"class":136},[101,2234,2129],{"class":139},[101,2236,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284],{"class":132,"line":2237},160,[101,2239,2135],{"class":521},[101,2241,879],{"class":136},[101,2243,2092],{"class":139},[101,2245,1884],{"class":521},[101,2247,879],{"class":136},[101,2249,2092],{"class":139},[101,2251,1884],{"class":521},[101,2253,879],{"class":136},[101,2255,2092],{"class":139},[101,2257,1284],{"class":521},[101,2259,879],{"class":136},[101,2261,2092],{"class":139},[101,2263,1284],{"class":521},[101,2265,879],{"class":136},[101,2267,2092],{"class":139},[101,2269,1237],{"class":521},[101,2271,879],{"class":136},[101,2273,2092],{"class":139},[101,2275,1237],{"class":521},[101,2277,879],{"class":136},[101,2279,525],{"class":139},[101,2281,1237],{"class":521},[101,2283,879],{"class":136},[101,2285,2129],{"class":139},[101,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335,2337],{"class":132,"line":2288},161,[101,2290,2077],{"class":136},[101,2292,1884],{"class":521},[101,2294,879],{"class":136},[101,2296,2092],{"class":139},[101,2298,1884],{"class":521},[101,2300,879],{"class":136},[101,2302,2092],{"class":139},[101,2304,1884],{"class":521},[101,2306,879],{"class":136},[101,2308,2092],{"class":139},[101,2310,1284],{"class":521},[101,2312,879],{"class":136},[101,2314,2092],{"class":139},[101,2316,1284],{"class":521},[101,2318,879],{"class":136},[101,2320,2092],{"class":139},[101,2322,1237],{"class":521},[101,2324,879],{"class":136},[101,2326,2092],{"class":139},[101,2328,1284],{"class":521},[101,2330,879],{"class":136},[101,2332,525],{"class":139},[101,2334,1237],{"class":521},[101,2336,879],{"class":136},[101,2338,2129],{"class":139},[101,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392],{"class":132,"line":2341},162,[101,2343,2077],{"class":136},[101,2345,1884],{"class":521},[101,2347,879],{"class":136},[101,2349,525],{"class":139},[101,2351,1263],{"class":136},[101,2353,1884],{"class":521},[101,2355,879],{"class":136},[101,2357,2092],{"class":139},[101,2359,1884],{"class":521},[101,2361,879],{"class":136},[101,2363,2092],{"class":139},[101,2365,1284],{"class":521},[101,2367,879],{"class":136},[101,2369,2092],{"class":139},[101,2371,1284],{"class":521},[101,2373,879],{"class":136},[101,2375,2092],{"class":139},[101,2377,1237],{"class":521},[101,2379,879],{"class":136},[101,2381,2092],{"class":139},[101,2383,1284],{"class":521},[101,2385,879],{"class":136},[101,2387,525],{"class":139},[101,2389,1284],{"class":521},[101,2391,879],{"class":136},[101,2393,2129],{"class":139},[101,2395,2397],{"class":132,"line":2396},163,[101,2398,537],{"class":139},[101,2400,2402],{"class":132,"line":2401},164,[101,2403,2404],{"class":236},"    \u002F\u002F 后面\n",[101,2406,2408,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462],{"class":132,"line":2407},165,[101,2409,2077],{"class":136},[101,2411,1884],{"class":521},[101,2413,879],{"class":136},[101,2415,525],{"class":139},[101,2417,1263],{"class":136},[101,2419,1884],{"class":521},[101,2421,879],{"class":136},[101,2423,525],{"class":139},[101,2425,1263],{"class":136},[101,2427,1884],{"class":521},[101,2429,879],{"class":136},[101,2431,2092],{"class":139},[101,2433,1284],{"class":521},[101,2435,879],{"class":136},[101,2437,2092],{"class":139},[101,2439,1284],{"class":521},[101,2441,879],{"class":136},[101,2443,525],{"class":139},[101,2445,1263],{"class":136},[101,2447,1237],{"class":521},[101,2449,879],{"class":136},[101,2451,2092],{"class":139},[101,2453,1284],{"class":521},[101,2455,879],{"class":136},[101,2457,525],{"class":139},[101,2459,1284],{"class":521},[101,2461,879],{"class":136},[101,2463,2129],{"class":139},[101,2465,2467,2469,2471,2473,2475,2477,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519],{"class":132,"line":2466},166,[101,2468,2135],{"class":521},[101,2470,879],{"class":136},[101,2472,525],{"class":139},[101,2474,1263],{"class":136},[101,2476,1884],{"class":521},[101,2478,879],{"class":136},[101,2480,525],{"class":139},[101,2482,1263],{"class":136},[101,2484,1884],{"class":521},[101,2486,879],{"class":136},[101,2488,2092],{"class":139},[101,2490,1284],{"class":521},[101,2492,879],{"class":136},[101,2494,2092],{"class":139},[101,2496,1284],{"class":521},[101,2498,879],{"class":136},[101,2500,525],{"class":139},[101,2502,1263],{"class":136},[101,2504,1237],{"class":521},[101,2506,879],{"class":136},[101,2508,2092],{"class":139},[101,2510,1237],{"class":521},[101,2512,879],{"class":136},[101,2514,525],{"class":139},[101,2516,1284],{"class":521},[101,2518,879],{"class":136},[101,2520,2129],{"class":139},[101,2522,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574],{"class":132,"line":2523},167,[101,2525,2135],{"class":521},[101,2527,879],{"class":136},[101,2529,2092],{"class":139},[101,2531,1884],{"class":521},[101,2533,879],{"class":136},[101,2535,525],{"class":139},[101,2537,1263],{"class":136},[101,2539,1884],{"class":521},[101,2541,879],{"class":136},[101,2543,2092],{"class":139},[101,2545,1284],{"class":521},[101,2547,879],{"class":136},[101,2549,2092],{"class":139},[101,2551,1284],{"class":521},[101,2553,879],{"class":136},[101,2555,525],{"class":139},[101,2557,1263],{"class":136},[101,2559,1237],{"class":521},[101,2561,879],{"class":136},[101,2563,2092],{"class":139},[101,2565,1237],{"class":521},[101,2567,879],{"class":136},[101,2569,525],{"class":139},[101,2571,1237],{"class":521},[101,2573,879],{"class":136},[101,2575,2129],{"class":139},[101,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607,2609,2611,2613,2615,2617,2619,2621,2623,2625,2627,2629],{"class":132,"line":2578},168,[101,2580,2135],{"class":521},[101,2582,879],{"class":136},[101,2584,2092],{"class":139},[101,2586,1884],{"class":521},[101,2588,879],{"class":136},[101,2590,525],{"class":139},[101,2592,1263],{"class":136},[101,2594,1884],{"class":521},[101,2596,879],{"class":136},[101,2598,2092],{"class":139},[101,2600,1284],{"class":521},[101,2602,879],{"class":136},[101,2604,2092],{"class":139},[101,2606,1284],{"class":521},[101,2608,879],{"class":136},[101,2610,525],{"class":139},[101,2612,1263],{"class":136},[101,2614,1237],{"class":521},[101,2616,879],{"class":136},[101,2618,2092],{"class":139},[101,2620,1237],{"class":521},[101,2622,879],{"class":136},[101,2624,525],{"class":139},[101,2626,1237],{"class":521},[101,2628,879],{"class":136},[101,2630,2129],{"class":139},[101,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686],{"class":132,"line":2633},169,[101,2635,2077],{"class":136},[101,2637,1884],{"class":521},[101,2639,879],{"class":136},[101,2641,2092],{"class":139},[101,2643,1884],{"class":521},[101,2645,879],{"class":136},[101,2647,525],{"class":139},[101,2649,1263],{"class":136},[101,2651,1884],{"class":521},[101,2653,879],{"class":136},[101,2655,2092],{"class":139},[101,2657,1284],{"class":521},[101,2659,879],{"class":136},[101,2661,2092],{"class":139},[101,2663,1284],{"class":521},[101,2665,879],{"class":136},[101,2667,525],{"class":139},[101,2669,1263],{"class":136},[101,2671,1237],{"class":521},[101,2673,879],{"class":136},[101,2675,2092],{"class":139},[101,2677,1284],{"class":521},[101,2679,879],{"class":136},[101,2681,525],{"class":139},[101,2683,1237],{"class":521},[101,2685,879],{"class":136},[101,2687,2129],{"class":139},[101,2689,2691,2693,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745],{"class":132,"line":2690},170,[101,2692,2077],{"class":136},[101,2694,1884],{"class":521},[101,2696,879],{"class":136},[101,2698,525],{"class":139},[101,2700,1263],{"class":136},[101,2702,1884],{"class":521},[101,2704,879],{"class":136},[101,2706,525],{"class":139},[101,2708,1263],{"class":136},[101,2710,1884],{"class":521},[101,2712,879],{"class":136},[101,2714,2092],{"class":139},[101,2716,1284],{"class":521},[101,2718,879],{"class":136},[101,2720,2092],{"class":139},[101,2722,1284],{"class":521},[101,2724,879],{"class":136},[101,2726,525],{"class":139},[101,2728,1263],{"class":136},[101,2730,1237],{"class":521},[101,2732,879],{"class":136},[101,2734,2092],{"class":139},[101,2736,1284],{"class":521},[101,2738,879],{"class":136},[101,2740,525],{"class":139},[101,2742,1284],{"class":521},[101,2744,879],{"class":136},[101,2746,2129],{"class":139},[101,2748,2750],{"class":132,"line":2749},171,[101,2751,537],{"class":139},[101,2753,2755],{"class":132,"line":2754},172,[101,2756,2757],{"class":236},"    \u002F\u002F 左面\n",[101,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811],{"class":132,"line":2760},173,[101,2762,2077],{"class":136},[101,2764,1884],{"class":521},[101,2766,879],{"class":136},[101,2768,2092],{"class":139},[101,2770,1884],{"class":521},[101,2772,879],{"class":136},[101,2774,2092],{"class":139},[101,2776,1884],{"class":521},[101,2778,879],{"class":136},[101,2780,525],{"class":139},[101,2782,1263],{"class":136},[101,2784,1237],{"class":521},[101,2786,879],{"class":136},[101,2788,2092],{"class":139},[101,2790,1284],{"class":521},[101,2792,879],{"class":136},[101,2794,2092],{"class":139},[101,2796,1284],{"class":521},[101,2798,879],{"class":136},[101,2800,2092],{"class":139},[101,2802,1237],{"class":521},[101,2804,879],{"class":136},[101,2806,525],{"class":139},[101,2808,1284],{"class":521},[101,2810,879],{"class":136},[101,2812,2129],{"class":139},[101,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868],{"class":132,"line":2815},174,[101,2817,2077],{"class":136},[101,2819,1884],{"class":521},[101,2821,879],{"class":136},[101,2823,2092],{"class":139},[101,2825,1884],{"class":521},[101,2827,879],{"class":136},[101,2829,525],{"class":139},[101,2831,1263],{"class":136},[101,2833,1884],{"class":521},[101,2835,879],{"class":136},[101,2837,525],{"class":139},[101,2839,1263],{"class":136},[101,2841,1237],{"class":521},[101,2843,879],{"class":136},[101,2845,2092],{"class":139},[101,2847,1284],{"class":521},[101,2849,879],{"class":136},[101,2851,2092],{"class":139},[101,2853,1284],{"class":521},[101,2855,879],{"class":136},[101,2857,2092],{"class":139},[101,2859,1237],{"class":521},[101,2861,879],{"class":136},[101,2863,525],{"class":139},[101,2865,1237],{"class":521},[101,2867,879],{"class":136},[101,2869,2129],{"class":139},[101,2871,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891,2893,2895,2897,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919,2921,2923,2925,2927],{"class":132,"line":2872},175,[101,2874,2077],{"class":136},[101,2876,1884],{"class":521},[101,2878,879],{"class":136},[101,2880,525],{"class":139},[101,2882,1263],{"class":136},[101,2884,1884],{"class":521},[101,2886,879],{"class":136},[101,2888,525],{"class":139},[101,2890,1263],{"class":136},[101,2892,1884],{"class":521},[101,2894,879],{"class":136},[101,2896,525],{"class":139},[101,2898,1263],{"class":136},[101,2900,1237],{"class":521},[101,2902,879],{"class":136},[101,2904,2092],{"class":139},[101,2906,1284],{"class":521},[101,2908,879],{"class":136},[101,2910,2092],{"class":139},[101,2912,1284],{"class":521},[101,2914,879],{"class":136},[101,2916,2092],{"class":139},[101,2918,1284],{"class":521},[101,2920,879],{"class":136},[101,2922,525],{"class":139},[101,2924,1237],{"class":521},[101,2926,879],{"class":136},[101,2928,2129],{"class":139},[101,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978,2980,2982,2984,2986],{"class":132,"line":2931},176,[101,2933,2077],{"class":136},[101,2935,1884],{"class":521},[101,2937,879],{"class":136},[101,2939,525],{"class":139},[101,2941,1263],{"class":136},[101,2943,1884],{"class":521},[101,2945,879],{"class":136},[101,2947,525],{"class":139},[101,2949,1263],{"class":136},[101,2951,1884],{"class":521},[101,2953,879],{"class":136},[101,2955,525],{"class":139},[101,2957,1263],{"class":136},[101,2959,1237],{"class":521},[101,2961,879],{"class":136},[101,2963,2092],{"class":139},[101,2965,1284],{"class":521},[101,2967,879],{"class":136},[101,2969,2092],{"class":139},[101,2971,1284],{"class":521},[101,2973,879],{"class":136},[101,2975,2092],{"class":139},[101,2977,1284],{"class":521},[101,2979,879],{"class":136},[101,2981,525],{"class":139},[101,2983,1237],{"class":521},[101,2985,879],{"class":136},[101,2987,2129],{"class":139},[101,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033,3035,3037,3039,3041,3043],{"class":132,"line":2990},177,[101,2992,2077],{"class":136},[101,2994,1884],{"class":521},[101,2996,879],{"class":136},[101,2998,525],{"class":139},[101,3000,1263],{"class":136},[101,3002,1884],{"class":521},[101,3004,879],{"class":136},[101,3006,2092],{"class":139},[101,3008,1884],{"class":521},[101,3010,879],{"class":136},[101,3012,525],{"class":139},[101,3014,1263],{"class":136},[101,3016,1237],{"class":521},[101,3018,879],{"class":136},[101,3020,2092],{"class":139},[101,3022,1284],{"class":521},[101,3024,879],{"class":136},[101,3026,2092],{"class":139},[101,3028,1284],{"class":521},[101,3030,879],{"class":136},[101,3032,2092],{"class":139},[101,3034,1284],{"class":521},[101,3036,879],{"class":136},[101,3038,525],{"class":139},[101,3040,1284],{"class":521},[101,3042,879],{"class":136},[101,3044,2129],{"class":139},[101,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096,3098],{"class":132,"line":3047},178,[101,3049,2077],{"class":136},[101,3051,1884],{"class":521},[101,3053,879],{"class":136},[101,3055,2092],{"class":139},[101,3057,1884],{"class":521},[101,3059,879],{"class":136},[101,3061,2092],{"class":139},[101,3063,1884],{"class":521},[101,3065,879],{"class":136},[101,3067,525],{"class":139},[101,3069,1263],{"class":136},[101,3071,1237],{"class":521},[101,3073,879],{"class":136},[101,3075,2092],{"class":139},[101,3077,1284],{"class":521},[101,3079,879],{"class":136},[101,3081,2092],{"class":139},[101,3083,1284],{"class":521},[101,3085,879],{"class":136},[101,3087,2092],{"class":139},[101,3089,1237],{"class":521},[101,3091,879],{"class":136},[101,3093,525],{"class":139},[101,3095,1284],{"class":521},[101,3097,879],{"class":136},[101,3099,2129],{"class":139},[101,3101,3103],{"class":132,"line":3102},179,[101,3104,537],{"class":139},[101,3106,3108],{"class":132,"line":3107},180,[101,3109,3110],{"class":236},"    \u002F\u002F 右面\n",[101,3112,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160],{"class":132,"line":3113},181,[101,3115,2135],{"class":521},[101,3117,879],{"class":136},[101,3119,2092],{"class":139},[101,3121,1884],{"class":521},[101,3123,879],{"class":136},[101,3125,2092],{"class":139},[101,3127,1884],{"class":521},[101,3129,879],{"class":136},[101,3131,2092],{"class":139},[101,3133,1237],{"class":521},[101,3135,879],{"class":136},[101,3137,2092],{"class":139},[101,3139,1284],{"class":521},[101,3141,879],{"class":136},[101,3143,2092],{"class":139},[101,3145,1284],{"class":521},[101,3147,879],{"class":136},[101,3149,2092],{"class":139},[101,3151,1237],{"class":521},[101,3153,879],{"class":136},[101,3155,525],{"class":139},[101,3157,1284],{"class":521},[101,3159,879],{"class":136},[101,3161,2129],{"class":139},[101,3163,3165,3167,3169,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207,3209,3211,3213],{"class":132,"line":3164},182,[101,3166,2135],{"class":521},[101,3168,879],{"class":136},[101,3170,2092],{"class":139},[101,3172,1884],{"class":521},[101,3174,879],{"class":136},[101,3176,525],{"class":139},[101,3178,1263],{"class":136},[101,3180,1884],{"class":521},[101,3182,879],{"class":136},[101,3184,2092],{"class":139},[101,3186,1237],{"class":521},[101,3188,879],{"class":136},[101,3190,2092],{"class":139},[101,3192,1284],{"class":521},[101,3194,879],{"class":136},[101,3196,2092],{"class":139},[101,3198,1284],{"class":521},[101,3200,879],{"class":136},[101,3202,2092],{"class":139},[101,3204,1237],{"class":521},[101,3206,879],{"class":136},[101,3208,525],{"class":139},[101,3210,1237],{"class":521},[101,3212,879],{"class":136},[101,3214,2129],{"class":139},[101,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262,3264,3266,3268],{"class":132,"line":3217},183,[101,3219,2135],{"class":521},[101,3221,879],{"class":136},[101,3223,525],{"class":139},[101,3225,1263],{"class":136},[101,3227,1884],{"class":521},[101,3229,879],{"class":136},[101,3231,525],{"class":139},[101,3233,1263],{"class":136},[101,3235,1884],{"class":521},[101,3237,879],{"class":136},[101,3239,2092],{"class":139},[101,3241,1237],{"class":521},[101,3243,879],{"class":136},[101,3245,2092],{"class":139},[101,3247,1284],{"class":521},[101,3249,879],{"class":136},[101,3251,2092],{"class":139},[101,3253,1284],{"class":521},[101,3255,879],{"class":136},[101,3257,2092],{"class":139},[101,3259,1284],{"class":521},[101,3261,879],{"class":136},[101,3263,525],{"class":139},[101,3265,1237],{"class":521},[101,3267,879],{"class":136},[101,3269,2129],{"class":139},[101,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311,3313,3315,3317,3319,3321,3323],{"class":132,"line":3272},184,[101,3274,2135],{"class":521},[101,3276,879],{"class":136},[101,3278,525],{"class":139},[101,3280,1263],{"class":136},[101,3282,1884],{"class":521},[101,3284,879],{"class":136},[101,3286,525],{"class":139},[101,3288,1263],{"class":136},[101,3290,1884],{"class":521},[101,3292,879],{"class":136},[101,3294,2092],{"class":139},[101,3296,1237],{"class":521},[101,3298,879],{"class":136},[101,3300,2092],{"class":139},[101,3302,1284],{"class":521},[101,3304,879],{"class":136},[101,3306,2092],{"class":139},[101,3308,1284],{"class":521},[101,3310,879],{"class":136},[101,3312,2092],{"class":139},[101,3314,1284],{"class":521},[101,3316,879],{"class":136},[101,3318,525],{"class":139},[101,3320,1237],{"class":521},[101,3322,879],{"class":136},[101,3324,2129],{"class":139},[101,3326,3328,3330,3332,3334,3336,3338,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3366,3368,3370,3372,3374,3376],{"class":132,"line":3327},185,[101,3329,2135],{"class":521},[101,3331,879],{"class":136},[101,3333,525],{"class":139},[101,3335,1263],{"class":136},[101,3337,1884],{"class":521},[101,3339,879],{"class":136},[101,3341,2092],{"class":139},[101,3343,1884],{"class":521},[101,3345,879],{"class":136},[101,3347,2092],{"class":139},[101,3349,1237],{"class":521},[101,3351,879],{"class":136},[101,3353,2092],{"class":139},[101,3355,1284],{"class":521},[101,3357,879],{"class":136},[101,3359,2092],{"class":139},[101,3361,1284],{"class":521},[101,3363,879],{"class":136},[101,3365,2092],{"class":139},[101,3367,1284],{"class":521},[101,3369,879],{"class":136},[101,3371,525],{"class":139},[101,3373,1284],{"class":521},[101,3375,879],{"class":136},[101,3377,2129],{"class":139},[101,3379,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3427],{"class":132,"line":3380},186,[101,3382,2135],{"class":521},[101,3384,879],{"class":136},[101,3386,2092],{"class":139},[101,3388,1884],{"class":521},[101,3390,879],{"class":136},[101,3392,2092],{"class":139},[101,3394,1884],{"class":521},[101,3396,879],{"class":136},[101,3398,2092],{"class":139},[101,3400,1237],{"class":521},[101,3402,879],{"class":136},[101,3404,2092],{"class":139},[101,3406,1284],{"class":521},[101,3408,879],{"class":136},[101,3410,2092],{"class":139},[101,3412,1284],{"class":521},[101,3414,879],{"class":136},[101,3416,2092],{"class":139},[101,3418,1237],{"class":521},[101,3420,879],{"class":136},[101,3422,525],{"class":139},[101,3424,1284],{"class":521},[101,3426,879],{"class":136},[101,3428,2129],{"class":139},[101,3430,3432],{"class":132,"line":3431},187,[101,3433,537],{"class":139},[101,3435,3437],{"class":132,"line":3436},188,[101,3438,3439],{"class":236},"    \u002F\u002F 下面\n",[101,3441,3443,3445,3447,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497],{"class":132,"line":3442},189,[101,3444,2077],{"class":136},[101,3446,1884],{"class":521},[101,3448,879],{"class":136},[101,3450,525],{"class":139},[101,3452,1263],{"class":136},[101,3454,1884],{"class":521},[101,3456,879],{"class":136},[101,3458,525],{"class":139},[101,3460,1263],{"class":136},[101,3462,1884],{"class":521},[101,3464,879],{"class":136},[101,3466,2092],{"class":139},[101,3468,1284],{"class":521},[101,3470,879],{"class":136},[101,3472,525],{"class":139},[101,3474,1263],{"class":136},[101,3476,1237],{"class":521},[101,3478,879],{"class":136},[101,3480,2092],{"class":139},[101,3482,1284],{"class":521},[101,3484,879],{"class":136},[101,3486,2092],{"class":139},[101,3488,1284],{"class":521},[101,3490,879],{"class":136},[101,3492,525],{"class":139},[101,3494,1237],{"class":521},[101,3496,879],{"class":136},[101,3498,2129],{"class":139},[101,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532,3534,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554],{"class":132,"line":3501},190,[101,3503,2135],{"class":521},[101,3505,879],{"class":136},[101,3507,525],{"class":139},[101,3509,1263],{"class":136},[101,3511,1884],{"class":521},[101,3513,879],{"class":136},[101,3515,525],{"class":139},[101,3517,1263],{"class":136},[101,3519,1884],{"class":521},[101,3521,879],{"class":136},[101,3523,2092],{"class":139},[101,3525,1284],{"class":521},[101,3527,879],{"class":136},[101,3529,525],{"class":139},[101,3531,1263],{"class":136},[101,3533,1237],{"class":521},[101,3535,879],{"class":136},[101,3537,2092],{"class":139},[101,3539,1284],{"class":521},[101,3541,879],{"class":136},[101,3543,2092],{"class":139},[101,3545,1237],{"class":521},[101,3547,879],{"class":136},[101,3549,525],{"class":139},[101,3551,1237],{"class":521},[101,3553,879],{"class":136},[101,3555,2129],{"class":139},[101,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597,3599,3601,3603,3605,3607,3609],{"class":132,"line":3558},191,[101,3560,2135],{"class":521},[101,3562,879],{"class":136},[101,3564,525],{"class":139},[101,3566,1263],{"class":136},[101,3568,1884],{"class":521},[101,3570,879],{"class":136},[101,3572,2092],{"class":139},[101,3574,1884],{"class":521},[101,3576,879],{"class":136},[101,3578,2092],{"class":139},[101,3580,1284],{"class":521},[101,3582,879],{"class":136},[101,3584,525],{"class":139},[101,3586,1263],{"class":136},[101,3588,1237],{"class":521},[101,3590,879],{"class":136},[101,3592,2092],{"class":139},[101,3594,1284],{"class":521},[101,3596,879],{"class":136},[101,3598,2092],{"class":139},[101,3600,1237],{"class":521},[101,3602,879],{"class":136},[101,3604,525],{"class":139},[101,3606,1284],{"class":521},[101,3608,879],{"class":136},[101,3610,2129],{"class":139},[101,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664],{"class":132,"line":3613},192,[101,3615,2135],{"class":521},[101,3617,879],{"class":136},[101,3619,525],{"class":139},[101,3621,1263],{"class":136},[101,3623,1884],{"class":521},[101,3625,879],{"class":136},[101,3627,2092],{"class":139},[101,3629,1884],{"class":521},[101,3631,879],{"class":136},[101,3633,2092],{"class":139},[101,3635,1284],{"class":521},[101,3637,879],{"class":136},[101,3639,525],{"class":139},[101,3641,1263],{"class":136},[101,3643,1237],{"class":521},[101,3645,879],{"class":136},[101,3647,2092],{"class":139},[101,3649,1284],{"class":521},[101,3651,879],{"class":136},[101,3653,2092],{"class":139},[101,3655,1237],{"class":521},[101,3657,879],{"class":136},[101,3659,525],{"class":139},[101,3661,1284],{"class":521},[101,3663,879],{"class":136},[101,3665,2129],{"class":139},[101,3667,3669,3671,3673,3675,3677,3679,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3717,3719,3721],{"class":132,"line":3668},193,[101,3670,2077],{"class":136},[101,3672,1884],{"class":521},[101,3674,879],{"class":136},[101,3676,525],{"class":139},[101,3678,1263],{"class":136},[101,3680,1884],{"class":521},[101,3682,879],{"class":136},[101,3684,2092],{"class":139},[101,3686,1884],{"class":521},[101,3688,879],{"class":136},[101,3690,2092],{"class":139},[101,3692,1284],{"class":521},[101,3694,879],{"class":136},[101,3696,525],{"class":139},[101,3698,1263],{"class":136},[101,3700,1237],{"class":521},[101,3702,879],{"class":136},[101,3704,2092],{"class":139},[101,3706,1284],{"class":521},[101,3708,879],{"class":136},[101,3710,2092],{"class":139},[101,3712,1284],{"class":521},[101,3714,879],{"class":136},[101,3716,525],{"class":139},[101,3718,1284],{"class":521},[101,3720,879],{"class":136},[101,3722,2129],{"class":139},[101,3724,3726,3728,3730,3732,3734,3736,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764,3766,3768,3770,3772,3774,3776,3778,3780],{"class":132,"line":3725},194,[101,3727,2077],{"class":136},[101,3729,1884],{"class":521},[101,3731,879],{"class":136},[101,3733,525],{"class":139},[101,3735,1263],{"class":136},[101,3737,1884],{"class":521},[101,3739,879],{"class":136},[101,3741,525],{"class":139},[101,3743,1263],{"class":136},[101,3745,1884],{"class":521},[101,3747,879],{"class":136},[101,3749,2092],{"class":139},[101,3751,1284],{"class":521},[101,3753,879],{"class":136},[101,3755,525],{"class":139},[101,3757,1263],{"class":136},[101,3759,1237],{"class":521},[101,3761,879],{"class":136},[101,3763,2092],{"class":139},[101,3765,1284],{"class":521},[101,3767,879],{"class":136},[101,3769,2092],{"class":139},[101,3771,1284],{"class":521},[101,3773,879],{"class":136},[101,3775,525],{"class":139},[101,3777,1237],{"class":521},[101,3779,879],{"class":136},[101,3781,2129],{"class":139},[101,3783,3785],{"class":132,"line":3784},195,[101,3786,537],{"class":139},[101,3788,3790],{"class":132,"line":3789},196,[101,3791,3792],{"class":236},"    \u002F\u002F 上面\n",[101,3794,3796,3798,3800,3802,3804,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844,3846],{"class":132,"line":3795},197,[101,3797,2077],{"class":136},[101,3799,1884],{"class":521},[101,3801,879],{"class":136},[101,3803,2092],{"class":139},[101,3805,1884],{"class":521},[101,3807,879],{"class":136},[101,3809,525],{"class":139},[101,3811,1263],{"class":136},[101,3813,1884],{"class":521},[101,3815,879],{"class":136},[101,3817,2092],{"class":139},[101,3819,1284],{"class":521},[101,3821,879],{"class":136},[101,3823,2092],{"class":139},[101,3825,1237],{"class":521},[101,3827,879],{"class":136},[101,3829,2092],{"class":139},[101,3831,1284],{"class":521},[101,3833,879],{"class":136},[101,3835,2092],{"class":139},[101,3837,1284],{"class":521},[101,3839,879],{"class":136},[101,3841,525],{"class":139},[101,3843,1237],{"class":521},[101,3845,879],{"class":136},[101,3847,2129],{"class":139},[101,3849,3851,3853,3855,3857,3859,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899],{"class":132,"line":3850},198,[101,3852,2135],{"class":521},[101,3854,879],{"class":136},[101,3856,2092],{"class":139},[101,3858,1884],{"class":521},[101,3860,879],{"class":136},[101,3862,525],{"class":139},[101,3864,1263],{"class":136},[101,3866,1884],{"class":521},[101,3868,879],{"class":136},[101,3870,2092],{"class":139},[101,3872,1284],{"class":521},[101,3874,879],{"class":136},[101,3876,2092],{"class":139},[101,3878,1237],{"class":521},[101,3880,879],{"class":136},[101,3882,2092],{"class":139},[101,3884,1284],{"class":521},[101,3886,879],{"class":136},[101,3888,2092],{"class":139},[101,3890,1237],{"class":521},[101,3892,879],{"class":136},[101,3894,525],{"class":139},[101,3896,1237],{"class":521},[101,3898,879],{"class":136},[101,3900,2129],{"class":139},[101,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920,3922,3924,3926,3928,3930,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950],{"class":132,"line":3903},199,[101,3905,2135],{"class":521},[101,3907,879],{"class":136},[101,3909,2092],{"class":139},[101,3911,1884],{"class":521},[101,3913,879],{"class":136},[101,3915,2092],{"class":139},[101,3917,1884],{"class":521},[101,3919,879],{"class":136},[101,3921,2092],{"class":139},[101,3923,1284],{"class":521},[101,3925,879],{"class":136},[101,3927,2092],{"class":139},[101,3929,1237],{"class":521},[101,3931,879],{"class":136},[101,3933,2092],{"class":139},[101,3935,1284],{"class":521},[101,3937,879],{"class":136},[101,3939,2092],{"class":139},[101,3941,1237],{"class":521},[101,3943,879],{"class":136},[101,3945,525],{"class":139},[101,3947,1284],{"class":521},[101,3949,879],{"class":136},[101,3951,2129],{"class":139},[101,3953,3955,3957,3959,3961,3963,3965,3967,3969,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999,4001],{"class":132,"line":3954},200,[101,3956,2135],{"class":521},[101,3958,879],{"class":136},[101,3960,2092],{"class":139},[101,3962,1884],{"class":521},[101,3964,879],{"class":136},[101,3966,2092],{"class":139},[101,3968,1884],{"class":521},[101,3970,879],{"class":136},[101,3972,2092],{"class":139},[101,3974,1284],{"class":521},[101,3976,879],{"class":136},[101,3978,2092],{"class":139},[101,3980,1237],{"class":521},[101,3982,879],{"class":136},[101,3984,2092],{"class":139},[101,3986,1284],{"class":521},[101,3988,879],{"class":136},[101,3990,2092],{"class":139},[101,3992,1237],{"class":521},[101,3994,879],{"class":136},[101,3996,525],{"class":139},[101,3998,1284],{"class":521},[101,4000,879],{"class":136},[101,4002,2129],{"class":139},[101,4004,4006,4008,4010,4012,4014,4016,4018,4020,4022,4024,4026,4028,4030,4032,4034,4036,4038,4040,4042,4044,4046,4048,4050,4052,4054],{"class":132,"line":4005},201,[101,4007,2077],{"class":136},[101,4009,1884],{"class":521},[101,4011,879],{"class":136},[101,4013,2092],{"class":139},[101,4015,1884],{"class":521},[101,4017,879],{"class":136},[101,4019,2092],{"class":139},[101,4021,1884],{"class":521},[101,4023,879],{"class":136},[101,4025,2092],{"class":139},[101,4027,1284],{"class":521},[101,4029,879],{"class":136},[101,4031,2092],{"class":139},[101,4033,1237],{"class":521},[101,4035,879],{"class":136},[101,4037,2092],{"class":139},[101,4039,1284],{"class":521},[101,4041,879],{"class":136},[101,4043,2092],{"class":139},[101,4045,1284],{"class":521},[101,4047,879],{"class":136},[101,4049,525],{"class":139},[101,4051,1284],{"class":521},[101,4053,879],{"class":136},[101,4055,2129],{"class":139},[101,4057,4059,4061,4063,4065,4067,4069,4071,4073,4075,4077,4079,4081,4083,4085,4087,4089,4091,4093,4095,4097,4099,4101,4103,4105,4107],{"class":132,"line":4058},202,[101,4060,2077],{"class":136},[101,4062,1884],{"class":521},[101,4064,879],{"class":136},[101,4066,2092],{"class":139},[101,4068,1884],{"class":521},[101,4070,879],{"class":136},[101,4072,525],{"class":139},[101,4074,1263],{"class":136},[101,4076,1884],{"class":521},[101,4078,879],{"class":136},[101,4080,2092],{"class":139},[101,4082,1284],{"class":521},[101,4084,879],{"class":136},[101,4086,2092],{"class":139},[101,4088,1237],{"class":521},[101,4090,879],{"class":136},[101,4092,2092],{"class":139},[101,4094,1284],{"class":521},[101,4096,879],{"class":136},[101,4098,2092],{"class":139},[101,4100,1284],{"class":521},[101,4102,879],{"class":136},[101,4104,525],{"class":139},[101,4106,1237],{"class":521},[101,4108,4109],{"class":136},"f\n",[101,4111,4113],{"class":132,"line":4112},203,[101,4114,4115],{"class":139},"};\n",[101,4117,4119],{"class":132,"line":4118},204,[101,4120,537],{"class":139},[101,4122,4124],{"class":132,"line":4123},205,[101,4125,4126],{"class":236},"    \u002F\u002F 创建VAO\n",[101,4128,4130,4132,4134],{"class":132,"line":4129},206,[101,4131,505],{"class":136},[101,4133,481],{"class":136},[101,4135,4136],{"class":139}," VAO;\n",[101,4138,4140,4143,4145,4147,4149,4151],{"class":132,"line":4139},207,[101,4141,4142],{"class":163},"    glGenVertexArrays",[101,4144,160],{"class":139},[101,4146,522],{"class":521},[101,4148,525],{"class":139},[101,4150,528],{"class":136},[101,4152,4153],{"class":139},"VAO);\n",[101,4155,4157,4160,4163],{"class":132,"line":4156},208,[101,4158,4159],{"class":163},"    glBindVertexArray",[101,4161,4162],{"class":139},"(VAO);",[101,4164,4165],{"class":236}," \u002F\u002F 绑定VAO\n",[101,4167,4169],{"class":132,"line":4168},209,[101,4170,260],{"emptyLinePlaceholder":259},[101,4172,4174],{"class":132,"line":4173},210,[101,4175,4176],{"class":236},"    \u002F\u002F 创建VBO\n",[101,4178,4180,4182,4184],{"class":132,"line":4179},211,[101,4181,505],{"class":136},[101,4183,481],{"class":136},[101,4185,4186],{"class":139}," VBO;\n",[101,4188,4190,4193,4195,4197,4199,4201],{"class":132,"line":4189},212,[101,4191,4192],{"class":163},"    glGenBuffers",[101,4194,160],{"class":139},[101,4196,522],{"class":521},[101,4198,525],{"class":139},[101,4200,528],{"class":136},[101,4202,4203],{"class":139},"VBO);\n",[101,4205,4207,4210,4213],{"class":132,"line":4206},213,[101,4208,4209],{"class":163},"    glBindBuffer",[101,4211,4212],{"class":139},"(GL_ARRAY_BUFFER, VBO);",[101,4214,4215],{"class":236}," \u002F\u002F 绑定VBO\n",[101,4217,4219,4222,4225,4228],{"class":132,"line":4218},214,[101,4220,4221],{"class":163},"    glBufferData",[101,4223,4224],{"class":139},"(GL_ARRAY_BUFFER, ",[101,4226,4227],{"class":136},"sizeof",[101,4229,4230],{"class":139},"(vertices), vertices, GL_STATIC_DRAW);\n",[101,4232,4234],{"class":132,"line":4233},215,[101,4235,260],{"emptyLinePlaceholder":259},[101,4237,4239,4242],{"class":132,"line":4238},216,[101,4240,4241],{"class":136},"    int",[101,4243,4244],{"class":139}," nrAttributes;\n",[101,4246,4248,4251,4254,4256],{"class":132,"line":4247},217,[101,4249,4250],{"class":163},"    glGetIntegerv",[101,4252,4253],{"class":139},"(GL_MAX_VERTEX_ATTRIBS, ",[101,4255,528],{"class":136},[101,4257,4258],{"class":139},"nrAttributes);\n",[101,4260,4262,4265,4267,4269,4272,4274,4277,4279,4281],{"class":132,"line":4261},218,[101,4263,4264],{"class":163},"    std",[101,4266,584],{"class":139},[101,4268,587],{"class":136},[101,4270,4271],{"class":339}," \"Maximum nr of vertex attributes supported: \"",[101,4273,593],{"class":136},[101,4275,4276],{"class":139}," nrAttributes ",[101,4278,587],{"class":136},[101,4280,601],{"class":163},[101,4282,604],{"class":139},[101,4284,4286],{"class":132,"line":4285},219,[101,4287,260],{"emptyLinePlaceholder":259},[101,4289,4291],{"class":132,"line":4290},220,[101,4292,4293],{"class":236},"    \u002F\u002F 位置属性\n",[101,4295,4297,4300,4302,4304,4306,4308,4311,4314,4316,4319,4321,4323,4325,4328,4330,4332],{"class":132,"line":4296},221,[101,4298,4299],{"class":163},"    glVertexAttribPointer",[101,4301,160],{"class":139},[101,4303,669],{"class":521},[101,4305,525],{"class":139},[101,4307,1400],{"class":521},[101,4309,4310],{"class":139},", GL_FLOAT, GL_FALSE, ",[101,4312,4313],{"class":521},"8",[101,4315,990],{"class":136},[101,4317,4318],{"class":136}," sizeof",[101,4320,160],{"class":139},[101,4322,868],{"class":136},[101,4324,1333],{"class":139},[101,4326,4327],{"class":136},"void*",[101,4329,1338],{"class":139},[101,4331,669],{"class":521},[101,4333,672],{"class":139},[101,4335,4337,4340,4342,4344,4347],{"class":132,"line":4336},222,[101,4338,4339],{"class":163},"    glEnableVertexAttribArray",[101,4341,160],{"class":139},[101,4343,669],{"class":521},[101,4345,4346],{"class":139},");",[101,4348,4349],{"class":236}," \u002F\u002F 启用顶点属性\n",[101,4351,4353],{"class":132,"line":4352},223,[101,4354,537],{"class":139},[101,4356,4358],{"class":132,"line":4357},224,[101,4359,4360],{"class":236},"    \u002F\u002F 法线属性\n",[101,4362,4364,4366,4368,4370,4372,4374,4376,4378,4380,4382,4384,4386,4388,4390,4393,4395,4397,4399,4401,4403],{"class":132,"line":4363},225,[101,4365,4299],{"class":163},[101,4367,160],{"class":139},[101,4369,522],{"class":521},[101,4371,525],{"class":139},[101,4373,1400],{"class":521},[101,4375,4310],{"class":139},[101,4377,4313],{"class":521},[101,4379,990],{"class":136},[101,4381,4318],{"class":136},[101,4383,160],{"class":139},[101,4385,868],{"class":136},[101,4387,1333],{"class":139},[101,4389,4327],{"class":136},[101,4391,4392],{"class":139},")(",[101,4394,1400],{"class":521},[101,4396,990],{"class":136},[101,4398,4318],{"class":136},[101,4400,160],{"class":139},[101,4402,868],{"class":136},[101,4404,4405],{"class":139},")));\n",[101,4407,4409,4411,4413,4415,4417],{"class":132,"line":4408},226,[101,4410,4339],{"class":163},[101,4412,160],{"class":139},[101,4414,522],{"class":521},[101,4416,4346],{"class":139},[101,4418,4419],{"class":236}," \u002F\u002F 启用法线属性\n",[101,4421,4423],{"class":132,"line":4422},227,[101,4424,537],{"class":139},[101,4426,4428],{"class":132,"line":4427},228,[101,4429,4430],{"class":236},"    \u002F\u002F 纹理坐标属性\n",[101,4432,4434,4436,4438,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4463,4466,4468,4470,4472,4474],{"class":132,"line":4433},229,[101,4435,4299],{"class":163},[101,4437,160],{"class":139},[101,4439,4440],{"class":521},"2",[101,4442,525],{"class":139},[101,4444,4440],{"class":521},[101,4446,4310],{"class":139},[101,4448,4313],{"class":521},[101,4450,990],{"class":136},[101,4452,4318],{"class":136},[101,4454,160],{"class":139},[101,4456,868],{"class":136},[101,4458,1333],{"class":139},[101,4460,4327],{"class":136},[101,4462,4392],{"class":139},[101,4464,4465],{"class":521},"6",[101,4467,990],{"class":136},[101,4469,4318],{"class":136},[101,4471,160],{"class":139},[101,4473,868],{"class":136},[101,4475,4405],{"class":139},[101,4477,4479,4481,4483,4485,4487],{"class":132,"line":4478},230,[101,4480,4339],{"class":163},[101,4482,160],{"class":139},[101,4484,4440],{"class":521},[101,4486,4346],{"class":139},[101,4488,4489],{"class":236}," \u002F\u002F 启用纹理坐标属性\n",[101,4491,4493],{"class":132,"line":4492},231,[101,4494,260],{"emptyLinePlaceholder":259},[101,4496,4498],{"class":132,"line":4497},232,[101,4499,4500],{"class":236},"    \u002F\u002F 构建并编译着色器程序\n",[101,4502,4504,4507,4510,4512,4515,4517,4520],{"class":132,"line":4503},233,[101,4505,4506],{"class":163},"    Shader",[101,4508,4509],{"class":163}," lightingShader",[101,4511,160],{"class":139},[101,4513,4514],{"class":339},"\"shader\u002Flighting.vert\"",[101,4516,525],{"class":139},[101,4518,4519],{"class":339},"\"shader\u002Flighting.frag\"",[101,4521,672],{"class":139},[101,4523,4525,4527,4530,4532,4535,4537,4540],{"class":132,"line":4524},234,[101,4526,4506],{"class":163},[101,4528,4529],{"class":163}," lampShader",[101,4531,160],{"class":139},[101,4533,4534],{"class":339},"\"shader\u002Flamp.vert\"",[101,4536,525],{"class":139},[101,4538,4539],{"class":339},"\"shader\u002Flamp.frag\"",[101,4541,672],{"class":139},[101,4543,4545],{"class":132,"line":4544},235,[101,4546,260],{"emptyLinePlaceholder":259},[101,4548,4550],{"class":132,"line":4549},236,[101,4551,4552],{"class":236},"    \u002F\u002F 加载纹理\n",[101,4554,4556,4558,4560,4563,4565,4567,4569,4572],{"class":132,"line":4555},237,[101,4557,505],{"class":136},[101,4559,481],{"class":136},[101,4561,4562],{"class":139}," texture1 ",[101,4564,143],{"class":136},[101,4566,484],{"class":163},[101,4568,160],{"class":139},[101,4570,4571],{"class":339},"\"Assets\u002Fimage.png\"",[101,4573,672],{"class":139},[101,4575,4577,4579,4582,4584,4587],{"class":132,"line":4576},238,[101,4578,566],{"class":136},[101,4580,4581],{"class":139}," (texture1 ",[101,4583,1036],{"class":136},[101,4585,4586],{"class":521}," 0",[101,4588,499],{"class":139},[101,4590,4592,4594,4596,4598,4601,4603,4605],{"class":132,"line":4591},239,[101,4593,581],{"class":163},[101,4595,584],{"class":139},[101,4597,587],{"class":136},[101,4599,4600],{"class":339}," \"Failed to load texture\"",[101,4602,593],{"class":136},[101,4604,601],{"class":163},[101,4606,604],{"class":139},[101,4608,4610],{"class":132,"line":4609},240,[101,4611,618],{"class":139},[101,4613,4615],{"class":132,"line":4614},241,[101,4616,260],{"emptyLinePlaceholder":259},[101,4618,4620],{"class":132,"line":4619},242,[101,4621,4622],{"class":236},"    \u002F\u002F 创建光源的 VAO\n",[101,4624,4626,4628,4630],{"class":132,"line":4625},243,[101,4627,505],{"class":136},[101,4629,481],{"class":136},[101,4631,4632],{"class":139}," lightVAO;\n",[101,4634,4636,4638,4640,4642,4644,4646],{"class":132,"line":4635},244,[101,4637,4142],{"class":163},[101,4639,160],{"class":139},[101,4641,522],{"class":521},[101,4643,525],{"class":139},[101,4645,528],{"class":136},[101,4647,4648],{"class":139},"lightVAO);\n",[101,4650,4652,4654],{"class":132,"line":4651},245,[101,4653,4159],{"class":163},[101,4655,4656],{"class":139},"(lightVAO);\n",[101,4658,4660,4662],{"class":132,"line":4659},246,[101,4661,4209],{"class":163},[101,4663,4664],{"class":139},"(GL_ARRAY_BUFFER, VBO);\n",[101,4666,4668,4670,4672,4674,4676,4678,4680,4682,4684,4686,4688,4690,4692,4694,4696,4698],{"class":132,"line":4667},247,[101,4669,4299],{"class":163},[101,4671,160],{"class":139},[101,4673,669],{"class":521},[101,4675,525],{"class":139},[101,4677,1400],{"class":521},[101,4679,4310],{"class":139},[101,4681,4313],{"class":521},[101,4683,990],{"class":136},[101,4685,4318],{"class":136},[101,4687,160],{"class":139},[101,4689,868],{"class":136},[101,4691,1333],{"class":139},[101,4693,4327],{"class":136},[101,4695,1338],{"class":139},[101,4697,669],{"class":521},[101,4699,672],{"class":139},[101,4701,4703,4705,4707,4709],{"class":132,"line":4702},248,[101,4704,4339],{"class":163},[101,4706,160],{"class":139},[101,4708,669],{"class":521},[101,4710,672],{"class":139},[101,4712,4714],{"class":132,"line":4713},249,[101,4715,260],{"emptyLinePlaceholder":259},[101,4717,4719],{"class":132,"line":4718},250,[101,4720,4721],{"class":236},"    \u002F\u002F 光源位置\n",[101,4723,4725,4728,4731,4733,4736,4738,4740,4742,4744,4746,4749,4751],{"class":132,"line":4724},251,[101,4726,4727],{"class":163},"    vec3",[101,4729,4730],{"class":163}," lightPos",[101,4732,160],{"class":139},[101,4734,4735],{"class":521},"1.2",[101,4737,879],{"class":136},[101,4739,525],{"class":139},[101,4741,1237],{"class":521},[101,4743,879],{"class":136},[101,4745,525],{"class":139},[101,4747,4748],{"class":521},"2.0",[101,4750,879],{"class":136},[101,4752,672],{"class":139},[101,4754,4756],{"class":132,"line":4755},252,[101,4757,537],{"class":139},[101,4759,4761],{"class":132,"line":4760},253,[101,4762,4763],{"class":236},"    \u002F\u002F 相机位置（观察空间）\n",[101,4765,4767,4769,4772,4774,4776,4779],{"class":132,"line":4766},254,[101,4768,4727],{"class":163},[101,4770,4771],{"class":139}," viewPos ",[101,4773,143],{"class":136},[101,4775,1169],{"class":139},[101,4777,4778],{"class":163},"getCameraPosition",[101,4780,1388],{"class":139},[101,4782,4784],{"class":132,"line":4783},255,[101,4785,260],{"emptyLinePlaceholder":259},[101,4787,4789],{"class":132,"line":4788},256,[101,4790,4791],{"class":236},"    \u002F\u002F 渲染循环\n",[101,4793,4795,4798,4800,4802,4805],{"class":132,"line":4794},257,[101,4796,4797],{"class":136},"    while",[101,4799,1027],{"class":139},[101,4801,1620],{"class":136},[101,4803,4804],{"class":163},"glfwWindowShouldClose",[101,4806,4807],{"class":139},"(window)) {\n",[101,4809,4811],{"class":132,"line":4810},258,[101,4812,4813],{"class":236},"        \u002F\u002F 处理输入\n",[101,4815,4817,4820],{"class":132,"line":4816},259,[101,4818,4819],{"class":163},"        processInput",[101,4821,1014],{"class":139},[101,4823,4825,4828],{"class":132,"line":4824},260,[101,4826,4827],{"class":163},"        glfwPollEvents",[101,4829,1388],{"class":139},[101,4831,4833],{"class":132,"line":4832},261,[101,4834,260],{"emptyLinePlaceholder":259},[101,4836,4838],{"class":132,"line":4837},262,[101,4839,4840],{"class":236},"        \u002F\u002F 从 DPI 稳定器获取 view 矩阵\n",[101,4842,4844,4847,4850,4852,4854,4857],{"class":132,"line":4843},263,[101,4845,4846],{"class":163},"        mat4",[101,4848,4849],{"class":139}," view ",[101,4851,143],{"class":136},[101,4853,1169],{"class":139},[101,4855,4856],{"class":163},"getViewMatrix",[101,4858,1388],{"class":139},[101,4860,4862],{"class":132,"line":4861},264,[101,4863,1785],{"class":139},[101,4865,4867,4869,4872,4874,4877],{"class":132,"line":4866},265,[101,4868,1837],{"class":136},[101,4870,4871],{"class":139}," currentFrame ",[101,4873,143],{"class":136},[101,4875,4876],{"class":163}," glfwGetTime",[101,4878,1388],{"class":139},[101,4880,4882,4885,4887,4889,4891],{"class":132,"line":4881},266,[101,4883,4884],{"class":139},"        deltaTime ",[101,4886,143],{"class":136},[101,4888,4871],{"class":139},[101,4890,1263],{"class":136},[101,4892,4893],{"class":139}," lastFrame;\n",[101,4895,4897,4900,4902],{"class":132,"line":4896},267,[101,4898,4899],{"class":139},"        lastFrame ",[101,4901,143],{"class":136},[101,4903,4904],{"class":139}," currentFrame;\n",[101,4906,4908],{"class":132,"line":4907},268,[101,4909,260],{"emptyLinePlaceholder":259},[101,4911,4913],{"class":132,"line":4912},269,[101,4914,4915],{"class":236},"        \u002F\u002F 渲染指令\n",[101,4917,4919,4922,4924,4927,4929,4931,4934,4936,4938,4940,4942,4944,4946,4948],{"class":132,"line":4918},270,[101,4920,4921],{"class":163},"        glClearColor",[101,4923,160],{"class":139},[101,4925,4926],{"class":521},"0.2",[101,4928,879],{"class":136},[101,4930,525],{"class":139},[101,4932,4933],{"class":521},"0.3",[101,4935,879],{"class":136},[101,4937,525],{"class":139},[101,4939,4933],{"class":521},[101,4941,879],{"class":136},[101,4943,525],{"class":139},[101,4945,1237],{"class":521},[101,4947,879],{"class":136},[101,4949,672],{"class":139},[101,4951,4953,4956,4959,4962],{"class":132,"line":4952},271,[101,4954,4955],{"class":163},"        glClear",[101,4957,4958],{"class":139},"(GL_COLOR_BUFFER_BIT ",[101,4960,4961],{"class":136},"|",[101,4963,4964],{"class":139}," GL_DEPTH_BUFFER_BIT);\n",[101,4966,4968],{"class":132,"line":4967},272,[101,4969,1785],{"class":139},[101,4971,4973],{"class":132,"line":4972},273,[101,4974,4975],{"class":236},"        \u002F\u002F 使用光照着色器绘制物体\n",[101,4977,4979,4982,4985],{"class":132,"line":4978},274,[101,4980,4981],{"class":139},"        lightingShader.",[101,4983,4984],{"class":163},"use",[101,4986,1388],{"class":139},[101,4988,4990],{"class":132,"line":4989},275,[101,4991,1785],{"class":139},[101,4993,4995],{"class":132,"line":4994},276,[101,4996,4997],{"class":236},"        \u002F\u002F 绑定纹理\n",[101,4999,5001,5004],{"class":132,"line":5000},277,[101,5002,5003],{"class":163},"        glActiveTexture",[101,5005,5006],{"class":139},"(GL_TEXTURE0);\n",[101,5008,5010,5013],{"class":132,"line":5009},278,[101,5011,5012],{"class":163},"        glBindTexture",[101,5014,5015],{"class":139},"(GL_TEXTURE_2D, texture1);\n",[101,5017,5019,5021,5024,5026,5029,5031,5033],{"class":132,"line":5018},279,[101,5020,4981],{"class":139},[101,5022,5023],{"class":163},"setInt",[101,5025,160],{"class":139},[101,5027,5028],{"class":339},"\"material.diffuse\"",[101,5030,525],{"class":139},[101,5032,669],{"class":521},[101,5034,672],{"class":139},[101,5036,5038],{"class":132,"line":5037},280,[101,5039,1785],{"class":139},[101,5041,5043,5045,5048,5050,5053],{"class":132,"line":5042},281,[101,5044,4981],{"class":139},[101,5046,5047],{"class":163},"setMat4",[101,5049,160],{"class":139},[101,5051,5052],{"class":339},"\"projection\"",[101,5054,5055],{"class":139},", projection);\n",[101,5057,5059,5061,5063,5065,5068],{"class":132,"line":5058},282,[101,5060,4981],{"class":139},[101,5062,5047],{"class":163},[101,5064,160],{"class":139},[101,5066,5067],{"class":339},"\"view\"",[101,5069,5070],{"class":139},", view);\n",[101,5072,5074,5076,5078,5080,5083],{"class":132,"line":5073},283,[101,5075,4981],{"class":139},[101,5077,5047],{"class":163},[101,5079,160],{"class":139},[101,5081,5082],{"class":339},"\"model\"",[101,5084,5085],{"class":139},", model);\n",[101,5087,5089,5091,5094,5096,5099],{"class":132,"line":5088},284,[101,5090,4981],{"class":139},[101,5092,5093],{"class":163},"setVec3",[101,5095,160],{"class":139},[101,5097,5098],{"class":339},"\"light.position\"",[101,5100,5101],{"class":139},", lightPos.x, lightPos.y, lightPos.z);\n",[101,5103,5105,5107,5109,5111,5114,5116,5118,5120,5122,5124,5126,5128,5130,5132,5134],{"class":132,"line":5104},285,[101,5106,4981],{"class":139},[101,5108,5093],{"class":163},[101,5110,160],{"class":139},[101,5112,5113],{"class":339},"\"light.ambient\"",[101,5115,2092],{"class":139},[101,5117,1237],{"class":521},[101,5119,879],{"class":136},[101,5121,525],{"class":139},[101,5123,1237],{"class":521},[101,5125,879],{"class":136},[101,5127,525],{"class":139},[101,5129,1237],{"class":521},[101,5131,879],{"class":136},[101,5133,4346],{"class":139},[101,5135,5136],{"class":236},"   \u002F\u002F 最大环境光强度\n",[101,5138,5140,5142,5144,5146,5149,5151,5153,5155,5157,5159,5161,5163,5165,5167,5169],{"class":132,"line":5139},286,[101,5141,4981],{"class":139},[101,5143,5093],{"class":163},[101,5145,160],{"class":139},[101,5147,5148],{"class":339},"\"light.diffuse\"",[101,5150,2092],{"class":139},[101,5152,1237],{"class":521},[101,5154,879],{"class":136},[101,5156,525],{"class":139},[101,5158,1237],{"class":521},[101,5160,879],{"class":136},[101,5162,525],{"class":139},[101,5164,1237],{"class":521},[101,5166,879],{"class":136},[101,5168,4346],{"class":139},[101,5170,5171],{"class":236},"   \u002F\u002F 增加漫反射强度\n",[101,5173,5175,5177,5179,5181,5184,5186,5188,5190,5192,5194,5196,5198,5200,5202],{"class":132,"line":5174},287,[101,5176,4981],{"class":139},[101,5178,5093],{"class":163},[101,5180,160],{"class":139},[101,5182,5183],{"class":339},"\"light.specular\"",[101,5185,525],{"class":139},[101,5187,1237],{"class":521},[101,5189,879],{"class":136},[101,5191,525],{"class":139},[101,5193,1237],{"class":521},[101,5195,879],{"class":136},[101,5197,525],{"class":139},[101,5199,1237],{"class":521},[101,5201,879],{"class":136},[101,5203,5204],{"class":139},"); \n",[101,5206,5208,5210,5212,5214,5217,5219,5222,5224,5226,5229,5231,5233,5235,5237],{"class":132,"line":5207},288,[101,5209,4981],{"class":139},[101,5211,5093],{"class":163},[101,5213,160],{"class":139},[101,5215,5216],{"class":339},"\"material.specular\"",[101,5218,525],{"class":139},[101,5220,5221],{"class":521},"0.633",[101,5223,879],{"class":136},[101,5225,525],{"class":139},[101,5227,5228],{"class":521},"0.727811",[101,5230,879],{"class":136},[101,5232,525],{"class":139},[101,5234,5221],{"class":521},[101,5236,879],{"class":136},[101,5238,672],{"class":139},[101,5240,5242],{"class":132,"line":5241},289,[101,5243,5244],{"class":236},"        \u002F\u002F 高光指数：通常乘以 128 (OpenGL 最大的 1.0 对应 128)\n",[101,5246,5248,5250,5253,5255,5258,5260,5263,5265,5267,5270,5272,5274],{"class":132,"line":5247},290,[101,5249,4981],{"class":139},[101,5251,5252],{"class":163},"setFloat",[101,5254,160],{"class":139},[101,5256,5257],{"class":339},"\"material.shininess\"",[101,5259,525],{"class":139},[101,5261,5262],{"class":521},"0.6",[101,5264,879],{"class":136},[101,5266,990],{"class":136},[101,5268,5269],{"class":521}," 128.0",[101,5271,879],{"class":136},[101,5273,4346],{"class":139},[101,5275,5276],{"class":236}," \u002F\u002F 76.8\n",[101,5278,5280],{"class":132,"line":5279},291,[101,5281,1785],{"class":139},[101,5283,5285],{"class":132,"line":5284},292,[101,5286,5287],{"class":236},"        \u002F\u002F 设置相机位置（观察空间）\n",[101,5289,5291,5294,5297,5299,5301,5303],{"class":132,"line":5290},293,[101,5292,5293],{"class":163},"        vec3",[101,5295,5296],{"class":139}," currentViewPos ",[101,5298,143],{"class":136},[101,5300,1169],{"class":139},[101,5302,4778],{"class":163},[101,5304,1388],{"class":139},[101,5306,5308,5310,5312,5314,5317],{"class":132,"line":5307},294,[101,5309,4981],{"class":139},[101,5311,5093],{"class":163},[101,5313,160],{"class":139},[101,5315,5316],{"class":339},"\"viewPos\"",[101,5318,5319],{"class":139},", currentViewPos.x, currentViewPos.y, currentViewPos.z);\n",[101,5321,5323],{"class":132,"line":5322},295,[101,5324,1785],{"class":139},[101,5326,5328,5331],{"class":132,"line":5327},296,[101,5329,5330],{"class":163},"        glBindVertexArray",[101,5332,5333],{"class":139},"(VAO);\n",[101,5335,5337,5340,5343,5345,5347,5350],{"class":132,"line":5336},297,[101,5338,5339],{"class":163},"        glDrawArrays",[101,5341,5342],{"class":139},"(GL_TRIANGLES, ",[101,5344,669],{"class":521},[101,5346,525],{"class":139},[101,5348,5349],{"class":521},"36",[101,5351,672],{"class":139},[101,5353,5355],{"class":132,"line":5354},298,[101,5356,1785],{"class":139},[101,5358,5360],{"class":132,"line":5359},299,[101,5361,5362],{"class":236},"        \u002F\u002F 绘制光源立方体\n",[101,5364,5366,5369,5371],{"class":132,"line":5365},300,[101,5367,5368],{"class":139},"        lampShader.",[101,5370,4984],{"class":163},[101,5372,1388],{"class":139},[101,5374,5376,5378,5380,5382,5384],{"class":132,"line":5375},301,[101,5377,5368],{"class":139},[101,5379,5047],{"class":163},[101,5381,160],{"class":139},[101,5383,5052],{"class":339},[101,5385,5055],{"class":139},[101,5387,5389,5391,5393,5395,5397],{"class":132,"line":5388},302,[101,5390,5368],{"class":139},[101,5392,5047],{"class":163},[101,5394,160],{"class":139},[101,5396,5067],{"class":339},[101,5398,5070],{"class":139},[101,5400,5402],{"class":132,"line":5401},303,[101,5403,1785],{"class":139},[101,5405,5407],{"class":132,"line":5406},304,[101,5408,5409],{"class":236},"        \u002F\u002F 光源立方体的模型矩阵\n",[101,5411,5413,5415,5418,5420,5422,5424,5426,5428],{"class":132,"line":5412},305,[101,5414,4846],{"class":163},[101,5416,5417],{"class":139}," lampModel ",[101,5419,143],{"class":136},[101,5421,1232],{"class":163},[101,5423,160],{"class":139},[101,5425,1237],{"class":521},[101,5427,879],{"class":136},[101,5429,672],{"class":139},[101,5431,5433,5436,5438,5441],{"class":132,"line":5432},306,[101,5434,5435],{"class":139},"        lampModel ",[101,5437,143],{"class":136},[101,5439,5440],{"class":163}," translate",[101,5442,5443],{"class":139},"(lampModel, lightPos);\n",[101,5445,5447,5449,5451,5454,5457,5459,5461,5463,5465,5468],{"class":132,"line":5446},307,[101,5448,5435],{"class":139},[101,5450,143],{"class":136},[101,5452,5453],{"class":163}," scale",[101,5455,5456],{"class":139},"(lampModel, ",[101,5458,79],{"class":163},[101,5460,160],{"class":139},[101,5462,4926],{"class":521},[101,5464,879],{"class":136},[101,5466,5467],{"class":139},"));",[101,5469,5470],{"class":236}," \u002F\u002F 缩小光源立方体\n",[101,5472,5474,5476,5478,5480,5482],{"class":132,"line":5473},308,[101,5475,5368],{"class":139},[101,5477,5047],{"class":163},[101,5479,160],{"class":139},[101,5481,5082],{"class":339},[101,5483,5484],{"class":139},", lampModel);\n",[101,5486,5488],{"class":132,"line":5487},309,[101,5489,1785],{"class":139},[101,5491,5493,5495],{"class":132,"line":5492},310,[101,5494,5330],{"class":163},[101,5496,4656],{"class":139},[101,5498,5500,5502,5504,5506,5508,5510],{"class":132,"line":5499},311,[101,5501,5339],{"class":163},[101,5503,5342],{"class":139},[101,5505,669],{"class":521},[101,5507,525],{"class":139},[101,5509,5349],{"class":521},[101,5511,672],{"class":139},[101,5513,5515],{"class":132,"line":5514},312,[101,5516,1785],{"class":139},[101,5518,5520],{"class":132,"line":5519},313,[101,5521,5522],{"class":236},"        \u002F\u002F 使用 ImGui 管理器渲染所有窗口\n",[101,5524,5526,5528,5531],{"class":132,"line":5525},314,[101,5527,1045],{"class":139},[101,5529,5530],{"class":163},"render",[101,5532,1388],{"class":139},[101,5534,5536],{"class":132,"line":5535},315,[101,5537,260],{"emptyLinePlaceholder":259},[101,5539,5541],{"class":132,"line":5540},316,[101,5542,5543],{"class":236},"        \u002F\u002F 交换缓冲区和检查IO事件\n",[101,5545,5547,5550],{"class":132,"line":5546},317,[101,5548,5549],{"class":163},"        glfwSwapBuffers",[101,5551,1014],{"class":139},[101,5553,5555],{"class":132,"line":5554},318,[101,5556,618],{"class":139},[101,5558,5560],{"class":132,"line":5559},319,[101,5561,260],{"emptyLinePlaceholder":259},[101,5563,5565],{"class":132,"line":5564},320,[101,5566,5567],{"class":236},"    \u002F\u002F 清理 ImGui 管理器\n",[101,5569,5571,5573,5576],{"class":132,"line":5570},321,[101,5572,1677],{"class":139},[101,5574,5575],{"class":163},"shutdown",[101,5577,1388],{"class":139},[101,5579,5581],{"class":132,"line":5580},322,[101,5582,260],{"emptyLinePlaceholder":259},[101,5584,5586],{"class":132,"line":5585},323,[101,5587,5588],{"class":236},"    \u002F\u002F 清理资源\n",[101,5590,5592,5595,5597,5599,5601,5603],{"class":132,"line":5591},324,[101,5593,5594],{"class":163},"    glDeleteVertexArrays",[101,5596,160],{"class":139},[101,5598,522],{"class":521},[101,5600,525],{"class":139},[101,5602,528],{"class":136},[101,5604,4153],{"class":139},[101,5606,5608,5610,5612,5614,5616,5618],{"class":132,"line":5607},325,[101,5609,5594],{"class":163},[101,5611,160],{"class":139},[101,5613,522],{"class":521},[101,5615,525],{"class":139},[101,5617,528],{"class":136},[101,5619,4648],{"class":139},[101,5621,5623,5626,5628,5630,5632,5634],{"class":132,"line":5622},326,[101,5624,5625],{"class":163},"    glDeleteBuffers",[101,5627,160],{"class":139},[101,5629,522],{"class":521},[101,5631,525],{"class":139},[101,5633,528],{"class":136},[101,5635,4203],{"class":139},[101,5637,5639,5642,5644,5646,5648,5650],{"class":132,"line":5638},327,[101,5640,5641],{"class":163},"    glDeleteTextures",[101,5643,160],{"class":139},[101,5645,522],{"class":521},[101,5647,525],{"class":139},[101,5649,528],{"class":136},[101,5651,5652],{"class":139},"texture1);\n",[101,5654,5656,5659],{"class":132,"line":5655},328,[101,5657,5658],{"class":163},"    glfwTerminate",[101,5660,1388],{"class":139},[101,5662,5664,5666,5668],{"class":132,"line":5663},329,[101,5665,769],{"class":136},[101,5667,4586],{"class":521},[101,5669,449],{"class":139},[101,5671,5673],{"class":132,"line":5672},330,[101,5674,777],{"class":139},[31,5676,5677],{"id":5677},"镜面光贴图",[10,5679,5680,5681,5684,5685,5688],{},"你可能会注意到，镜面高光看起来有些奇怪，因为我们的物体大部分都是木头，我们知道木头不应该有这么强的镜面高光的。我们可以将物体的镜面光材质设置为",[73,5682,5683],{},"vec3(0.0)","来解决这个问题，但这也意味着箱子钢制的边框将不再能够显示镜面高光了，我们知道钢铁",[14,5686,5687],{},"应该","是有一些镜面高光的。所以，我们想要让物体的某些部分以不同的强度显示镜面高光。这个问题看起来和漫反射贴图非常相似。是巧合吗？我想不是。",[10,5690,5691,5692,5696],{},"我们同样可以使用一个专门用于镜面高光的纹理贴图。这也就意味着我们需要生成一个黑白的（如果你想得话也可以是彩色的）纹理，来定义物体每部分的镜面光强度。下面是一个",[41,5693,5677],{"href":5694,"rel":5695},"https:\u002F\u002Flearnopengl-cn.github.io\u002Fimg\u002F02\u002F04\u002Fcontainer2_specular.png",[45],"(Specular Map)的例子：",[10,5698,5699],{},[63,5700],{"alt":63,"src":5701},".\u002Fassets\u002Fcontainer2_specular.png",[10,5703,5704,5705,5707,5708,5711],{},"镜面高光的强度可以通过图像每个像素的亮度来获取。镜面光贴图上的每个像素都可以由一个颜色向量来表示，比如说黑色代表颜色向量",[73,5706,5683],{},"，灰色代表颜色向量",[73,5709,5710],{},"vec3(0.5)","。在片段着色器中，我们接下来会取样对应的颜色值并将它乘以光源的镜面强度。一个像素越「白」，乘积就会越大，物体的镜面光分量就会越亮。",[10,5713,5714],{},"由于箱子大部分都由木头所组成，而且木头材质应该没有镜面高光，所以漫反射纹理的整个木头部分全部都转换成了黑色。箱子钢制边框的镜面光强度是有细微变化的，钢铁本身会比较容易受到镜面高光的影响，而裂缝则不会。",[10,5716,5717],{},"从实际角度来说，木头其实也有镜面高光，尽管它的反光度(Shininess)很小（更多的光被散射），影响也比较小，但是为了教学目的，我们可以假设木头不会对镜面光有任何反应。",[10,5719,5720,5721,5724,5725,5728],{},"使用",[14,5722,5723],{},"Photoshop","或",[14,5726,5727],{},"Gimp","之类的工具，将漫反射纹理转换为镜面光纹理还是比较容易的，只需要剪切掉一些部分，将图像转换为黑白的，并增加亮度\u002F对比度就好了。",[5730,5731,5732],"h2",{"id":5732},"采样镜面光贴图",[10,5734,5735,5736,5739],{},"镜面光贴图和其它的纹理非常类似，所以代码也和漫反射贴图的代码很类似。记得要保证正确地加载图像并生成一个纹理对象。由于我们正在同一个片段着色器中使用另一个纹理采样器，我们必须要对镜面光贴图使用一个不同的纹理单元（见[纹理](",[41,5737,43],{"href":43,"rel":5738},[45]," Getting started\u002F06 Textures\u002F)），所以我们在渲染之前先把它绑定到合适的纹理单元上：",[122,5741,5743],{"className":327,"code":5742,"language":329,"meta":127,"style":127},"lightingShader.setInt(\"material.specular\", 1);\n...\nglActiveTexture(GL_TEXTURE1);\nglBindTexture(GL_TEXTURE_2D, specularMap);\n",[73,5744,5745,5762,5767,5775],{"__ignoreMap":127},[101,5746,5747,5750,5752,5754,5756,5758,5760],{"class":132,"line":133},[101,5748,5749],{"class":139},"lightingShader.",[101,5751,5023],{"class":163},[101,5753,160],{"class":139},[101,5755,5216],{"class":339},[101,5757,525],{"class":139},[101,5759,522],{"class":521},[101,5761,672],{"class":139},[101,5763,5764],{"class":132,"line":240},[101,5765,5766],{"class":139},"...\n",[101,5768,5769,5772],{"class":132,"line":256},[101,5770,5771],{"class":163},"glActiveTexture",[101,5773,5774],{"class":139},"(GL_TEXTURE1);\n",[101,5776,5777,5780],{"class":132,"line":263},[101,5778,5779],{"class":163},"glBindTexture",[101,5781,5782],{"class":139},"(GL_TEXTURE_2D, specularMap);\n",[10,5784,5785,5786,5788,5789,5791],{},"接下来更新片段着色器的材质属性，让其接受一个",[73,5787,75],{},"而不是",[73,5790,79],{},"作为镜面光分量：",[122,5793,5795],{"className":327,"code":5794,"language":329,"meta":127,"style":127},"struct Material {\n    sampler2D diffuse;\n    sampler2D specular;\n    float     shininess;\n};\n",[73,5796,5797,5807,5815,5822,5829],{"__ignoreMap":127},[101,5798,5799,5802,5805],{"class":132,"line":133},[101,5800,5801],{"class":136},"struct",[101,5803,5804],{"class":163}," Material",[101,5806,2053],{"class":139},[101,5808,5809,5812],{"class":132,"line":240},[101,5810,5811],{"class":163},"    sampler2D",[101,5813,5814],{"class":139}," diffuse;\n",[101,5816,5817,5819],{"class":132,"line":256},[101,5818,5811],{"class":163},[101,5820,5821],{"class":139}," specular;\n",[101,5823,5824,5826],{"class":132,"line":263},[101,5825,2045],{"class":136},[101,5827,5828],{"class":139},"     shininess;\n",[101,5830,5831],{"class":132,"line":269},[101,5832,4115],{"class":139},[10,5834,5835],{},"最后我们希望采样镜面光贴图，来获取片段所对应的镜面光强度：",[122,5837,5839],{"className":327,"code":5838,"language":329,"meta":127,"style":127},"vec3 ambient  = light.ambient  * vec3(texture(material.diffuse, TexCoords));\nvec3 diffuse  = light.diffuse  * diff * vec3(texture(material.diffuse, TexCoords));  \nvec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));\nFragColor = vec4(ambient + diffuse + specular, 1.0);\n",[73,5840,5841,5861,5886,5911],{"__ignoreMap":127},[101,5842,5843,5846,5848,5851,5853,5855,5857,5859],{"class":132,"line":133},[101,5844,5845],{"class":139},"vec3 ambient  ",[101,5847,143],{"class":136},[101,5849,5850],{"class":139}," light.ambient  ",[101,5852,149],{"class":136},[101,5854,157],{"class":163},[101,5856,160],{"class":139},[101,5858,164],{"class":163},[101,5860,167],{"class":139},[101,5862,5863,5866,5868,5871,5873,5875,5877,5879,5881,5883],{"class":132,"line":240},[101,5864,5865],{"class":139},"vec3 diffuse  ",[101,5867,143],{"class":136},[101,5869,5870],{"class":139}," light.diffuse  ",[101,5872,149],{"class":136},[101,5874,152],{"class":139},[101,5876,149],{"class":136},[101,5878,157],{"class":163},[101,5880,160],{"class":139},[101,5882,164],{"class":163},[101,5884,5885],{"class":139},"(material.diffuse, TexCoords));  \n",[101,5887,5888,5891,5893,5895,5897,5900,5902,5904,5906,5908],{"class":132,"line":256},[101,5889,5890],{"class":139},"vec3 specular ",[101,5892,143],{"class":136},[101,5894,311],{"class":139},[101,5896,149],{"class":136},[101,5898,5899],{"class":139}," spec ",[101,5901,149],{"class":136},[101,5903,157],{"class":163},[101,5905,160],{"class":139},[101,5907,164],{"class":163},[101,5909,5910],{"class":139},"(material.specular, TexCoords));\n",[101,5912,5913,5916,5918,5921,5924,5927,5929,5931,5934,5936],{"class":132,"line":263},[101,5914,5915],{"class":139},"FragColor ",[101,5917,143],{"class":136},[101,5919,5920],{"class":163}," vec4",[101,5922,5923],{"class":139},"(ambient ",[101,5925,5926],{"class":136},"+",[101,5928,140],{"class":139},[101,5930,5926],{"class":136},[101,5932,5933],{"class":139}," specular, ",[101,5935,1237],{"class":521},[101,5937,672],{"class":139},[10,5939,5940,5941,5944],{},"通过使用镜面光贴图我们可以可以对物体设置大量的细节，比如物体的哪些部分需要有",[14,5942,5943],{},"闪闪发光","的属性，我们甚至可以设置它们对应的强度。镜面光贴图能够在漫反射贴图之上给予我们更高一层的控制。",[10,5946,5947],{},"如果你想另辟蹊径，你也可以在镜面光贴图中使用真正的颜色，不仅设置每个片段的镜面光强度，还设置了镜面高光的颜色。从现实角度来说，镜面高光的颜色大部分（甚至全部）都是由光源本身所决定的，所以这样并不能生成非常真实的视觉效果（这也是为什么图像通常是黑白的，我们只关心强度）。",[10,5949,5950],{},"如果你现在运行程序的话，你可以清楚地看到箱子的材质现在和真实的钢制边框箱子非常类似了：",[10,5952,5953],{},[63,5954],{"alt":63,"src":5955},".\u002Fassets\u002Fmaterials_specular_map.png",[10,5957,5958,5959,5964],{},"你可以在",[41,5960,5963],{"href":5961,"rel":5962},"https:\u002F\u002Flearnopengl.com\u002Fcode_viewer_gh.php?code=src\u002F2.lighting\u002F4.2.lighting_maps_specular_map\u002Flighting_maps_specular.cpp",[45],"这里","找到程序的全部源码。",[10,5966,5967],{},"通过使用漫反射和镜面光贴图，我们可以给相对简单的物体添加大量的细节。我们甚至可以使用法线\u002F凹凸贴图(Normal\u002FBump Map)或者反射贴图(Reflection Map)给物体添加更多的细节，但这些将会留到之后的教程中。把你的箱子给你的朋友或者家人看看，并且坚信我们的箱子有一天会比现在更加漂亮！",[5969,5970,5971],"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":127,"searchDepth":240,"depth":240,"links":5973},[5974],{"id":5732,"depth":240,"text":5732},"上一节中的那个材质系统是肯定不够的，它只是一个最简单的模型，所以我们需要拓展之前的系统，引入漫反射和镜面光贴图(Map)。这允许我们对物体的漫反射分量（以及间接地对环境光分量，它们几乎总是一样的）和镜面光分量有着更精确的控制。","md",{},"\u002Fgraphy\u002Fopengel\u002F光照贴图",{"description":5975},"graphy\u002Fopengel\u002F光照贴图","hV5ZdbhpV3evEG928vhCdqgmmb1_NRgDHwbk9Om7ewk",1792338203294]