[{"data":1,"prerenderedAt":10951},["ShallowReactive",2],{"page-\u002Fgraphy\u002Fopengel\u002F坐标和变换":3},{"id":4,"title":5,"body":6,"description":12,"extension":10945,"meta":10946,"navigation":360,"path":10947,"seo":10948,"stem":10949,"__hash__":10950},"content\u002Fgraphy\u002Fopengel\u002F坐标和变换.md","坐标和变换",{"type":7,"value":8,"toc":10923},"minimark",[9,13,16,19,23,26,29,35,38,44,60,63,67,78,84,87,107,110,113,117,123,152,163,288,295,309,449,466,477,531,554,557,562,565,3371,3374,3381,3387,3423,3426,3429,3432,3443,3446,3449,3459,3466,3469,3480,3483,3486,3489,3492,3501,3512,3519,3522,3525,3529,3532,3553,3560,3566,3572,3579,3635,3650,3657,3660,3667,3673,3680,3686,3705,3708,3772,3799,3805,3822,3836,3855,3861,3871,3874,3877,3883,3886,3925,3928,3932,3938,3945,4016,4026,4032,4129,4136,4195,4201,4305,4316,4367,4370,4381,4384,4390,4393,6669,6678,6681,6685,6692,6695,6699,6705,6791,6794,6800,6834,6837,6843,6870,6874,6880,6884,6915,6921,6925,6943,6947,6960,6963,7035,7038,7059,7061,10342,10355,10359,10362,10373,10730,10733,10919],[10,11,12],"p",{},"​\t尽管我们现在已经知道了如何创建一个物体、着色、加入纹理，给它们一些细节的表现，但因为它们都还是静态的物体，仍是不够有趣。我们可以尝试着在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动，但这太繁琐了，而且会消耗很多的处理时间。我们现在有一个更好的解决方案，使用（多个）矩阵(Matrix)对象可以更好的变换(Transform)一个物体。当然，这并不是说我们会去讨论武术和数字虚拟世界（译注：Matrix同样也是电影「黑客帝国」的英文名，电影中人类生活在数字虚拟世界，主角会武术）。",[10,14,15],{},"​\t矩阵是一种非常有用的数学工具，尽管听起来可能有些吓人，不过一旦你理解了它们后，它们会变得非常有用。在讨论矩阵的过程中，我们需要使用到一些数学知识。对于一些愿意多了解这些知识的读者，我会附加一些资源给你们阅读。",[10,17,18],{},"​\t为了深入了解变换，我们首先要在讨论矩阵之前进一步了解一下向量。这一节的目标是让你拥有将来需要的最基础的数学背景知识。如果你发现这节十分困难，尽量尝试去理解它们，当你以后需要它们的时候回过头来复习这些概念。",[20,21,22],"h1",{"id":22},"向量",[10,24,25],{},"​\t向量最基本的定义就是一个方向。或者更正式的说，向量有一个方向(Direction)和大小(Magnitude，也叫做强度或长度)。你可以把向量想像成一个藏宝图上的指示：“向左走10步，向北走3步，然后向右走5步”；“左”就是方向，“10步”就是向量的长度。那么这个藏宝图的指示一共有3个向量。向量可以在任意维度(Dimension)上，但是我们通常只使用2至4维。如果一个向量有2个维度，它表示一个平面的方向(想象一下2D的图像)，当它有3个维度的时候它可以表达一个3D世界的方向。",[10,27,28],{},"​\t下面你会看到3个向量，每个向量在2D图像中都用一个箭头(x, y)表示。我们在2D图片中展示这些向量，因为这样子会更直观一点。你可以把这些2D向量当做z坐标为0的3D向量。由于向量表示的是方向，起始于何处并不会改变它的值。下图我们可以看到向量v¯和w¯是相等的，尽管他们的起始点不同：",[10,30,31],{},[32,33],"img",{"alt":32,"src":34},".\u002Fassets\u002Fvectors.png",[10,36,37],{},"数学家喜欢在字母上面加一横表示向量，比如说v¯。当用在公式中时它们通常是这样的：",[10,39,40],{},[32,41],{"alt":42,"src":43},"image-20251010024659401",".\u002Fassets\u002Fimage-20251010024659401.png",[10,45,46,47,51,52,55,56,59],{},"​\t由于向量是一个方向，",[48,49,50],"strong",{},"所以有些时候会很难形象地将它们用位置(Position)表示出来","。为了让其更为直观，我们通常设定这个方向的原点为(0, 0, 0)，然后指向一个方向，对应一个点，使其变为位置向量(Position Vector)（你也可以把起点设置为其他的点，然后说：这个向量从这个点起始指向另一个点）。",[48,53,54],{},"比如说位置向量(3, 5)在图像中的起点会是(0, 0)，并会指向(3, 5)","。我们可以使用向量在2D或3D空间中表示方向",[48,57,58],{},"与","位置.",[10,61,62],{},"​\t和普通数字一样，我们也可以用向量进行多种运算（其中一些你可能已经看到过了）。",[64,65,66],"h2",{"id":66},"向量与标量运算",[10,68,69,70,73,74,77],{},"​\t",[48,71,72],{},"标量(Scalar)只是一个数字（或者说是仅有一个分量的向量）","。当把一个向量加\u002F减\u002F乘\u002F除一个标量，我们可以",[48,75,76],{},"简单的把向量的每个分量分别进行该运算","。对于加法来说会像这样:",[10,79,80],{},[32,81],{"alt":82,"src":83},"image-20251010024733666",".\u002Fassets\u002Fimage-20251010024733666.png",[10,85,86],{},"​\t其中的+可以是+，-，·或÷，其中·是乘号。注意－和÷运算时不能颠倒（标量-\u002F÷向量），因为颠倒的运算是没有定义的。",[88,89,90,96],"blockquote",{},[10,91,92],{},[93,94,95],"span",{},"!NOTE",[10,97,98,99,106],{},"注意，数学上是没有向量与标量相加这个运算的，但是很多线性代数的库都对它有支持（比如说我们用的GLM）。如果你使用过numpy的话，可以把它理解为",[100,101,105],"a",{"href":102,"rel":103},"https:\u002F\u002Fnumpy.org\u002Fdoc\u002F1.18\u002Fuser\u002Fbasics.broadcasting.html",[104],"nofollow","Broadcasting","。",[10,108,109],{},"​\t数学工具就不用提了，详细看线性代数及其应用",[20,111,112],{"id":112},"实践",[64,114,116],{"id":115},"glm","GLM",[10,118,119],{},[32,120],{"alt":121,"src":122},"GLM Logo",".\u002Fassets\u002Fglm.png",[10,124,125,126,129,130,133,134,137,138,141,142,147,148,151],{},"​\tGLM是Open",[48,127,128],{},"GL"," ",[48,131,132],{},"M","athematics的缩写，它是一个",[48,135,136],{},"只有头文件的","库，也就是说我们只需包含对应的头文件就行了，",[48,139,140],{},"不用链接和编译","。GLM可以在它们的",[100,143,146],{"href":144,"rel":145},"https:\u002F\u002Fglm.g-truc.net\u002F0.9.8\u002Findex.html",[104],"网站","上下载。把头文件的根目录复制到你的",[48,149,150],{},"includes","文件夹，然后你就可以使用这个库了。",[10,153,154,155,158,159,162],{},"​\t我们来做些更有意思的事情，",[48,156,157],{},"让我们来旋转和缩放之前教程中的那个箱子","。首先我们把箱子",[48,160,161],{},"逆时针旋转90度。然后缩放0.5倍","，使它变成原来的一半大。我们先来创建变换矩阵：",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-c++ shiki shiki-themes github-light github-dark","glm::mat4 trans;\ntrans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));\ntrans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));\n","c++","",[171,172,173,184,251],"code",{"__ignoreMap":169},[93,174,177,180],{"class":175,"line":176},"line",1,[93,178,115],{"class":179},"sScJk",[93,181,183],{"class":182},"sVt8B","::mat4 trans;\n",[93,185,187,190,194,197,200,203,206,208,210,213,216,220,223,226,228,230,233,235,238,241,243,245,248],{"class":175,"line":186},2,[93,188,189],{"class":182},"trans ",[93,191,193],{"class":192},"szBVR","=",[93,195,196],{"class":179}," glm",[93,198,199],{"class":182},"::",[93,201,202],{"class":179},"rotate",[93,204,205],{"class":182},"(trans, ",[93,207,115],{"class":179},[93,209,199],{"class":182},[93,211,212],{"class":179},"radians",[93,214,215],{"class":182},"(",[93,217,219],{"class":218},"sj4cs","90.0",[93,221,222],{"class":192},"f",[93,224,225],{"class":182},"), ",[93,227,115],{"class":179},[93,229,199],{"class":182},[93,231,232],{"class":179},"vec3",[93,234,215],{"class":182},[93,236,237],{"class":218},"0.0",[93,239,240],{"class":182},", ",[93,242,237],{"class":218},[93,244,240],{"class":182},[93,246,247],{"class":218},"1.0",[93,249,250],{"class":182},"));\n",[93,252,254,256,258,260,262,265,267,269,271,273,275,278,280,282,284,286],{"class":175,"line":253},3,[93,255,189],{"class":182},[93,257,193],{"class":192},[93,259,196],{"class":179},[93,261,199],{"class":182},[93,263,264],{"class":179},"scale",[93,266,205],{"class":182},[93,268,115],{"class":179},[93,270,199],{"class":182},[93,272,232],{"class":179},[93,274,215],{"class":182},[93,276,277],{"class":218},"0.5",[93,279,240],{"class":182},[93,281,277],{"class":218},[93,283,240],{"class":182},[93,285,277],{"class":218},[93,287,250],{"class":182},[10,289,290,291,294],{},"​\t首先，我们把箱子在每个轴都缩放到0.5倍，然后沿z轴旋转90度。GLM希望它的角度是弧度制的(Radian)，所以我们使用",[171,292,293],{},"glm::radians","将角度转化为弧度。注意有纹理的那面矩形是在XY平面上的，所以我们需要把它绕着z轴旋转。因为我们把这个矩阵传递给了GLM的每个函数，GLM会自动将矩阵相乘，返回的结果是一个包括了多个变换的变换矩阵。",[10,296,297,298,301,302,305,306,308],{},"​\t下一个大问题是：如何把矩阵传递给着色器？我们在前面简单提到过GLSL里也有一个",[171,299,300],{},"mat4","类型。所以我们将",[48,303,304],{},"修改顶点着色器","让其接收一个",[171,307,300],{},"的uniform变量，然后再用矩阵uniform乘以位置向量：",[164,310,312],{"className":166,"code":311,"language":168,"meta":169,"style":169},"#version 330 core\nlayout (location = 0) in vec3 aPos;\nlayout (location = 1) in vec2 aTexCoord;\n\nout vec2 TexCoord;\n\nuniform mat4 transform;\n\nvoid main()\n{\n    gl_Position = transform * vec4(aPos, 1.0f);\n    TexCoord = vec2(aTexCoord.x, aTexCoord.y);\n}\n",[171,313,314,325,341,355,362,368,373,379,384,396,402,429,443],{"__ignoreMap":169},[93,315,316,319,322],{"class":175,"line":176},[93,317,318],{"class":182},"#version ",[93,320,321],{"class":218},"330",[93,323,324],{"class":182}," core\n",[93,326,327,330,333,335,338],{"class":175,"line":186},[93,328,329],{"class":179},"layout",[93,331,332],{"class":182}," (location ",[93,334,193],{"class":192},[93,336,337],{"class":218}," 0",[93,339,340],{"class":182},") in vec3 aPos;\n",[93,342,343,345,347,349,352],{"class":175,"line":253},[93,344,329],{"class":179},[93,346,332],{"class":182},[93,348,193],{"class":192},[93,350,351],{"class":218}," 1",[93,353,354],{"class":182},") in vec2 aTexCoord;\n",[93,356,358],{"class":175,"line":357},4,[93,359,361],{"emptyLinePlaceholder":360},true,"\n",[93,363,365],{"class":175,"line":364},5,[93,366,367],{"class":182},"out vec2 TexCoord;\n",[93,369,371],{"class":175,"line":370},6,[93,372,361],{"emptyLinePlaceholder":360},[93,374,376],{"class":175,"line":375},7,[93,377,378],{"class":182},"uniform mat4 transform;\n",[93,380,382],{"class":175,"line":381},8,[93,383,361],{"emptyLinePlaceholder":360},[93,385,387,390,393],{"class":175,"line":386},9,[93,388,389],{"class":192},"void",[93,391,392],{"class":179}," main",[93,394,395],{"class":182},"()\n",[93,397,399],{"class":175,"line":398},10,[93,400,401],{"class":182},"{\n",[93,403,405,408,410,413,416,419,422,424,426],{"class":175,"line":404},11,[93,406,407],{"class":182},"    gl_Position ",[93,409,193],{"class":192},[93,411,412],{"class":182}," transform ",[93,414,415],{"class":192},"*",[93,417,418],{"class":179}," vec4",[93,420,421],{"class":182},"(aPos, ",[93,423,247],{"class":218},[93,425,222],{"class":192},[93,427,428],{"class":182},");\n",[93,430,432,435,437,440],{"class":175,"line":431},12,[93,433,434],{"class":182},"    TexCoord ",[93,436,193],{"class":192},[93,438,439],{"class":179}," vec2",[93,441,442],{"class":182},"(aTexCoord.x, aTexCoord.y);\n",[93,444,446],{"class":175,"line":445},13,[93,447,448],{"class":182},"}\n",[88,450,451,455],{},[10,452,453],{},[93,454,95],{},[10,456,457,458,461,462,465],{},"GLSL也有",[171,459,460],{},"mat2","和",[171,463,464],{},"mat3","类型从而允许了像向量一样的混合运算。前面提到的所有数学运算（像是标量-矩阵相乘，矩阵-向量相乘和矩阵-矩阵相乘）在矩阵类型里都可以使用。当出现特殊的矩阵运算的时候我们会特别说明。",[10,467,468,469,472,473,476],{},"​\t在把",[48,470,471],{},"位置向量传给gl_Position之前","，我们",[48,474,475],{},"先添加一个uniform，并且将其与变换矩阵相乘","。我们的箱子现在应该是原来的二分之一大小并（向左）旋转了90度。当然，我们仍需要把变换矩阵传递给着色器：",[164,478,480],{"className":166,"code":479,"language":168,"meta":169,"style":169},"unsigned int transformLoc = glGetUniformLocation(ourShader.ID, \"transform\");\nglUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));\n",[171,481,482,507],{"__ignoreMap":169},[93,483,484,487,490,493,495,498,501,505],{"class":175,"line":176},[93,485,486],{"class":192},"unsigned",[93,488,489],{"class":192}," int",[93,491,492],{"class":182}," transformLoc ",[93,494,193],{"class":192},[93,496,497],{"class":179}," glGetUniformLocation",[93,499,500],{"class":182},"(ourShader.ID, ",[93,502,504],{"class":503},"sZZnC","\"transform\"",[93,506,428],{"class":182},[93,508,509,512,515,518,521,523,525,528],{"class":175,"line":186},[93,510,511],{"class":179},"glUniformMatrix4fv",[93,513,514],{"class":182},"(transformLoc, ",[93,516,517],{"class":218},"1",[93,519,520],{"class":182},", GL_FALSE, ",[93,522,115],{"class":179},[93,524,199],{"class":182},[93,526,527],{"class":179},"value_ptr",[93,529,530],{"class":182},"(trans));\n",[10,532,533,534,537,538,541,542,545,546,549,550,553],{},"​\t我们首先",[48,535,536],{},"查询uniform变量的地址","，然后用有",[171,539,540],{},"Matrix4fv","后缀的",[48,543,544],{},"glUniform函数把矩阵数据发送给着色器","。第一个参数你现在应该很熟悉了，它是uniform的位置值。第二个参数告诉OpenGL我们将要发送多少个矩阵，这里是1。第三个参数询问我们是否希望对我们的矩阵进行转置(Transpose)，也就是说交换我们矩阵的行和列。OpenGL开发者通常使用一种内部矩阵布局，叫做列主序(Column-major Ordering)布局。",[48,547,548],{},"GLM的默认布局就是列主序，所以并不需要转置矩阵","，我们填",[171,551,552],{},"GL_FALSE","。最后一个参数是真正的矩阵数据，但是GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种，因此我们要先用GLM的自带的函数value_ptr来变换这些数据。",[10,555,556],{},"​\t我们创建了一个变换矩阵，在顶点着色器中声明了一个uniform，并把矩阵发送给了着色器，着色器会变换我们的顶点坐标。最后的结果应该看起来像这样：",[10,558,559],{},[32,560],{"alt":32,"src":561},".\u002Fassets\u002Ftransformations.png",[10,563,564],{},"完整代码：",[164,566,568],{"className":166,"code":567,"language":168,"meta":169,"style":169},"#include \u003Cglad\u002Fglad.h>\n#include \u003CGLFW\u002Fglfw3.h>\n#include \u003Copencv4\u002Fopencv2\u002Fopencv.hpp>\n#include \u003Ciostream>\n#include \u003Ccmath>\n#include \u003Cfilesystem>\n#include \"utils\u002Fshader.h\"\n#include \"utils\u002FglmCompute.h\"\n#include \"utils\u002Flogger.h\"\n\nusing namespace cv;\nusing namespace glm;\n\n\u002F\u002F 窗口大小改变时的回调函数\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height) {\n    glViewport(0, 0, width, height);\n}\n\nstd::string getCurrentWorkingDirectory() {\n    namespace fs = std::filesystem;\n    try {\n        \u002F\u002F current_path() 返回当前工作目录\n        return fs::current_path().string();\n    } catch (const fs::filesystem_error& e) {\n        std::cerr \u003C\u003C \"Filesystem Error: \" \u003C\u003C e.what() \u003C\u003C std::endl;\n        return \"\";\n    }\n}\n\nint main() {\n    mat4 trans = mat4(1.0f);\n    trans = scale(trans, vec3(0.5f, 0.5f, 0.5f)); \u002F\u002F 每个轴都缩放到0.5倍\n    trans = rotate(trans, radians(90.0f), vec3(0.0f, 0.0f, 1.0f)); \u002F\u002F 沿z轴旋转90度\n\n    auto path = getCurrentWorkingDirectory().append(\"\u002FAssets\u002Fimage.png\");\n    auto path2 = getCurrentWorkingDirectory().append(\"\u002FAssets\u002Fimage2.png\");\n    cv::Mat image = cv::imread(path);\n    cv::Mat image2 = cv::imread(path2);\n    cv::flip(image2, image2, 0);\n    cv::cvtColor(image, image, cv::COLOR_BGR2RGB);\n    cv::cvtColor(image2, image2, cv::COLOR_BGR2RGB);\n\n    \u002F\u002F 转换为字节数组\n    std::vector\u003Cuchar> imageData;\n    std::vector\u003Cuchar> imageData2;\n    if (image.empty()) {\n        std::cerr \u003C\u003C \"Could not read the image: \" \u003C\u003C path \u003C\u003C std::endl;\n        return 1;\n    }\n    if (image2.empty()) {\n        std::cerr \u003C\u003C \"Could not read the image2: \" \u003C\u003C path2 \u003C\u003C std::endl;\n        return 1;\n    }\n    \n    std::cout \u003C\u003C \"Image 1 loaded: \" \u003C\u003C image.cols \u003C\u003C \"x\" \u003C\u003C image.rows \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"Image 2 loaded: \" \u003C\u003C image2.cols \u003C\u003C \"x\" \u003C\u003C image2.rows \u003C\u003C std::endl;\n\n    cv::imencode(\".png\", image, imageData);\n    cv::imencode(\".png\", image2, imageData2);\n\n\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 创建窗口\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 初始化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    float vertices[] = {\n    \u002F\u002F     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -\n        0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   \u002F\u002F 右上\n        0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   \u002F\u002F 右下\n        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   \u002F\u002F 左下\n        -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f    \u002F\u002F 左上\n    };\n    \n    unsigned int indices[] = {\n        0, 1, 3, \u002F\u002F 第一个三角形\n        1, 2, 3  \u002F\u002F 第二个三角形\n    };\n\n    \u002F\u002F 纹理\n    unsigned int texture;\n    unsigned int texture2;\n    glGenTextures(1, &texture); \u002F\u002F 生成纹理\n    glGenTextures(1, &texture2); \u002F\u002F 生成纹理\n    \n    \u002F\u002F 配置第一个纹理\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, texture); \u002F\u002F 绑定纹理\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.cols, image.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image.data); \u002F\u002F 设置纹理数据\n    glGenerateMipmap(GL_TEXTURE_2D); \u002F\u002F 生成mipmap\n\n    \u002F\u002F 配置第二个纹理\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, texture2); \u002F\u002F 绑定纹理\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); \u002F\u002F 设置纹理环绕方式   \n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image2.cols, image2.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image2.data); \u002F\u002F 设置纹理数据\n    glGenerateMipmap(GL_TEXTURE_2D); \u002F\u002F 生成mipmap\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    \u002F\u002F 创建EBO\n    unsigned int EBO;\n    glGenBuffers(1, &EBO);\n    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); \u002F\u002F 绑定EBO\n    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, 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);\n    \n    \u002F\u002F 纹理属性\n    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));\n    glEnableVertexAttribArray(2);\n\n    \u002F\u002F 构建并编译着色器程序\n    Shader ourShader(\"shader\u002Fcustom.vert\", \"shader\u002Ffragment.vert\");\n\n    \u002F\u002F 渲染循环\n    while (!glfwWindowShouldClose(window)) {\n        \u002F\u002F 处理输入\n        glfwPollEvents();\n        \n        \u002F\u002F 渲染指令\n        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);\n        glClear(GL_COLOR_BUFFER_BIT);\n        \n        \u002F\u002F 使用着色器程序\n        ourShader.use();\n        \n        \u002F\u002F 设置变换矩阵\n        unsigned int transformLoc = glGetUniformLocation(ourShader.ID, \"transform\");\n        glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));\n\n        ourShader.setInt(\"ourTexture\", 0);\n        ourShader.setInt(\"ourTexture2\", 1);\n        \n        glBindVertexArray(VAO);\n        \n        \u002F\u002F 绘制矩形（使用EBO）\n        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);\n        \n        \u002F\u002F 交换缓冲区和检查IO事件\n        glfwSwapBuffers(window);\n    }\n\n    \u002F\u002F 清理资源\n    glDeleteVertexArrays(1, &VAO);\n    glDeleteBuffers(1, &VBO);\n    glDeleteBuffers(1, &EBO);\n    glDeleteTextures(1, &texture);\n    glDeleteTextures(1, &texture2);\n    glfwTerminate();\n    return 0;\n}\n\n#version 330 core\nout vec4 FragColor;\nin vec3 ourColor;\nin vec2 TexCoord;\nuniform sampler2D ourTexture;\nuniform sampler2D ourTexture2;\nvoid main()\n{\n    FragColor = mix(texture(ourTexture, TexCoord), texture(ourTexture2, TexCoord), 0.5) * vec4(ourColor, 1.0);\n}\n\n#version 330 core\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aColor;\nlayout(location = 2) in vec2 aTexCoord;\nout vec3 ourColor; \nout vec2 TexCoord;\nuniform mat4 transform;\nvoid main()\n{\n    gl_Position = transform * vec4(aPos, 1.0);\n    ourColor = aColor;\n    TexCoord = aTexCoord;\n}\n\n",[171,569,570,578,585,592,599,606,613,620,627,634,638,652,662,666,673,710,728,733,738,755,777,786,792,813,839,873,883,889,894,899,908,930,969,1016,1021,1046,1069,1095,1118,1135,1154,1169,1174,1180,1200,1216,1231,1253,1262,1267,1279,1301,1310,1315,1321,1355,1387,1392,1410,1426,1431,1436,1441,1447,1455,1469,1481,1489,1494,1500,1542,1558,1576,1584,1596,1601,1606,1615,1624,1629,1635,1651,1669,1680,1685,1690,1703,1709,1767,1824,1883,1937,1943,1948,1963,1982,2000,2005,2010,2016,2026,2036,2056,2074,2079,2085,2094,2106,2118,2128,2139,2149,2171,2183,2188,2194,2202,2212,2221,2231,2240,2249,2268,2277,2282,2287,2293,2303,2320,2332,2337,2343,2353,2370,2382,2397,2402,2408,2418,2434,2445,2458,2463,2472,2486,2509,2514,2520,2564,2580,2585,2591,2636,2647,2652,2658,2702,2713,2718,2724,2745,2750,2756,2772,2778,2786,2792,2798,2832,2841,2846,2852,2863,2868,2874,2894,2914,2919,2938,2956,2961,2970,2975,2981,2999,3004,3010,3018,3023,3028,3034,3050,3066,3081,3098,3114,3122,3132,3137,3142,3151,3157,3163,3169,3175,3181,3190,3195,3235,3240,3245,3254,3268,3282,3296,3302,3307,3312,3321,3326,3345,3356,3366],{"__ignoreMap":169},[93,571,572,575],{"class":175,"line":176},[93,573,574],{"class":192},"#include",[93,576,577],{"class":503}," \u003Cglad\u002Fglad.h>\n",[93,579,580,582],{"class":175,"line":186},[93,581,574],{"class":192},[93,583,584],{"class":503}," \u003CGLFW\u002Fglfw3.h>\n",[93,586,587,589],{"class":175,"line":253},[93,588,574],{"class":192},[93,590,591],{"class":503}," \u003Copencv4\u002Fopencv2\u002Fopencv.hpp>\n",[93,593,594,596],{"class":175,"line":357},[93,595,574],{"class":192},[93,597,598],{"class":503}," \u003Ciostream>\n",[93,600,601,603],{"class":175,"line":364},[93,602,574],{"class":192},[93,604,605],{"class":503}," \u003Ccmath>\n",[93,607,608,610],{"class":175,"line":370},[93,609,574],{"class":192},[93,611,612],{"class":503}," \u003Cfilesystem>\n",[93,614,615,617],{"class":175,"line":375},[93,616,574],{"class":192},[93,618,619],{"class":503}," \"utils\u002Fshader.h\"\n",[93,621,622,624],{"class":175,"line":381},[93,623,574],{"class":192},[93,625,626],{"class":503}," \"utils\u002FglmCompute.h\"\n",[93,628,629,631],{"class":175,"line":386},[93,630,574],{"class":192},[93,632,633],{"class":503}," \"utils\u002Flogger.h\"\n",[93,635,636],{"class":175,"line":398},[93,637,361],{"emptyLinePlaceholder":360},[93,639,640,643,646,649],{"class":175,"line":404},[93,641,642],{"class":192},"using",[93,644,645],{"class":192}," namespace",[93,647,648],{"class":179}," cv",[93,650,651],{"class":182},";\n",[93,653,654,656,658,660],{"class":175,"line":431},[93,655,642],{"class":192},[93,657,645],{"class":192},[93,659,196],{"class":179},[93,661,651],{"class":182},[93,663,664],{"class":175,"line":445},[93,665,361],{"emptyLinePlaceholder":360},[93,667,669],{"class":175,"line":668},14,[93,670,672],{"class":671},"sJ8bj","\u002F\u002F 窗口大小改变时的回调函数\n",[93,674,676,678,681,683,686,688,692,694,697,700,702,704,707],{"class":175,"line":675},15,[93,677,389],{"class":192},[93,679,680],{"class":179}," framebuffer_size_callback",[93,682,215],{"class":182},[93,684,685],{"class":179},"GLFWwindow",[93,687,415],{"class":192},[93,689,691],{"class":690},"s4XuR"," window",[93,693,240],{"class":182},[93,695,696],{"class":192},"int",[93,698,699],{"class":690}," width",[93,701,240],{"class":182},[93,703,696],{"class":192},[93,705,706],{"class":690}," height",[93,708,709],{"class":182},") {\n",[93,711,713,716,718,721,723,725],{"class":175,"line":712},16,[93,714,715],{"class":179},"    glViewport",[93,717,215],{"class":182},[93,719,720],{"class":218},"0",[93,722,240],{"class":182},[93,724,720],{"class":218},[93,726,727],{"class":182},", width, height);\n",[93,729,731],{"class":175,"line":730},17,[93,732,448],{"class":182},[93,734,736],{"class":175,"line":735},18,[93,737,361],{"emptyLinePlaceholder":360},[93,739,741,744,746,749,752],{"class":175,"line":740},19,[93,742,743],{"class":179},"std",[93,745,199],{"class":182},[93,747,748],{"class":179},"string",[93,750,751],{"class":179}," getCurrentWorkingDirectory",[93,753,754],{"class":182},"() {\n",[93,756,758,761,764,767,770,772,775],{"class":175,"line":757},20,[93,759,760],{"class":192},"    namespace",[93,762,763],{"class":179}," fs",[93,765,766],{"class":192}," =",[93,768,769],{"class":179}," std",[93,771,199],{"class":182},[93,773,774],{"class":179},"filesystem",[93,776,651],{"class":182},[93,778,780,783],{"class":175,"line":779},21,[93,781,782],{"class":192},"    try",[93,784,785],{"class":182}," {\n",[93,787,789],{"class":175,"line":788},22,[93,790,791],{"class":671},"        \u002F\u002F current_path() 返回当前工作目录\n",[93,793,795,798,800,802,805,808,810],{"class":175,"line":794},23,[93,796,797],{"class":192},"        return",[93,799,763],{"class":179},[93,801,199],{"class":182},[93,803,804],{"class":179},"current_path",[93,806,807],{"class":182},"().",[93,809,748],{"class":179},[93,811,812],{"class":182},"();\n",[93,814,816,819,822,825,828,830,833,836],{"class":175,"line":815},24,[93,817,818],{"class":182},"    } ",[93,820,821],{"class":192},"catch",[93,823,824],{"class":182}," (",[93,826,827],{"class":192},"const",[93,829,763],{"class":179},[93,831,832],{"class":182},"::filesystem_error",[93,834,835],{"class":192},"&",[93,837,838],{"class":182}," e) {\n",[93,840,842,845,848,851,854,857,860,863,866,868,870],{"class":175,"line":841},25,[93,843,844],{"class":179},"        std",[93,846,847],{"class":182},"::cerr ",[93,849,850],{"class":192},"\u003C\u003C",[93,852,853],{"class":503}," \"Filesystem Error: \"",[93,855,856],{"class":192}," \u003C\u003C",[93,858,859],{"class":182}," e.",[93,861,862],{"class":179},"what",[93,864,865],{"class":182},"() ",[93,867,850],{"class":192},[93,869,769],{"class":179},[93,871,872],{"class":182},"::endl;\n",[93,874,876,878,881],{"class":175,"line":875},26,[93,877,797],{"class":192},[93,879,880],{"class":503}," \"\"",[93,882,651],{"class":182},[93,884,886],{"class":175,"line":885},27,[93,887,888],{"class":182},"    }\n",[93,890,892],{"class":175,"line":891},28,[93,893,448],{"class":182},[93,895,897],{"class":175,"line":896},29,[93,898,361],{"emptyLinePlaceholder":360},[93,900,902,904,906],{"class":175,"line":901},30,[93,903,696],{"class":192},[93,905,392],{"class":179},[93,907,754],{"class":182},[93,909,911,914,917,919,922,924,926,928],{"class":175,"line":910},31,[93,912,913],{"class":179},"    mat4",[93,915,916],{"class":182}," trans ",[93,918,193],{"class":192},[93,920,921],{"class":179}," mat4",[93,923,215],{"class":182},[93,925,247],{"class":218},[93,927,222],{"class":192},[93,929,428],{"class":182},[93,931,933,936,938,941,943,945,947,949,951,953,955,957,959,961,963,966],{"class":175,"line":932},32,[93,934,935],{"class":182},"    trans ",[93,937,193],{"class":192},[93,939,940],{"class":179}," scale",[93,942,205],{"class":182},[93,944,232],{"class":179},[93,946,215],{"class":182},[93,948,277],{"class":218},[93,950,222],{"class":192},[93,952,240],{"class":182},[93,954,277],{"class":218},[93,956,222],{"class":192},[93,958,240],{"class":182},[93,960,277],{"class":218},[93,962,222],{"class":192},[93,964,965],{"class":182},"));",[93,967,968],{"class":671}," \u002F\u002F 每个轴都缩放到0.5倍\n",[93,970,972,974,976,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1009,1011,1013],{"class":175,"line":971},33,[93,973,935],{"class":182},[93,975,193],{"class":192},[93,977,978],{"class":179}," rotate",[93,980,205],{"class":182},[93,982,212],{"class":179},[93,984,215],{"class":182},[93,986,219],{"class":218},[93,988,222],{"class":192},[93,990,225],{"class":182},[93,992,232],{"class":179},[93,994,215],{"class":182},[93,996,237],{"class":218},[93,998,222],{"class":192},[93,1000,240],{"class":182},[93,1002,237],{"class":218},[93,1004,222],{"class":192},[93,1006,240],{"class":182},[93,1008,247],{"class":218},[93,1010,222],{"class":192},[93,1012,965],{"class":182},[93,1014,1015],{"class":671}," \u002F\u002F 沿z轴旋转90度\n",[93,1017,1019],{"class":175,"line":1018},34,[93,1020,361],{"emptyLinePlaceholder":360},[93,1022,1024,1027,1030,1032,1034,1036,1039,1041,1044],{"class":175,"line":1023},35,[93,1025,1026],{"class":192},"    auto",[93,1028,1029],{"class":182}," path ",[93,1031,193],{"class":192},[93,1033,751],{"class":179},[93,1035,807],{"class":182},[93,1037,1038],{"class":179},"append",[93,1040,215],{"class":182},[93,1042,1043],{"class":503},"\"\u002FAssets\u002Fimage.png\"",[93,1045,428],{"class":182},[93,1047,1049,1051,1054,1056,1058,1060,1062,1064,1067],{"class":175,"line":1048},36,[93,1050,1026],{"class":192},[93,1052,1053],{"class":182}," path2 ",[93,1055,193],{"class":192},[93,1057,751],{"class":179},[93,1059,807],{"class":182},[93,1061,1038],{"class":179},[93,1063,215],{"class":182},[93,1065,1066],{"class":503},"\"\u002FAssets\u002Fimage2.png\"",[93,1068,428],{"class":182},[93,1070,1072,1075,1077,1080,1083,1085,1087,1089,1092],{"class":175,"line":1071},37,[93,1073,1074],{"class":179},"    cv",[93,1076,199],{"class":182},[93,1078,1079],{"class":179},"Mat",[93,1081,1082],{"class":182}," image ",[93,1084,193],{"class":192},[93,1086,648],{"class":179},[93,1088,199],{"class":182},[93,1090,1091],{"class":179},"imread",[93,1093,1094],{"class":182},"(path);\n",[93,1096,1098,1100,1102,1104,1107,1109,1111,1113,1115],{"class":175,"line":1097},38,[93,1099,1074],{"class":179},[93,1101,199],{"class":182},[93,1103,1079],{"class":179},[93,1105,1106],{"class":182}," image2 ",[93,1108,193],{"class":192},[93,1110,648],{"class":179},[93,1112,199],{"class":182},[93,1114,1091],{"class":179},[93,1116,1117],{"class":182},"(path2);\n",[93,1119,1121,1123,1125,1128,1131,1133],{"class":175,"line":1120},39,[93,1122,1074],{"class":179},[93,1124,199],{"class":182},[93,1126,1127],{"class":179},"flip",[93,1129,1130],{"class":182},"(image2, image2, ",[93,1132,720],{"class":218},[93,1134,428],{"class":182},[93,1136,1138,1140,1142,1145,1148,1151],{"class":175,"line":1137},40,[93,1139,1074],{"class":179},[93,1141,199],{"class":182},[93,1143,1144],{"class":179},"cvtColor",[93,1146,1147],{"class":182},"(image, image, ",[93,1149,1150],{"class":179},"cv",[93,1152,1153],{"class":182},"::COLOR_BGR2RGB);\n",[93,1155,1157,1159,1161,1163,1165,1167],{"class":175,"line":1156},41,[93,1158,1074],{"class":179},[93,1160,199],{"class":182},[93,1162,1144],{"class":179},[93,1164,1130],{"class":182},[93,1166,1150],{"class":179},[93,1168,1153],{"class":182},[93,1170,1172],{"class":175,"line":1171},42,[93,1173,361],{"emptyLinePlaceholder":360},[93,1175,1177],{"class":175,"line":1176},43,[93,1178,1179],{"class":671},"    \u002F\u002F 转换为字节数组\n",[93,1181,1183,1186,1188,1191,1194,1197],{"class":175,"line":1182},44,[93,1184,1185],{"class":179},"    std",[93,1187,199],{"class":182},[93,1189,1190],{"class":179},"vector",[93,1192,1193],{"class":182},"\u003C",[93,1195,1196],{"class":179},"uchar",[93,1198,1199],{"class":182},"> imageData;\n",[93,1201,1203,1205,1207,1209,1211,1213],{"class":175,"line":1202},45,[93,1204,1185],{"class":179},[93,1206,199],{"class":182},[93,1208,1190],{"class":179},[93,1210,1193],{"class":182},[93,1212,1196],{"class":179},[93,1214,1215],{"class":182},"> imageData2;\n",[93,1217,1219,1222,1225,1228],{"class":175,"line":1218},46,[93,1220,1221],{"class":192},"    if",[93,1223,1224],{"class":182}," (image.",[93,1226,1227],{"class":179},"empty",[93,1229,1230],{"class":182},"()) {\n",[93,1232,1234,1236,1238,1240,1243,1245,1247,1249,1251],{"class":175,"line":1233},47,[93,1235,844],{"class":179},[93,1237,847],{"class":182},[93,1239,850],{"class":192},[93,1241,1242],{"class":503}," \"Could not read the image: \"",[93,1244,856],{"class":192},[93,1246,1029],{"class":182},[93,1248,850],{"class":192},[93,1250,769],{"class":179},[93,1252,872],{"class":182},[93,1254,1256,1258,1260],{"class":175,"line":1255},48,[93,1257,797],{"class":192},[93,1259,351],{"class":218},[93,1261,651],{"class":182},[93,1263,1265],{"class":175,"line":1264},49,[93,1266,888],{"class":182},[93,1268,1270,1272,1275,1277],{"class":175,"line":1269},50,[93,1271,1221],{"class":192},[93,1273,1274],{"class":182}," (image2.",[93,1276,1227],{"class":179},[93,1278,1230],{"class":182},[93,1280,1282,1284,1286,1288,1291,1293,1295,1297,1299],{"class":175,"line":1281},51,[93,1283,844],{"class":179},[93,1285,847],{"class":182},[93,1287,850],{"class":192},[93,1289,1290],{"class":503}," \"Could not read the image2: \"",[93,1292,856],{"class":192},[93,1294,1053],{"class":182},[93,1296,850],{"class":192},[93,1298,769],{"class":179},[93,1300,872],{"class":182},[93,1302,1304,1306,1308],{"class":175,"line":1303},52,[93,1305,797],{"class":192},[93,1307,351],{"class":218},[93,1309,651],{"class":182},[93,1311,1313],{"class":175,"line":1312},53,[93,1314,888],{"class":182},[93,1316,1318],{"class":175,"line":1317},54,[93,1319,1320],{"class":182},"    \n",[93,1322,1324,1326,1329,1331,1334,1336,1339,1341,1344,1346,1349,1351,1353],{"class":175,"line":1323},55,[93,1325,1185],{"class":179},[93,1327,1328],{"class":182},"::cout ",[93,1330,850],{"class":192},[93,1332,1333],{"class":503}," \"Image 1 loaded: \"",[93,1335,856],{"class":192},[93,1337,1338],{"class":182}," image.cols ",[93,1340,850],{"class":192},[93,1342,1343],{"class":503}," \"x\"",[93,1345,856],{"class":192},[93,1347,1348],{"class":182}," image.rows ",[93,1350,850],{"class":192},[93,1352,769],{"class":179},[93,1354,872],{"class":182},[93,1356,1358,1360,1362,1364,1367,1369,1372,1374,1376,1378,1381,1383,1385],{"class":175,"line":1357},56,[93,1359,1185],{"class":179},[93,1361,1328],{"class":182},[93,1363,850],{"class":192},[93,1365,1366],{"class":503}," \"Image 2 loaded: \"",[93,1368,856],{"class":192},[93,1370,1371],{"class":182}," image2.cols ",[93,1373,850],{"class":192},[93,1375,1343],{"class":503},[93,1377,856],{"class":192},[93,1379,1380],{"class":182}," image2.rows ",[93,1382,850],{"class":192},[93,1384,769],{"class":179},[93,1386,872],{"class":182},[93,1388,1390],{"class":175,"line":1389},57,[93,1391,361],{"emptyLinePlaceholder":360},[93,1393,1395,1397,1399,1402,1404,1407],{"class":175,"line":1394},58,[93,1396,1074],{"class":179},[93,1398,199],{"class":182},[93,1400,1401],{"class":179},"imencode",[93,1403,215],{"class":182},[93,1405,1406],{"class":503},"\".png\"",[93,1408,1409],{"class":182},", image, imageData);\n",[93,1411,1413,1415,1417,1419,1421,1423],{"class":175,"line":1412},59,[93,1414,1074],{"class":179},[93,1416,199],{"class":182},[93,1418,1401],{"class":179},[93,1420,215],{"class":182},[93,1422,1406],{"class":503},[93,1424,1425],{"class":182},", image2, imageData2);\n",[93,1427,1429],{"class":175,"line":1428},60,[93,1430,361],{"emptyLinePlaceholder":360},[93,1432,1434],{"class":175,"line":1433},61,[93,1435,361],{"emptyLinePlaceholder":360},[93,1437,1439],{"class":175,"line":1438},62,[93,1440,1320],{"class":182},[93,1442,1444],{"class":175,"line":1443},63,[93,1445,1446],{"class":671},"    \u002F\u002F 初始化GLFW\n",[93,1448,1450,1453],{"class":175,"line":1449},64,[93,1451,1452],{"class":179},"    glfwInit",[93,1454,812],{"class":182},[93,1456,1458,1461,1464,1467],{"class":175,"line":1457},65,[93,1459,1460],{"class":179},"    glfwWindowHint",[93,1462,1463],{"class":182},"(GLFW_CONTEXT_VERSION_MAJOR, ",[93,1465,1466],{"class":218},"3",[93,1468,428],{"class":182},[93,1470,1472,1474,1477,1479],{"class":175,"line":1471},66,[93,1473,1460],{"class":179},[93,1475,1476],{"class":182},"(GLFW_CONTEXT_VERSION_MINOR, ",[93,1478,1466],{"class":218},[93,1480,428],{"class":182},[93,1482,1484,1486],{"class":175,"line":1483},67,[93,1485,1460],{"class":179},[93,1487,1488],{"class":182},"(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n",[93,1490,1492],{"class":175,"line":1491},68,[93,1493,361],{"emptyLinePlaceholder":360},[93,1495,1497],{"class":175,"line":1496},69,[93,1498,1499],{"class":671},"    \u002F\u002F 创建窗口\n",[93,1501,1503,1506,1508,1511,1513,1516,1518,1521,1523,1526,1528,1531,1533,1536,1538,1540],{"class":175,"line":1502},70,[93,1504,1505],{"class":179},"    GLFWwindow",[93,1507,415],{"class":192},[93,1509,1510],{"class":182}," window ",[93,1512,193],{"class":192},[93,1514,1515],{"class":179}," glfwCreateWindow",[93,1517,215],{"class":182},[93,1519,1520],{"class":218},"800",[93,1522,240],{"class":182},[93,1524,1525],{"class":218},"600",[93,1527,240],{"class":182},[93,1529,1530],{"class":503},"\"OpenGL Window\"",[93,1532,240],{"class":182},[93,1534,1535],{"class":218},"NULL",[93,1537,240],{"class":182},[93,1539,1535],{"class":218},[93,1541,428],{"class":182},[93,1543,1545,1547,1550,1553,1556],{"class":175,"line":1544},71,[93,1546,1221],{"class":192},[93,1548,1549],{"class":182}," (window ",[93,1551,1552],{"class":192},"==",[93,1554,1555],{"class":218}," NULL",[93,1557,709],{"class":182},[93,1559,1561,1563,1565,1567,1570,1572,1574],{"class":175,"line":1560},72,[93,1562,844],{"class":179},[93,1564,1328],{"class":182},[93,1566,850],{"class":192},[93,1568,1569],{"class":503}," \"Failed to create GLFW window\"",[93,1571,856],{"class":192},[93,1573,769],{"class":179},[93,1575,872],{"class":182},[93,1577,1579,1582],{"class":175,"line":1578},73,[93,1580,1581],{"class":179},"        glfwTerminate",[93,1583,812],{"class":182},[93,1585,1587,1589,1592,1594],{"class":175,"line":1586},74,[93,1588,797],{"class":192},[93,1590,1591],{"class":192}," -",[93,1593,517],{"class":218},[93,1595,651],{"class":182},[93,1597,1599],{"class":175,"line":1598},75,[93,1600,888],{"class":182},[93,1602,1604],{"class":175,"line":1603},76,[93,1605,1320],{"class":182},[93,1607,1609,1612],{"class":175,"line":1608},77,[93,1610,1611],{"class":179},"    glfwMakeContextCurrent",[93,1613,1614],{"class":182},"(window);\n",[93,1616,1618,1621],{"class":175,"line":1617},78,[93,1619,1620],{"class":179},"    glfwSetFramebufferSizeCallback",[93,1622,1623],{"class":182},"(window, framebuffer_size_callback);\n",[93,1625,1627],{"class":175,"line":1626},79,[93,1628,361],{"emptyLinePlaceholder":360},[93,1630,1632],{"class":175,"line":1631},80,[93,1633,1634],{"class":671},"    \u002F\u002F 初始化GLAD\n",[93,1636,1638,1640,1642,1645,1648],{"class":175,"line":1637},81,[93,1639,1221],{"class":192},[93,1641,824],{"class":182},[93,1643,1644],{"class":192},"!",[93,1646,1647],{"class":179},"gladLoadGLLoader",[93,1649,1650],{"class":182},"((GLADloadproc)glfwGetProcAddress)) {\n",[93,1652,1654,1656,1658,1660,1663,1665,1667],{"class":175,"line":1653},82,[93,1655,844],{"class":179},[93,1657,1328],{"class":182},[93,1659,850],{"class":192},[93,1661,1662],{"class":503}," \"Failed to initialize GLAD\"",[93,1664,856],{"class":192},[93,1666,769],{"class":179},[93,1668,872],{"class":182},[93,1670,1672,1674,1676,1678],{"class":175,"line":1671},83,[93,1673,797],{"class":192},[93,1675,1591],{"class":192},[93,1677,517],{"class":218},[93,1679,651],{"class":182},[93,1681,1683],{"class":175,"line":1682},84,[93,1684,888],{"class":182},[93,1686,1688],{"class":175,"line":1687},85,[93,1689,361],{"emptyLinePlaceholder":360},[93,1691,1693,1696,1699,1701],{"class":175,"line":1692},86,[93,1694,1695],{"class":192},"    float",[93,1697,1698],{"class":182}," vertices[] ",[93,1700,193],{"class":192},[93,1702,785],{"class":182},[93,1704,1706],{"class":175,"line":1705},87,[93,1707,1708],{"class":671},"    \u002F\u002F     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -\n",[93,1710,1712,1715,1717,1720,1722,1724,1726,1728,1730,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1764],{"class":175,"line":1711},88,[93,1713,1714],{"class":218},"        0.5",[93,1716,222],{"class":192},[93,1718,1719],{"class":182},",  ",[93,1721,277],{"class":218},[93,1723,222],{"class":192},[93,1725,240],{"class":182},[93,1727,237],{"class":218},[93,1729,222],{"class":192},[93,1731,1732],{"class":182},",   ",[93,1734,247],{"class":218},[93,1736,222],{"class":192},[93,1738,240],{"class":182},[93,1740,237],{"class":218},[93,1742,222],{"class":192},[93,1744,240],{"class":182},[93,1746,237],{"class":218},[93,1748,222],{"class":192},[93,1750,1732],{"class":182},[93,1752,247],{"class":218},[93,1754,222],{"class":192},[93,1756,240],{"class":182},[93,1758,247],{"class":218},[93,1760,222],{"class":192},[93,1762,1763],{"class":182},",",[93,1765,1766],{"class":671},"   \u002F\u002F 右上\n",[93,1768,1770,1772,1774,1776,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821],{"class":175,"line":1769},89,[93,1771,1714],{"class":218},[93,1773,222],{"class":192},[93,1775,240],{"class":182},[93,1777,1778],{"class":192},"-",[93,1780,277],{"class":218},[93,1782,222],{"class":192},[93,1784,240],{"class":182},[93,1786,237],{"class":218},[93,1788,222],{"class":192},[93,1790,1732],{"class":182},[93,1792,237],{"class":218},[93,1794,222],{"class":192},[93,1796,240],{"class":182},[93,1798,247],{"class":218},[93,1800,222],{"class":192},[93,1802,240],{"class":182},[93,1804,237],{"class":218},[93,1806,222],{"class":192},[93,1808,1732],{"class":182},[93,1810,247],{"class":218},[93,1812,222],{"class":192},[93,1814,240],{"class":182},[93,1816,237],{"class":218},[93,1818,222],{"class":192},[93,1820,1763],{"class":182},[93,1822,1823],{"class":671},"   \u002F\u002F 右下\n",[93,1825,1827,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880],{"class":175,"line":1826},90,[93,1828,1829],{"class":192},"        -",[93,1831,277],{"class":218},[93,1833,222],{"class":192},[93,1835,240],{"class":182},[93,1837,1778],{"class":192},[93,1839,277],{"class":218},[93,1841,222],{"class":192},[93,1843,240],{"class":182},[93,1845,237],{"class":218},[93,1847,222],{"class":192},[93,1849,1732],{"class":182},[93,1851,237],{"class":218},[93,1853,222],{"class":192},[93,1855,240],{"class":182},[93,1857,237],{"class":218},[93,1859,222],{"class":192},[93,1861,240],{"class":182},[93,1863,247],{"class":218},[93,1865,222],{"class":192},[93,1867,1732],{"class":182},[93,1869,237],{"class":218},[93,1871,222],{"class":192},[93,1873,240],{"class":182},[93,1875,237],{"class":218},[93,1877,222],{"class":192},[93,1879,1763],{"class":182},[93,1881,1882],{"class":671},"   \u002F\u002F 左下\n",[93,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934],{"class":175,"line":1885},91,[93,1887,1829],{"class":192},[93,1889,277],{"class":218},[93,1891,222],{"class":192},[93,1893,1719],{"class":182},[93,1895,277],{"class":218},[93,1897,222],{"class":192},[93,1899,240],{"class":182},[93,1901,237],{"class":218},[93,1903,222],{"class":192},[93,1905,1732],{"class":182},[93,1907,247],{"class":218},[93,1909,222],{"class":192},[93,1911,240],{"class":182},[93,1913,247],{"class":218},[93,1915,222],{"class":192},[93,1917,240],{"class":182},[93,1919,237],{"class":218},[93,1921,222],{"class":192},[93,1923,1732],{"class":182},[93,1925,237],{"class":218},[93,1927,222],{"class":192},[93,1929,240],{"class":182},[93,1931,247],{"class":218},[93,1933,222],{"class":192},[93,1935,1936],{"class":671},"    \u002F\u002F 左上\n",[93,1938,1940],{"class":175,"line":1939},92,[93,1941,1942],{"class":182},"    };\n",[93,1944,1946],{"class":175,"line":1945},93,[93,1947,1320],{"class":182},[93,1949,1951,1954,1956,1959,1961],{"class":175,"line":1950},94,[93,1952,1953],{"class":192},"    unsigned",[93,1955,489],{"class":192},[93,1957,1958],{"class":182}," indices[] ",[93,1960,193],{"class":192},[93,1962,785],{"class":182},[93,1964,1966,1969,1971,1973,1975,1977,1979],{"class":175,"line":1965},95,[93,1967,1968],{"class":218},"        0",[93,1970,240],{"class":182},[93,1972,517],{"class":218},[93,1974,240],{"class":182},[93,1976,1466],{"class":218},[93,1978,1763],{"class":182},[93,1980,1981],{"class":671}," \u002F\u002F 第一个三角形\n",[93,1983,1985,1988,1990,1993,1995,1997],{"class":175,"line":1984},96,[93,1986,1987],{"class":218},"        1",[93,1989,240],{"class":182},[93,1991,1992],{"class":218},"2",[93,1994,240],{"class":182},[93,1996,1466],{"class":218},[93,1998,1999],{"class":671},"  \u002F\u002F 第二个三角形\n",[93,2001,2003],{"class":175,"line":2002},97,[93,2004,1942],{"class":182},[93,2006,2008],{"class":175,"line":2007},98,[93,2009,361],{"emptyLinePlaceholder":360},[93,2011,2013],{"class":175,"line":2012},99,[93,2014,2015],{"class":671},"    \u002F\u002F 纹理\n",[93,2017,2019,2021,2023],{"class":175,"line":2018},100,[93,2020,1953],{"class":192},[93,2022,489],{"class":192},[93,2024,2025],{"class":182}," texture;\n",[93,2027,2029,2031,2033],{"class":175,"line":2028},101,[93,2030,1953],{"class":192},[93,2032,489],{"class":192},[93,2034,2035],{"class":182}," texture2;\n",[93,2037,2039,2042,2044,2046,2048,2050,2053],{"class":175,"line":2038},102,[93,2040,2041],{"class":179},"    glGenTextures",[93,2043,215],{"class":182},[93,2045,517],{"class":218},[93,2047,240],{"class":182},[93,2049,835],{"class":192},[93,2051,2052],{"class":182},"texture);",[93,2054,2055],{"class":671}," \u002F\u002F 生成纹理\n",[93,2057,2059,2061,2063,2065,2067,2069,2072],{"class":175,"line":2058},103,[93,2060,2041],{"class":179},[93,2062,215],{"class":182},[93,2064,517],{"class":218},[93,2066,240],{"class":182},[93,2068,835],{"class":192},[93,2070,2071],{"class":182},"texture2);",[93,2073,2055],{"class":671},[93,2075,2077],{"class":175,"line":2076},104,[93,2078,1320],{"class":182},[93,2080,2082],{"class":175,"line":2081},105,[93,2083,2084],{"class":671},"    \u002F\u002F 配置第一个纹理\n",[93,2086,2088,2091],{"class":175,"line":2087},106,[93,2089,2090],{"class":179},"    glActiveTexture",[93,2092,2093],{"class":182},"(GL_TEXTURE0);\n",[93,2095,2097,2100,2103],{"class":175,"line":2096},107,[93,2098,2099],{"class":179},"    glBindTexture",[93,2101,2102],{"class":182},"(GL_TEXTURE_2D, texture);",[93,2104,2105],{"class":671}," \u002F\u002F 绑定纹理\n",[93,2107,2109,2112,2115],{"class":175,"line":2108},108,[93,2110,2111],{"class":179},"    glTexParameteri",[93,2113,2114],{"class":182},"(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);",[93,2116,2117],{"class":671}," \u002F\u002F 设置纹理环绕方式\n",[93,2119,2121,2123,2126],{"class":175,"line":2120},109,[93,2122,2111],{"class":179},[93,2124,2125],{"class":182},"(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);",[93,2127,2117],{"class":671},[93,2129,2131,2133,2136],{"class":175,"line":2130},110,[93,2132,2111],{"class":179},[93,2134,2135],{"class":182},"(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);",[93,2137,2138],{"class":671}," \u002F\u002F 设置纹理过滤方式\n",[93,2140,2142,2144,2147],{"class":175,"line":2141},111,[93,2143,2111],{"class":179},[93,2145,2146],{"class":182},"(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);",[93,2148,2138],{"class":671},[93,2150,2152,2155,2158,2160,2163,2165,2168],{"class":175,"line":2151},112,[93,2153,2154],{"class":179},"    glTexImage2D",[93,2156,2157],{"class":182},"(GL_TEXTURE_2D, ",[93,2159,720],{"class":218},[93,2161,2162],{"class":182},", GL_RGB, image.cols, image.rows, ",[93,2164,720],{"class":218},[93,2166,2167],{"class":182},", GL_RGB, GL_UNSIGNED_BYTE, image.data);",[93,2169,2170],{"class":671}," \u002F\u002F 设置纹理数据\n",[93,2172,2174,2177,2180],{"class":175,"line":2173},113,[93,2175,2176],{"class":179},"    glGenerateMipmap",[93,2178,2179],{"class":182},"(GL_TEXTURE_2D);",[93,2181,2182],{"class":671}," \u002F\u002F 生成mipmap\n",[93,2184,2186],{"class":175,"line":2185},114,[93,2187,361],{"emptyLinePlaceholder":360},[93,2189,2191],{"class":175,"line":2190},115,[93,2192,2193],{"class":671},"    \u002F\u002F 配置第二个纹理\n",[93,2195,2197,2199],{"class":175,"line":2196},116,[93,2198,2090],{"class":179},[93,2200,2201],{"class":182},"(GL_TEXTURE1);\n",[93,2203,2205,2207,2210],{"class":175,"line":2204},117,[93,2206,2099],{"class":179},[93,2208,2209],{"class":182},"(GL_TEXTURE_2D, texture2);",[93,2211,2105],{"class":671},[93,2213,2215,2217,2219],{"class":175,"line":2214},118,[93,2216,2111],{"class":179},[93,2218,2114],{"class":182},[93,2220,2117],{"class":671},[93,2222,2224,2226,2228],{"class":175,"line":2223},119,[93,2225,2111],{"class":179},[93,2227,2125],{"class":182},[93,2229,2230],{"class":671}," \u002F\u002F 设置纹理环绕方式   \n",[93,2232,2234,2236,2238],{"class":175,"line":2233},120,[93,2235,2111],{"class":179},[93,2237,2135],{"class":182},[93,2239,2138],{"class":671},[93,2241,2243,2245,2247],{"class":175,"line":2242},121,[93,2244,2111],{"class":179},[93,2246,2146],{"class":182},[93,2248,2138],{"class":671},[93,2250,2252,2254,2256,2258,2261,2263,2266],{"class":175,"line":2251},122,[93,2253,2154],{"class":179},[93,2255,2157],{"class":182},[93,2257,720],{"class":218},[93,2259,2260],{"class":182},", GL_RGB, image2.cols, image2.rows, ",[93,2262,720],{"class":218},[93,2264,2265],{"class":182},", GL_RGB, GL_UNSIGNED_BYTE, image2.data);",[93,2267,2170],{"class":671},[93,2269,2271,2273,2275],{"class":175,"line":2270},123,[93,2272,2176],{"class":179},[93,2274,2179],{"class":182},[93,2276,2182],{"class":671},[93,2278,2280],{"class":175,"line":2279},124,[93,2281,361],{"emptyLinePlaceholder":360},[93,2283,2285],{"class":175,"line":2284},125,[93,2286,361],{"emptyLinePlaceholder":360},[93,2288,2290],{"class":175,"line":2289},126,[93,2291,2292],{"class":671},"    \u002F\u002F 创建VAO\n",[93,2294,2296,2298,2300],{"class":175,"line":2295},127,[93,2297,1953],{"class":192},[93,2299,489],{"class":192},[93,2301,2302],{"class":182}," VAO;\n",[93,2304,2306,2309,2311,2313,2315,2317],{"class":175,"line":2305},128,[93,2307,2308],{"class":179},"    glGenVertexArrays",[93,2310,215],{"class":182},[93,2312,517],{"class":218},[93,2314,240],{"class":182},[93,2316,835],{"class":192},[93,2318,2319],{"class":182},"VAO);\n",[93,2321,2323,2326,2329],{"class":175,"line":2322},129,[93,2324,2325],{"class":179},"    glBindVertexArray",[93,2327,2328],{"class":182},"(VAO);",[93,2330,2331],{"class":671}," \u002F\u002F 绑定VAO\n",[93,2333,2335],{"class":175,"line":2334},130,[93,2336,361],{"emptyLinePlaceholder":360},[93,2338,2340],{"class":175,"line":2339},131,[93,2341,2342],{"class":671},"    \u002F\u002F 创建VBO\n",[93,2344,2346,2348,2350],{"class":175,"line":2345},132,[93,2347,1953],{"class":192},[93,2349,489],{"class":192},[93,2351,2352],{"class":182}," VBO;\n",[93,2354,2356,2359,2361,2363,2365,2367],{"class":175,"line":2355},133,[93,2357,2358],{"class":179},"    glGenBuffers",[93,2360,215],{"class":182},[93,2362,517],{"class":218},[93,2364,240],{"class":182},[93,2366,835],{"class":192},[93,2368,2369],{"class":182},"VBO);\n",[93,2371,2373,2376,2379],{"class":175,"line":2372},134,[93,2374,2375],{"class":179},"    glBindBuffer",[93,2377,2378],{"class":182},"(GL_ARRAY_BUFFER, VBO);",[93,2380,2381],{"class":671}," \u002F\u002F 绑定VBO\n",[93,2383,2385,2388,2391,2394],{"class":175,"line":2384},135,[93,2386,2387],{"class":179},"    glBufferData",[93,2389,2390],{"class":182},"(GL_ARRAY_BUFFER, ",[93,2392,2393],{"class":192},"sizeof",[93,2395,2396],{"class":182},"(vertices), vertices, GL_STATIC_DRAW);\n",[93,2398,2400],{"class":175,"line":2399},136,[93,2401,361],{"emptyLinePlaceholder":360},[93,2403,2405],{"class":175,"line":2404},137,[93,2406,2407],{"class":671},"    \u002F\u002F 创建EBO\n",[93,2409,2411,2413,2415],{"class":175,"line":2410},138,[93,2412,1953],{"class":192},[93,2414,489],{"class":192},[93,2416,2417],{"class":182}," EBO;\n",[93,2419,2421,2423,2425,2427,2429,2431],{"class":175,"line":2420},139,[93,2422,2358],{"class":179},[93,2424,215],{"class":182},[93,2426,517],{"class":218},[93,2428,240],{"class":182},[93,2430,835],{"class":192},[93,2432,2433],{"class":182},"EBO);\n",[93,2435,2437,2439,2442],{"class":175,"line":2436},140,[93,2438,2375],{"class":179},[93,2440,2441],{"class":182},"(GL_ELEMENT_ARRAY_BUFFER, EBO);",[93,2443,2444],{"class":671}," \u002F\u002F 绑定EBO\n",[93,2446,2448,2450,2453,2455],{"class":175,"line":2447},141,[93,2449,2387],{"class":179},[93,2451,2452],{"class":182},"(GL_ELEMENT_ARRAY_BUFFER, ",[93,2454,2393],{"class":192},[93,2456,2457],{"class":182},"(indices), indices, GL_STATIC_DRAW);\n",[93,2459,2461],{"class":175,"line":2460},142,[93,2462,361],{"emptyLinePlaceholder":360},[93,2464,2466,2469],{"class":175,"line":2465},143,[93,2467,2468],{"class":192},"    int",[93,2470,2471],{"class":182}," nrAttributes;\n",[93,2473,2475,2478,2481,2483],{"class":175,"line":2474},144,[93,2476,2477],{"class":179},"    glGetIntegerv",[93,2479,2480],{"class":182},"(GL_MAX_VERTEX_ATTRIBS, ",[93,2482,835],{"class":192},[93,2484,2485],{"class":182},"nrAttributes);\n",[93,2487,2489,2491,2493,2495,2498,2500,2503,2505,2507],{"class":175,"line":2488},145,[93,2490,1185],{"class":179},[93,2492,1328],{"class":182},[93,2494,850],{"class":192},[93,2496,2497],{"class":503}," \"Maximum nr of vertex attributes supported: \"",[93,2499,856],{"class":192},[93,2501,2502],{"class":182}," nrAttributes ",[93,2504,850],{"class":192},[93,2506,769],{"class":179},[93,2508,872],{"class":182},[93,2510,2512],{"class":175,"line":2511},146,[93,2513,361],{"emptyLinePlaceholder":360},[93,2515,2517],{"class":175,"line":2516},147,[93,2518,2519],{"class":671},"    \u002F\u002F 位置属性\n",[93,2521,2523,2526,2528,2530,2532,2534,2537,2540,2543,2546,2548,2551,2554,2557,2560,2562],{"class":175,"line":2522},148,[93,2524,2525],{"class":179},"    glVertexAttribPointer",[93,2527,215],{"class":182},[93,2529,720],{"class":218},[93,2531,240],{"class":182},[93,2533,1466],{"class":218},[93,2535,2536],{"class":182},", GL_FLOAT, GL_FALSE, ",[93,2538,2539],{"class":218},"8",[93,2541,2542],{"class":192}," *",[93,2544,2545],{"class":192}," sizeof",[93,2547,215],{"class":182},[93,2549,2550],{"class":192},"float",[93,2552,2553],{"class":182},"), (",[93,2555,2556],{"class":192},"void*",[93,2558,2559],{"class":182},")",[93,2561,720],{"class":218},[93,2563,428],{"class":182},[93,2565,2567,2570,2572,2574,2577],{"class":175,"line":2566},149,[93,2568,2569],{"class":179},"    glEnableVertexAttribArray",[93,2571,215],{"class":182},[93,2573,720],{"class":218},[93,2575,2576],{"class":182},");",[93,2578,2579],{"class":671}," \u002F\u002F 启用顶点属性\n",[93,2581,2583],{"class":175,"line":2582},150,[93,2584,361],{"emptyLinePlaceholder":360},[93,2586,2588],{"class":175,"line":2587},151,[93,2589,2590],{"class":671},"    \u002F\u002F 颜色属性\n",[93,2592,2594,2596,2598,2600,2602,2604,2606,2608,2610,2612,2614,2616,2618,2620,2623,2625,2627,2629,2631,2633],{"class":175,"line":2593},152,[93,2595,2525],{"class":179},[93,2597,215],{"class":182},[93,2599,517],{"class":218},[93,2601,240],{"class":182},[93,2603,1466],{"class":218},[93,2605,2536],{"class":182},[93,2607,2539],{"class":218},[93,2609,2542],{"class":192},[93,2611,2545],{"class":192},[93,2613,215],{"class":182},[93,2615,2550],{"class":192},[93,2617,2553],{"class":182},[93,2619,2556],{"class":192},[93,2621,2622],{"class":182},")(",[93,2624,1466],{"class":218},[93,2626,2542],{"class":192},[93,2628,2545],{"class":192},[93,2630,215],{"class":182},[93,2632,2550],{"class":192},[93,2634,2635],{"class":182},")));\n",[93,2637,2639,2641,2643,2645],{"class":175,"line":2638},153,[93,2640,2569],{"class":179},[93,2642,215],{"class":182},[93,2644,517],{"class":218},[93,2646,428],{"class":182},[93,2648,2650],{"class":175,"line":2649},154,[93,2651,1320],{"class":182},[93,2653,2655],{"class":175,"line":2654},155,[93,2656,2657],{"class":671},"    \u002F\u002F 纹理属性\n",[93,2659,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2692,2694,2696,2698,2700],{"class":175,"line":2660},156,[93,2662,2525],{"class":179},[93,2664,215],{"class":182},[93,2666,1992],{"class":218},[93,2668,240],{"class":182},[93,2670,1992],{"class":218},[93,2672,2536],{"class":182},[93,2674,2539],{"class":218},[93,2676,2542],{"class":192},[93,2678,2545],{"class":192},[93,2680,215],{"class":182},[93,2682,2550],{"class":192},[93,2684,2553],{"class":182},[93,2686,2556],{"class":192},[93,2688,2622],{"class":182},[93,2690,2691],{"class":218},"6",[93,2693,2542],{"class":192},[93,2695,2545],{"class":192},[93,2697,215],{"class":182},[93,2699,2550],{"class":192},[93,2701,2635],{"class":182},[93,2703,2705,2707,2709,2711],{"class":175,"line":2704},157,[93,2706,2569],{"class":179},[93,2708,215],{"class":182},[93,2710,1992],{"class":218},[93,2712,428],{"class":182},[93,2714,2716],{"class":175,"line":2715},158,[93,2717,361],{"emptyLinePlaceholder":360},[93,2719,2721],{"class":175,"line":2720},159,[93,2722,2723],{"class":671},"    \u002F\u002F 构建并编译着色器程序\n",[93,2725,2727,2730,2733,2735,2738,2740,2743],{"class":175,"line":2726},160,[93,2728,2729],{"class":179},"    Shader",[93,2731,2732],{"class":179}," ourShader",[93,2734,215],{"class":182},[93,2736,2737],{"class":503},"\"shader\u002Fcustom.vert\"",[93,2739,240],{"class":182},[93,2741,2742],{"class":503},"\"shader\u002Ffragment.vert\"",[93,2744,428],{"class":182},[93,2746,2748],{"class":175,"line":2747},161,[93,2749,361],{"emptyLinePlaceholder":360},[93,2751,2753],{"class":175,"line":2752},162,[93,2754,2755],{"class":671},"    \u002F\u002F 渲染循环\n",[93,2757,2759,2762,2764,2766,2769],{"class":175,"line":2758},163,[93,2760,2761],{"class":192},"    while",[93,2763,824],{"class":182},[93,2765,1644],{"class":192},[93,2767,2768],{"class":179},"glfwWindowShouldClose",[93,2770,2771],{"class":182},"(window)) {\n",[93,2773,2775],{"class":175,"line":2774},164,[93,2776,2777],{"class":671},"        \u002F\u002F 处理输入\n",[93,2779,2781,2784],{"class":175,"line":2780},165,[93,2782,2783],{"class":179},"        glfwPollEvents",[93,2785,812],{"class":182},[93,2787,2789],{"class":175,"line":2788},166,[93,2790,2791],{"class":182},"        \n",[93,2793,2795],{"class":175,"line":2794},167,[93,2796,2797],{"class":671},"        \u002F\u002F 渲染指令\n",[93,2799,2801,2804,2806,2809,2811,2813,2816,2818,2820,2822,2824,2826,2828,2830],{"class":175,"line":2800},168,[93,2802,2803],{"class":179},"        glClearColor",[93,2805,215],{"class":182},[93,2807,2808],{"class":218},"0.2",[93,2810,222],{"class":192},[93,2812,240],{"class":182},[93,2814,2815],{"class":218},"0.3",[93,2817,222],{"class":192},[93,2819,240],{"class":182},[93,2821,2815],{"class":218},[93,2823,222],{"class":192},[93,2825,240],{"class":182},[93,2827,247],{"class":218},[93,2829,222],{"class":192},[93,2831,428],{"class":182},[93,2833,2835,2838],{"class":175,"line":2834},169,[93,2836,2837],{"class":179},"        glClear",[93,2839,2840],{"class":182},"(GL_COLOR_BUFFER_BIT);\n",[93,2842,2844],{"class":175,"line":2843},170,[93,2845,2791],{"class":182},[93,2847,2849],{"class":175,"line":2848},171,[93,2850,2851],{"class":671},"        \u002F\u002F 使用着色器程序\n",[93,2853,2855,2858,2861],{"class":175,"line":2854},172,[93,2856,2857],{"class":182},"        ourShader.",[93,2859,2860],{"class":179},"use",[93,2862,812],{"class":182},[93,2864,2866],{"class":175,"line":2865},173,[93,2867,2791],{"class":182},[93,2869,2871],{"class":175,"line":2870},174,[93,2872,2873],{"class":671},"        \u002F\u002F 设置变换矩阵\n",[93,2875,2877,2880,2882,2884,2886,2888,2890,2892],{"class":175,"line":2876},175,[93,2878,2879],{"class":192},"        unsigned",[93,2881,489],{"class":192},[93,2883,492],{"class":182},[93,2885,193],{"class":192},[93,2887,497],{"class":179},[93,2889,500],{"class":182},[93,2891,504],{"class":503},[93,2893,428],{"class":182},[93,2895,2897,2900,2902,2904,2906,2908,2910,2912],{"class":175,"line":2896},176,[93,2898,2899],{"class":179},"        glUniformMatrix4fv",[93,2901,514],{"class":182},[93,2903,517],{"class":218},[93,2905,520],{"class":182},[93,2907,115],{"class":179},[93,2909,199],{"class":182},[93,2911,527],{"class":179},[93,2913,530],{"class":182},[93,2915,2917],{"class":175,"line":2916},177,[93,2918,361],{"emptyLinePlaceholder":360},[93,2920,2922,2924,2927,2929,2932,2934,2936],{"class":175,"line":2921},178,[93,2923,2857],{"class":182},[93,2925,2926],{"class":179},"setInt",[93,2928,215],{"class":182},[93,2930,2931],{"class":503},"\"ourTexture\"",[93,2933,240],{"class":182},[93,2935,720],{"class":218},[93,2937,428],{"class":182},[93,2939,2941,2943,2945,2947,2950,2952,2954],{"class":175,"line":2940},179,[93,2942,2857],{"class":182},[93,2944,2926],{"class":179},[93,2946,215],{"class":182},[93,2948,2949],{"class":503},"\"ourTexture2\"",[93,2951,240],{"class":182},[93,2953,517],{"class":218},[93,2955,428],{"class":182},[93,2957,2959],{"class":175,"line":2958},180,[93,2960,2791],{"class":182},[93,2962,2964,2967],{"class":175,"line":2963},181,[93,2965,2966],{"class":179},"        glBindVertexArray",[93,2968,2969],{"class":182},"(VAO);\n",[93,2971,2973],{"class":175,"line":2972},182,[93,2974,2791],{"class":182},[93,2976,2978],{"class":175,"line":2977},183,[93,2979,2980],{"class":671},"        \u002F\u002F 绘制矩形（使用EBO）\n",[93,2982,2984,2987,2990,2992,2995,2997],{"class":175,"line":2983},184,[93,2985,2986],{"class":179},"        glDrawElements",[93,2988,2989],{"class":182},"(GL_TRIANGLES, ",[93,2991,2691],{"class":218},[93,2993,2994],{"class":182},", GL_UNSIGNED_INT, ",[93,2996,720],{"class":218},[93,2998,428],{"class":182},[93,3000,3002],{"class":175,"line":3001},185,[93,3003,2791],{"class":182},[93,3005,3007],{"class":175,"line":3006},186,[93,3008,3009],{"class":671},"        \u002F\u002F 交换缓冲区和检查IO事件\n",[93,3011,3013,3016],{"class":175,"line":3012},187,[93,3014,3015],{"class":179},"        glfwSwapBuffers",[93,3017,1614],{"class":182},[93,3019,3021],{"class":175,"line":3020},188,[93,3022,888],{"class":182},[93,3024,3026],{"class":175,"line":3025},189,[93,3027,361],{"emptyLinePlaceholder":360},[93,3029,3031],{"class":175,"line":3030},190,[93,3032,3033],{"class":671},"    \u002F\u002F 清理资源\n",[93,3035,3037,3040,3042,3044,3046,3048],{"class":175,"line":3036},191,[93,3038,3039],{"class":179},"    glDeleteVertexArrays",[93,3041,215],{"class":182},[93,3043,517],{"class":218},[93,3045,240],{"class":182},[93,3047,835],{"class":192},[93,3049,2319],{"class":182},[93,3051,3053,3056,3058,3060,3062,3064],{"class":175,"line":3052},192,[93,3054,3055],{"class":179},"    glDeleteBuffers",[93,3057,215],{"class":182},[93,3059,517],{"class":218},[93,3061,240],{"class":182},[93,3063,835],{"class":192},[93,3065,2369],{"class":182},[93,3067,3069,3071,3073,3075,3077,3079],{"class":175,"line":3068},193,[93,3070,3055],{"class":179},[93,3072,215],{"class":182},[93,3074,517],{"class":218},[93,3076,240],{"class":182},[93,3078,835],{"class":192},[93,3080,2433],{"class":182},[93,3082,3084,3087,3089,3091,3093,3095],{"class":175,"line":3083},194,[93,3085,3086],{"class":179},"    glDeleteTextures",[93,3088,215],{"class":182},[93,3090,517],{"class":218},[93,3092,240],{"class":182},[93,3094,835],{"class":192},[93,3096,3097],{"class":182},"texture);\n",[93,3099,3101,3103,3105,3107,3109,3111],{"class":175,"line":3100},195,[93,3102,3086],{"class":179},[93,3104,215],{"class":182},[93,3106,517],{"class":218},[93,3108,240],{"class":182},[93,3110,835],{"class":192},[93,3112,3113],{"class":182},"texture2);\n",[93,3115,3117,3120],{"class":175,"line":3116},196,[93,3118,3119],{"class":179},"    glfwTerminate",[93,3121,812],{"class":182},[93,3123,3125,3128,3130],{"class":175,"line":3124},197,[93,3126,3127],{"class":192},"    return",[93,3129,337],{"class":218},[93,3131,651],{"class":182},[93,3133,3135],{"class":175,"line":3134},198,[93,3136,448],{"class":182},[93,3138,3140],{"class":175,"line":3139},199,[93,3141,361],{"emptyLinePlaceholder":360},[93,3143,3145,3147,3149],{"class":175,"line":3144},200,[93,3146,318],{"class":182},[93,3148,321],{"class":218},[93,3150,324],{"class":182},[93,3152,3154],{"class":175,"line":3153},201,[93,3155,3156],{"class":182},"out vec4 FragColor;\n",[93,3158,3160],{"class":175,"line":3159},202,[93,3161,3162],{"class":182},"in vec3 ourColor;\n",[93,3164,3166],{"class":175,"line":3165},203,[93,3167,3168],{"class":182},"in vec2 TexCoord;\n",[93,3170,3172],{"class":175,"line":3171},204,[93,3173,3174],{"class":182},"uniform sampler2D ourTexture;\n",[93,3176,3178],{"class":175,"line":3177},205,[93,3179,3180],{"class":182},"uniform sampler2D ourTexture2;\n",[93,3182,3184,3186,3188],{"class":175,"line":3183},206,[93,3185,389],{"class":192},[93,3187,392],{"class":179},[93,3189,395],{"class":182},[93,3191,3193],{"class":175,"line":3192},207,[93,3194,401],{"class":182},[93,3196,3198,3201,3203,3206,3208,3211,3214,3216,3219,3221,3224,3226,3228,3231,3233],{"class":175,"line":3197},208,[93,3199,3200],{"class":182},"    FragColor ",[93,3202,193],{"class":192},[93,3204,3205],{"class":179}," mix",[93,3207,215],{"class":182},[93,3209,3210],{"class":179},"texture",[93,3212,3213],{"class":182},"(ourTexture, TexCoord), ",[93,3215,3210],{"class":179},[93,3217,3218],{"class":182},"(ourTexture2, TexCoord), ",[93,3220,277],{"class":218},[93,3222,3223],{"class":182},") ",[93,3225,415],{"class":192},[93,3227,418],{"class":179},[93,3229,3230],{"class":182},"(ourColor, ",[93,3232,247],{"class":218},[93,3234,428],{"class":182},[93,3236,3238],{"class":175,"line":3237},209,[93,3239,448],{"class":182},[93,3241,3243],{"class":175,"line":3242},210,[93,3244,361],{"emptyLinePlaceholder":360},[93,3246,3248,3250,3252],{"class":175,"line":3247},211,[93,3249,318],{"class":182},[93,3251,321],{"class":218},[93,3253,324],{"class":182},[93,3255,3257,3259,3262,3264,3266],{"class":175,"line":3256},212,[93,3258,329],{"class":179},[93,3260,3261],{"class":182},"(location ",[93,3263,193],{"class":192},[93,3265,337],{"class":218},[93,3267,340],{"class":182},[93,3269,3271,3273,3275,3277,3279],{"class":175,"line":3270},213,[93,3272,329],{"class":179},[93,3274,3261],{"class":182},[93,3276,193],{"class":192},[93,3278,351],{"class":218},[93,3280,3281],{"class":182},") in vec3 aColor;\n",[93,3283,3285,3287,3289,3291,3294],{"class":175,"line":3284},214,[93,3286,329],{"class":179},[93,3288,3261],{"class":182},[93,3290,193],{"class":192},[93,3292,3293],{"class":218}," 2",[93,3295,354],{"class":182},[93,3297,3299],{"class":175,"line":3298},215,[93,3300,3301],{"class":182},"out vec3 ourColor; \n",[93,3303,3305],{"class":175,"line":3304},216,[93,3306,367],{"class":182},[93,3308,3310],{"class":175,"line":3309},217,[93,3311,378],{"class":182},[93,3313,3315,3317,3319],{"class":175,"line":3314},218,[93,3316,389],{"class":192},[93,3318,392],{"class":179},[93,3320,395],{"class":182},[93,3322,3324],{"class":175,"line":3323},219,[93,3325,401],{"class":182},[93,3327,3329,3331,3333,3335,3337,3339,3341,3343],{"class":175,"line":3328},220,[93,3330,407],{"class":182},[93,3332,193],{"class":192},[93,3334,412],{"class":182},[93,3336,415],{"class":192},[93,3338,418],{"class":179},[93,3340,421],{"class":182},[93,3342,247],{"class":218},[93,3344,428],{"class":182},[93,3346,3348,3351,3353],{"class":175,"line":3347},221,[93,3349,3350],{"class":182},"    ourColor ",[93,3352,193],{"class":192},[93,3354,3355],{"class":182}," aColor;\n",[93,3357,3359,3361,3363],{"class":175,"line":3358},222,[93,3360,434],{"class":182},[93,3362,193],{"class":192},[93,3364,3365],{"class":182}," aTexCoord;\n",[93,3367,3369],{"class":175,"line":3368},223,[93,3370,448],{"class":182},[20,3372,3373],{"id":3373},"坐标变换",[10,3375,3376,3377,3380],{},"​\t为了将坐标从一个坐标系变换到另一个坐标系，我们需要用到几个变换矩阵，最重要的几个分别是",[48,3378,3379],{},"模型(Model)、观察(View)、投影(Projection)三个矩阵","。我们的顶点坐标起始于局部空间(Local Space)，在这里它称为局部坐标(Local Coordinate)，它在之后会变为世界坐标(World Coordinate)，观察坐标(View Coordinate)，裁剪坐标(Clip Coordinate)，并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么：",[10,3382,3383],{},[32,3384],{"alt":3385,"src":3386},"coordinate_systems",".\u002Fassets\u002Fcoordinate_systems.png",[3388,3389,3390,3397,3404,3411,3416],"ol",{},[3391,3392,3393,3394,106],"li",{},"局部坐标是",[48,3395,3396],{},"对象相对于局部原点的坐标，也是物体起始的坐标",[3391,3398,3399,3400,3403],{},"下一步是",[48,3401,3402],{},"将局部坐标变换为世界空间坐标","，世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点，它们会和其它物体一起相对于世界的原点进行摆放。",[3391,3405,3406,3407,3410],{},"接下来",[48,3408,3409],{},"我们将世界坐标变换为观察空间坐标","，使得每个坐标都是从摄像机或者说观察者的角度进行观察的。",[3391,3412,3413,106],{},[48,3414,3415],{},"坐标到达观察空间之后，我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内，并判断哪些顶点将会出现在屏幕上",[3391,3417,3418,3419,3422],{},"最后，我们将裁剪坐标变换为屏幕坐标，",[48,3420,3421],{},"我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内","。最后变换出来的坐标将会送到光栅器，将其转化为片段。",[10,3424,3425],{},"​\t你可能已经大致了解了每个坐标空间的作用。我们之所以将顶点变换到各个不同的空间的原因是有些操作在特定的坐标系统中才有意义且更方便。例如，当需要对物体进行修改的时候，在局部空间中来操作会更说得通；如果要对一个物体做出一个相对于其它物体位置的操作时，在世界坐标系中来做这个才更说得通，等等。如果我们愿意，我们也可以定义一个直接从局部空间变换到裁剪空间的变换矩阵，但那样会失去很多灵活性。",[10,3427,3428],{},"接下来我们将要更仔细地讨论各个坐标系统。",[64,3430,3431],{"id":3431},"局部空间",[10,3433,3434,3435,3438,3439,3442],{},"​\t局部空间是",[48,3436,3437],{},"指物体所在的坐标空间，即对象最开始所在的地方","。想象你在一个建模软件（比如说Blender）中创建了一个立方体。你创建的立方体的原点有可能位于(0, 0, 0)，即便它有可能最后在程序中处于完全不同的位置。甚至有可能你创建的所有模型都以(0, 0, 0)为初始位置（译注：然而它们会最终出现在世界的不同位置）。所以，你的模型的所有顶点都是在",[48,3440,3441],{},"局部","空间中：它们相对于你的物体来说都是局部的。",[10,3444,3445],{},"​\t我们一直使用的那个箱子的顶点是被设定在-0.5到0.5的坐标范围中，(0, 0)是它的原点。这些都是局部坐标。",[64,3447,3448],{"id":3448},"世界空间",[10,3450,3451,3452,3455,3456,106],{},"​\t如果我们",[48,3453,3454],{},"将我们所有的物体导入到程序当中，它们有可能会全挤在世界的原点(0, 0, 0)上","，这并不是我们想要的结果。我们想为每一个物体定义一个位置，从而能在更大的世界当中放置它们。世界空间中的坐标正如其名：是指顶点相对于（游戏）世界的坐标。如果你希望将物体分散在世界上摆放（特别是非常真实的那样），这就是你希望物体变换到的空间。",[48,3457,3458],{},"物体的坐标将会从局部变换到世界空间；该变换是由模型矩阵(Model Matrix)实现的",[10,3460,3461,3462,3465],{},"​\t模型矩阵是一种变换矩阵，它能",[48,3463,3464],{},"通过对物体进行位移、缩放、旋转来将它置于它本应该在的位置或朝向","。你可以将它想像为变换一个房子，你需要先将它缩小（它在局部空间中太大了），并将其位移至郊区的一个小镇，然后在y轴上往左旋转一点以搭配附近的房子。你也可以把上一节将箱子到处摆放在场景中用的那个矩阵大致看作一个模型矩阵；我们将箱子的局部坐标变换到场景\u002F世界中的不同位置。",[64,3467,3468],{"id":3468},"观察空间",[10,3470,3471,3472,3475,3476,3479],{},"​\t观察空间经常被人们称之",[48,3473,3474],{},"OpenGL的摄像机(Camera)（所以有时也称为摄像机空间(Camera Space)或视觉空间(Eye Space)）","。观察空间是将世界空间坐标转化为用户视野前方的坐标而产生的结果。因此观察空间就是从摄像机的视角所观察到的空间。",[48,3477,3478],{},"而这通常是由一系列的位移和旋转的组合来完成，平移\u002F旋转场景从而使得特定的对象被变换到摄像机的前方","。这些组合在一起的变换通常存储在一个观察矩阵(View Matrix)里，它被用来将世界坐标变换到观察空间。在下一节中我们将深入讨论如何创建一个这样的观察矩阵来模拟一个摄像机。",[64,3481,3482],{"id":3482},"裁剪空间",[10,3484,3485],{},"​\t在一个顶点着色器运行的最后，OpenGL期望所有的坐标都能落在一个特定的范围内，且任何在这个范围之外的点都应该被裁剪掉(Clipped)。被裁剪掉的坐标就会被忽略，所以剩下的坐标就将变为屏幕上可见的片段。这也就是裁剪空间(Clip Space)名字的由来。",[10,3487,3488],{},"​\t因为将所有可见的坐标都指定在-1.0到1.0的范围内不是很直观，所以我们会指定自己的坐标集(Coordinate Set)并将它变换回标准化设备坐标系，就像OpenGL期望的那样。",[10,3490,3491],{},"​\t为了将顶点坐标从观察变换到裁剪空间，我们需要定义一个投影矩阵(Projection Matrix)，它指定了一个范围的坐标，比如在每个维度上的-1000到1000。投影矩阵接着会将在这个指定的范围内的坐标变换为标准化设备坐标的范围(-1.0, 1.0)。所有在范围外的坐标不会被映射到在-1.0到1.0的范围之间，所以会被裁剪掉。在上面这个投影矩阵所指定的范围内，坐标(1250, 500, 750)将是不可见的，这是由于它的x坐标超出了范围，它被转化为一个大于1.0的标准化设备坐标，所以被裁剪掉了。",[88,3493,3494,3498],{},[10,3495,3496],{},[93,3497,95],{},[10,3499,3500],{},"如果只是图元(Primitive)，例如三角形，的一部分超出了裁剪体积(Clipping Volume)，则OpenGL会重新构建这个三角形为一个或多个三角形让其能够适合这个裁剪范围。",[10,3502,3503,3504,3507,3508,3511],{},"​\t由投影矩阵创建的",[48,3505,3506],{},"观察箱","(Viewing Box)被称为",[48,3509,3510],{},"平截头体(Frustum)，每个出现在平截头体范围内的坐标都会最终出现在用户的屏幕上","。将特定范围内的坐标转化到标准化设备坐标系的过程（而且它很容易被映射到2D观察空间坐标）被称之为投影(Projection)，因为使用投影矩阵能将3D坐标投影(Project)到很容易映射到2D的标准化设备坐标系中。",[10,3513,3514,3515,3518],{},"​\t一旦",[48,3516,3517],{},"所有顶点被变换到裁剪空间，最终的操作——透视除法(Perspective Division)将会执行，在这个过程中我们将位置向量的x，y，z分量分别除以向量的齐次w分量","；透视除法是将4D裁剪空间坐标变换为3D标准化设备坐标的过程。这一步会在每一个顶点着色器运行的最后被自动执行。",[10,3520,3521],{},"​\t在这一阶段之后，最终的坐标将会被映射到屏幕空间中（使用glViewport中的设定），并被变换成片段。",[10,3523,3524],{},"​\t将观察坐标变换为裁剪坐标的投影矩阵可以为两种不同的形式，每种形式都定义了不同的平截头体。我们可以选择创建一个正射投影矩阵(Orthographic Projection Matrix)或一个透视投影矩阵(Perspective Projection Matrix)。",[3526,3527,3528],"h3",{"id":3528},"正射投影",[10,3530,3531],{},"​\t消除透视效果 (等比例缩放)。这是正射投影与透视投影（Perspective Projection）最本质的区别：",[3533,3534,3535],"ul",{},[3391,3536,3537,3540,3541,3544,3545],{},[48,3538,3539],{},"正射投影："," 无论物体离摄像机多远或多近，它们在屏幕上显示的尺寸",[48,3542,3543],{},"始终保持不变","。近处的物体不会显得更大，远处的物体也不会显得更小。\n",[3533,3546,3547],{},[3391,3548,3549,3552],{},[48,3550,3551],{},"应用场景："," 2D 游戏、工程制图、用户界面（UI）渲染、地图编辑、需要保持物体精确尺寸的医学图像。",[10,3554,3555,3556,3559],{},"​\t正射投影矩阵定义了一个类似立方体的平截头箱，",[48,3557,3558],{},"它定义了一个裁剪空间，在这空间之外的顶点都会被裁剪掉","。创建一个正射投影矩阵需要指定可见平截头体的宽、高和长度。在使用正射投影矩阵变换至裁剪空间之后处于这个平截头体内的所有坐标将不会被裁剪掉。它的平截头体看起来像一个容器：",[10,3561,3562],{},[32,3563],{"alt":3564,"src":3565},"orthographic projection frustum",".\u002Fassets\u002Forthographic_frustum.png",[10,3567,69,3568,3571],{},[48,3569,3570],{},"上面的平截头体定义了可见的坐标，它由宽、高、近(Near)平面和远(Far)平面所指定","。任何出现在近平面之前或远平面之后的坐标都会被裁剪掉。正射平截头体直接将平截头体内部的所有坐标映射为标准化设备坐标，因为每个向量的w分量都没有进行改变；如果w分量等于1.0，透视除法则不会改变这个坐标。",[10,3573,3574,3575,3578],{},"​\t要创建一个正射投影矩阵，我们可以使用GLM的内置函数",[171,3576,3577],{},"glm::ortho","：",[164,3580,3582],{"className":166,"code":3581,"language":168,"meta":169,"style":169},"glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);\n",[171,3583,3584],{"__ignoreMap":169},[93,3585,3586,3588,3590,3593,3595,3597,3599,3601,3604,3606,3608,3610,3612,3614,3617,3619,3621,3624,3626,3628,3631,3633],{"class":175,"line":176},[93,3587,115],{"class":179},[93,3589,199],{"class":182},[93,3591,3592],{"class":179},"ortho",[93,3594,215],{"class":182},[93,3596,237],{"class":218},[93,3598,222],{"class":192},[93,3600,240],{"class":182},[93,3602,3603],{"class":218},"800.0",[93,3605,222],{"class":192},[93,3607,240],{"class":182},[93,3609,237],{"class":218},[93,3611,222],{"class":192},[93,3613,240],{"class":182},[93,3615,3616],{"class":218},"600.0",[93,3618,222],{"class":192},[93,3620,240],{"class":182},[93,3622,3623],{"class":218},"0.1",[93,3625,222],{"class":192},[93,3627,240],{"class":182},[93,3629,3630],{"class":218},"100.0",[93,3632,222],{"class":192},[93,3634,428],{"class":182},[10,3636,3637,3638,3641,3642,3645,3646,3649],{},"​\t前两个参数",[48,3639,3640],{},"指定了平截头体的左右坐标","，",[48,3643,3644],{},"第三和第四参数指定了平截头体的底部和顶部","。通过这四个参数我们定义了近平面和远平面的大小，",[48,3647,3648],{},"然后第五和第六个参数则定义了近平面和远平面的距离","。这个投影矩阵会将处于这些x，y，z值范围内的坐标变换为标准化设备坐标。",[10,3651,3652,3653,3656],{},"​\t正射投影矩阵",[48,3654,3655],{},"直接将坐标映射到2D平面中，即你的屏幕","，但实际上一个直接的投影矩阵会产生不真实的结果，因为这个投影没有将透视(Perspective)考虑进去。所以我们需要透视投影矩阵来解决这个问题。",[3526,3658,3659],{"id":3659},"透视投影",[10,3661,3662,3663,3666],{},"​\t如果你曾经体验过",[48,3664,3665],{},"实际生活","给你带来的景象，你就会注意到离你越远的东西看起来更小。这个奇怪的效果称之为透视(Perspective)。透视的效果在我们看一条无限长的高速公路或铁路时尤其明显，正如下面图片显示的那样：",[10,3668,3669],{},[32,3670],{"alt":3671,"src":3672},"perspective",".\u002Fassets\u002Fperspective.png",[10,3674,3675,3676,3679],{},"​\t正如你看到的那样，",[48,3677,3678],{},"由于透视，这两条线在很远的地方看起来会相交。这正是透视投影想要模仿的效果，它是使用透视投影矩阵来完成的","。这个投影矩阵将给定的平截头体范围映射到裁剪空间，除此之外还修改了每个顶点坐标的w值，从而使得离观察者越远的顶点坐标w分量越大。被变换到裁剪空间的坐标都会在-w到w的范围之间（任何大于这个范围的坐标都会被裁剪掉）。OpenGL要求所有可见的坐标都落在-1.0到1.0范围内，作为顶点着色器最后的输出，因此，一旦坐标在裁剪空间内之后，透视除法就会被应用到裁剪空间坐标上：",[10,3681,3682],{},[32,3683],{"alt":3684,"src":3685},"image-20251010034829888",".\u002Fassets\u002Fimage-20251010034829888.png",[10,3687,69,3688,3691,3692,3695,3696,3699,3700,106],{},[48,3689,3690],{},"顶点坐标的每个分量都会除以它的w分量","，距",[48,3693,3694],{},"离观察者越远顶点坐标就会越小","。这是w分量重要的另一个原因，它能够",[48,3697,3698],{},"帮助我们进行透视投影。最后的结果坐标就是处于标准化设备空间中的","。如果你对正射投影矩阵和透视投影矩阵是如何计算的很感兴趣（且不会对数学感到恐惧的话）我推荐这篇由Songho写的",[100,3701,3704],{"href":3702,"rel":3703},"http:\u002F\u002Fwww.songho.ca\u002Fopengl\u002Fgl_projectionmatrix.html",[104],"文章",[10,3706,3707],{},"​\t在GLM中可以这样创建一个透视投影矩阵：",[164,3709,3711],{"className":166,"code":3710,"language":168,"meta":169,"style":169},"glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)width\u002F(float)height, 0.1f, 100.0f);\n",[171,3712,3713],{"__ignoreMap":169},[93,3714,3715,3717,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738,3741,3743,3745,3747,3750,3753,3755,3757,3760,3762,3764,3766,3768,3770],{"class":175,"line":176},[93,3716,115],{"class":179},[93,3718,3719],{"class":182},"::mat4 proj ",[93,3721,193],{"class":192},[93,3723,196],{"class":179},[93,3725,199],{"class":182},[93,3727,3671],{"class":179},[93,3729,215],{"class":182},[93,3731,115],{"class":179},[93,3733,199],{"class":182},[93,3735,212],{"class":179},[93,3737,215],{"class":182},[93,3739,3740],{"class":218},"45.0",[93,3742,222],{"class":192},[93,3744,2553],{"class":182},[93,3746,2550],{"class":192},[93,3748,3749],{"class":182},")width",[93,3751,3752],{"class":192},"\u002F",[93,3754,215],{"class":182},[93,3756,2550],{"class":192},[93,3758,3759],{"class":182},")height, ",[93,3761,3623],{"class":218},[93,3763,222],{"class":192},[93,3765,240],{"class":182},[93,3767,3630],{"class":218},[93,3769,222],{"class":192},[93,3771,428],{"class":182},[10,3773,3774,3775,3778,3779,3782,3783,3786,3787,3790,3791,3794,3795,3798],{},"​\t同样，",[171,3776,3777],{},"glm::perspective","所做的其实就是创建了一个定义了可视空间的大",[48,3780,3781],{},"平截头体","，任何在",[48,3784,3785],{},"这个平截头体以外的东西最后都不会出现在裁剪空间体积内","，并且",[48,3788,3789],{},"将会受到裁剪","。一个",[48,3792,3793],{},"透视平截头体可以被看作一个不均匀形状的箱子","，在这个箱子内部的",[48,3796,3797],{},"每个坐标都会被映射到裁剪空间上的一个点","。下面是一张透视平截头体的图片：",[10,3800,3801],{},[32,3802],{"alt":3803,"src":3804}," perspective_frustum",".\u002Fassets\u002Fperspective_frustum.png",[10,3806,3807,3808,3811,3812,461,3815,3818,3819,106],{},"​\t它的第一个",[48,3809,3810],{},"参数定义了fov的值，它表示的是视野(Field of View)，并且设置了观察空间的大小。如果想要一个真实的观察效果，它的值通常设置为45.0f","，但想要一个毁灭战士(DOOM,经典的系列第一人称射击游戏)风格的结果你可以将其设置一个更大的值。第二个参数设置了宽高比，由视口的宽除以高所得。第三和第四个参数设置了平截头体的",[48,3813,3814],{},"近",[48,3816,3817],{},"远","平面。",[48,3820,3821],{},"我们通常设置近距离为0.1f，而远距离设为100.0f。所有在近平面和远平面内且处于平截头体内的顶点都会被渲染",[88,3823,3824,3828],{},[10,3825,3826],{},[93,3827,95],{},[10,3829,3830,3831,3835],{},"当你把透视矩阵的 ",[3832,3833,3834],"em",{},"near"," 值设置太大时（如10.0f），OpenGL会将靠近摄像机的坐标（在0.0f和10.0f之间）都裁剪掉，这会导致一个你在游戏中很熟悉的视觉效果：在太过靠近一个物体的时候你的视线会直接穿过去。",[10,3837,3838,3839,3842,3843,3846,3847,3850,3851,3854],{},"​\t当使用正射投影时，",[48,3840,3841],{},"每一个顶点坐标都会直接映射到裁剪空间中而不经过任何精细的透视除法","（它仍然会进行透视除法，",[48,3844,3845],{},"只是w分量没有被改变（它保持为1）","，因此没有起作用）。因为正射投影没有使用透视，远处的物体不会显得更小，所以产生奇怪的视觉效果。由于这个原因，",[48,3848,3849],{},"正射投影主要用于二维渲染以及一些建筑或工程的程序","，在这些场景中我们更希望顶点不会被透视所干扰。某些如 ",[3832,3852,3853],{},"Blender"," 等进行三维建模的软件有时在建模时也会使用正射投影，因为它在各个维度下都更准确地描绘了每个物体。下面你能够看到在Blender里面使用两种投影方式的对比：",[10,3856,3857],{},[32,3858],{"alt":3859,"src":3860},"perspective_orthographic",".\u002Fassets\u002Fperspective_orthographic.png",[10,3862,3863,3864,3867,3868,106],{},"你可以看到，使用",[48,3865,3866],{},"透视投影的话，远处的顶点看起来比较小","，而在",[48,3869,3870],{},"正射投影中每个顶点距离观察者的距离都是一样的",[64,3872,3873],{"id":3873},"把它们都组合到一起",[10,3875,3876],{},"​\t我们为上述的每一个步骤都创建了一个变换矩阵：模型矩阵、观察矩阵和投影矩阵。一个顶点坐标将会根据以下过程被变换到裁剪坐标：",[10,3878,3879],{},[32,3880],{"alt":3881,"src":3882},"image-20251010035151109",".\u002Fassets\u002Fimage-20251010035151109.png",[10,3884,3885],{},"​\t注意矩阵运算的顺序是相反的（记住我们需要从右往左阅读矩阵的乘法）。最后的顶点应该被赋值到顶点着色器中的gl_Position，OpenGL将会自动进行透视除法和裁剪。",[88,3887,3888,3893,3898],{},[10,3889,3890],{},[93,3891,3892],{},"!TIP",[10,3894,3895],{},[48,3896,3897],{},"然后呢？",[10,3899,3900,3901,3904,3905,3908,3909,3912,3913,3916,3917,3920,3921,3924],{},"顶点着色器的",[48,3902,3903],{},"输出要求所有的顶点都在裁剪空间内","，这正是我们",[48,3906,3907],{},"刚才使用变换矩阵所做的","。OpenGL然后对",[48,3910,3911],{},"裁剪坐标","执行",[48,3914,3915],{},"透视除法","从而将它们变换到",[48,3918,3919],{},"标准化设备坐标","。OpenGL会使用glViewPort内部的参数来将标准化设备坐标映射到",[48,3922,3923],{},"屏幕坐标","，每个坐标都关联了一个屏幕上的点（在我们的例子中是一个800x600的屏幕）。这个过程称为视口变换。",[10,3926,3927],{},"​\t这一章的主题可能会比较难理解，如果你仍然不确定每个空间的作用的话，你也不必太担心。接下来你会看到我们是怎样运用这些坐标空间的，而且之后也会有足够多的例子。",[20,3929,3931],{"id":3930},"进入3d","进入3D",[10,3933,3934,3935,106],{},"​\t既然我们知道了",[48,3936,3937],{},"如何将3D坐标变换为2D坐标，我们可以开始使用真正的3D物体，而不是枯燥的2D平面了",[10,3939,3940,3941,3944],{},"​\t在开始进行3D绘图时，我们首先创建一个模型矩阵。这个模型矩阵包含了位移、缩放与旋转操作，它们会被应用到所有物体的顶点上，以",[48,3942,3943],{},"变换","它们到全局的世界空间。让我们变换一下我们的平面，将其绕着x轴旋转，使它看起来像放在地上一样。这个模型矩阵看起来是这样的：",[164,3946,3948],{"className":166,"code":3947,"language":168,"meta":169,"style":169},"glm::mat4 model;\nmodel = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));\n",[171,3949,3950,3957],{"__ignoreMap":169},[93,3951,3952,3954],{"class":175,"line":176},[93,3953,115],{"class":179},[93,3955,3956],{"class":182},"::mat4 model;\n",[93,3958,3959,3962,3964,3966,3968,3970,3973,3975,3977,3979,3981,3983,3986,3988,3990,3992,3994,3996,3998,4000,4002,4004,4006,4008,4010,4012,4014],{"class":175,"line":186},[93,3960,3961],{"class":182},"model ",[93,3963,193],{"class":192},[93,3965,196],{"class":179},[93,3967,199],{"class":182},[93,3969,202],{"class":179},[93,3971,3972],{"class":182},"(model, ",[93,3974,115],{"class":179},[93,3976,199],{"class":182},[93,3978,212],{"class":179},[93,3980,215],{"class":182},[93,3982,1778],{"class":192},[93,3984,3985],{"class":218},"55.0",[93,3987,222],{"class":192},[93,3989,225],{"class":182},[93,3991,115],{"class":179},[93,3993,199],{"class":182},[93,3995,232],{"class":179},[93,3997,215],{"class":182},[93,3999,247],{"class":218},[93,4001,222],{"class":192},[93,4003,240],{"class":182},[93,4005,237],{"class":218},[93,4007,222],{"class":192},[93,4009,240],{"class":182},[93,4011,237],{"class":218},[93,4013,222],{"class":192},[93,4015,250],{"class":182},[10,4017,4018,4019,4022,4023,106],{},"​\t这条语句使用 GLM 库（或类似的数学库）执行了一个变换，其核心作用是将物体的",[48,4020,4021],{},"局部坐标 (Local Space)"," 变换到 ",[48,4024,4025],{},"世界坐标 (World Space)",[10,4027,4028,4029,3578],{},"具体来说，它执行的是一个",[48,4030,4031],{},"旋转操作",[3388,4033,4034,4076,4112],{},[3391,4035,4036,4042,4043,4046,4047,4049,4050],{},[48,4037,4038,4039,2559],{},"目标矩阵 (",[171,4040,4041],{},"model",": ",[171,4044,4045],{},"rotate()"," 函数对传入的 ",[171,4048,4041],{}," 矩阵进行修改（或返回一个新的矩阵）。\n",[3533,4051,4052],{},[3391,4053,4054,4057,4058,4060,4061,4067,4068,4071,4072,4075],{},[48,4055,4056],{},"注意："," 在这行代码之前，",[171,4059,4041],{}," 矩阵应该已经被初始化为",[48,4062,4063,4064,2559],{},"单位矩阵 (",[171,4065,4066],{},"mat4(1.0f)","，或者已经包含了之前执行的",[48,4069,4070],{},"位移 (Translate)"," 和",[48,4073,4074],{},"缩放 (Scale)"," 变换。",[3391,4077,4078,4084,4085],{},[48,4079,4080,4081,2559],{},"旋转角度 (",[171,4082,4083],{},"radians(-55.0f)",":\n",[3533,4086,4087,4090,4100],{},[3391,4088,4089],{},"角度是 55.0 度。",[3391,4091,4092,4093,4095,4096,4099],{},"GLM 的 ",[171,4094,202],{}," 函数接受弧度制，所以需要使用 ",[171,4097,4098],{},"glm::radians()"," 函数将 −55 度转换为弧度。",[3391,4101,4102,4107,4108,4111],{},[48,4103,4104,4105,2559],{},"负号 (",[171,4106,1778],{}," 表示",[48,4109,4110],{},"顺时针","旋转。",[3391,4113,4114,4084,4120],{},[48,4115,4116,4117,2559],{},"旋转轴 (",[171,4118,4119],{},"vec3(1.0f, 0.0f, 0.0f)",[3533,4121,4122],{},[3391,4123,4124,4125,4128],{},"旋转将围绕 ",[48,4126,4127],{},"X 轴","进行。",[10,4130,4131,4132,4135],{},"​\t最后我们需要做的是",[48,4133,4134],{},"定义一个投影矩阵。我们希望在场景中使用透视投影","，所以像这样声明一个投影矩阵：",[164,4137,4139],{"className":166,"code":4138,"language":168,"meta":169,"style":169},"glm::mat4 projection;\nprojection = glm::perspective(glm::radians(45.0f), screenWidth \u002F screenHeight, 0.1f, 100.0f);\n",[171,4140,4141,4148],{"__ignoreMap":169},[93,4142,4143,4145],{"class":175,"line":176},[93,4144,115],{"class":179},[93,4146,4147],{"class":182},"::mat4 projection;\n",[93,4149,4150,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175,4178,4180,4183,4185,4187,4189,4191,4193],{"class":175,"line":186},[93,4151,4152],{"class":182},"projection ",[93,4154,193],{"class":192},[93,4156,196],{"class":179},[93,4158,199],{"class":182},[93,4160,3671],{"class":179},[93,4162,215],{"class":182},[93,4164,115],{"class":179},[93,4166,199],{"class":182},[93,4168,212],{"class":179},[93,4170,215],{"class":182},[93,4172,3740],{"class":218},[93,4174,222],{"class":192},[93,4176,4177],{"class":182},"), screenWidth ",[93,4179,3752],{"class":192},[93,4181,4182],{"class":182}," screenHeight, ",[93,4184,3623],{"class":218},[93,4186,222],{"class":192},[93,4188,240],{"class":182},[93,4190,3630],{"class":218},[93,4192,222],{"class":192},[93,4194,428],{"class":182},[10,4196,4197,4198,3578],{},"​\t既然我们已经创建了变换矩阵，",[48,4199,4200],{},"我们应该将它们传入着色器。首先，让我们在顶点着色器中声明一个uniform变换矩阵然后将它乘以顶点坐标",[164,4202,4204],{"className":166,"code":4203,"language":168,"meta":169,"style":169},"#version 330 core\nlayout (location = 0) in vec3 aPos;\n...\nuniform mat4 model;\nuniform mat4 view;\nuniform mat4 projection;\n\nvoid main()\n{\n    \u002F\u002F 注意乘法要从右向左读\n    gl_Position = projection * view * model * vec4(aPos, 1.0);\n    ...\n}\n",[171,4205,4206,4214,4226,4231,4236,4241,4246,4250,4258,4262,4267,4296,4301],{"__ignoreMap":169},[93,4207,4208,4210,4212],{"class":175,"line":176},[93,4209,318],{"class":182},[93,4211,321],{"class":218},[93,4213,324],{"class":182},[93,4215,4216,4218,4220,4222,4224],{"class":175,"line":186},[93,4217,329],{"class":179},[93,4219,332],{"class":182},[93,4221,193],{"class":192},[93,4223,337],{"class":218},[93,4225,340],{"class":182},[93,4227,4228],{"class":175,"line":253},[93,4229,4230],{"class":182},"...\n",[93,4232,4233],{"class":175,"line":357},[93,4234,4235],{"class":182},"uniform mat4 model;\n",[93,4237,4238],{"class":175,"line":364},[93,4239,4240],{"class":182},"uniform mat4 view;\n",[93,4242,4243],{"class":175,"line":370},[93,4244,4245],{"class":182},"uniform mat4 projection;\n",[93,4247,4248],{"class":175,"line":375},[93,4249,361],{"emptyLinePlaceholder":360},[93,4251,4252,4254,4256],{"class":175,"line":381},[93,4253,389],{"class":192},[93,4255,392],{"class":179},[93,4257,395],{"class":182},[93,4259,4260],{"class":175,"line":386},[93,4261,401],{"class":182},[93,4263,4264],{"class":175,"line":398},[93,4265,4266],{"class":671},"    \u002F\u002F 注意乘法要从右向左读\n",[93,4268,4269,4271,4273,4276,4278,4281,4283,4286,4288,4290,4292,4294],{"class":175,"line":404},[93,4270,407],{"class":182},[93,4272,193],{"class":192},[93,4274,4275],{"class":182}," projection ",[93,4277,415],{"class":192},[93,4279,4280],{"class":182}," view ",[93,4282,415],{"class":192},[93,4284,4285],{"class":182}," model ",[93,4287,415],{"class":192},[93,4289,418],{"class":179},[93,4291,421],{"class":182},[93,4293,247],{"class":218},[93,4295,428],{"class":182},[93,4297,4298],{"class":175,"line":431},[93,4299,4300],{"class":182},"    ...\n",[93,4302,4303],{"class":175,"line":445},[93,4304,448],{"class":182},[10,4306,4307,4308,4311,4312,4315],{},"​\t我们还应该",[48,4309,4310],{},"将矩阵传入着色器","（这通常在",[48,4313,4314],{},"每次的渲染迭代中进行，因为变换矩阵会经常变动","）：",[164,4317,4319],{"className":166,"code":4318,"language":168,"meta":169,"style":169},"int modelLoc = glGetUniformLocation(ourShader.ID, \"model\");\nglUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));\n... \u002F\u002F 观察矩阵和投影矩阵与之类似\n",[171,4320,4321,4339,4359],{"__ignoreMap":169},[93,4322,4323,4325,4328,4330,4332,4334,4337],{"class":175,"line":176},[93,4324,696],{"class":192},[93,4326,4327],{"class":182}," modelLoc ",[93,4329,193],{"class":192},[93,4331,497],{"class":179},[93,4333,500],{"class":182},[93,4335,4336],{"class":503},"\"model\"",[93,4338,428],{"class":182},[93,4340,4341,4343,4346,4348,4350,4352,4354,4356],{"class":175,"line":186},[93,4342,511],{"class":179},[93,4344,4345],{"class":182},"(modelLoc, ",[93,4347,517],{"class":218},[93,4349,520],{"class":182},[93,4351,115],{"class":179},[93,4353,199],{"class":182},[93,4355,527],{"class":179},[93,4357,4358],{"class":182},"(model));\n",[93,4360,4361,4364],{"class":175,"line":253},[93,4362,4363],{"class":182},"...",[93,4365,4366],{"class":671}," \u002F\u002F 观察矩阵和投影矩阵与之类似\n",[10,4368,4369],{},"我们的顶点坐标已经使用模型、观察和投影矩阵进行变换了，最终的物体应该会：",[3533,4371,4372,4375,4378],{},[3391,4373,4374],{},"稍微向后倾斜至地板方向。",[3391,4376,4377],{},"离我们有一些距离。",[3391,4379,4380],{},"有透视效果（顶点越远，变得越小）。",[10,4382,4383],{},"让我们检查一下结果是否满足这些要求：",[10,4385,4386],{},[32,4387],{"alt":4388,"src":4389},"coordinate_systems_result",".\u002Fassets\u002Fcoordinate_systems_result.png",[10,4391,4392],{},"我的完整代码：",[164,4394,4396],{"className":166,"code":4395,"language":168,"meta":169,"style":169},"#include \u003Cglad\u002Fglad.h>\n#include \u003CGLFW\u002Fglfw3.h>\n#include \u003Copencv4\u002Fopencv2\u002Fopencv.hpp>\n#include \u003Ciostream>\n#include \u003Ccmath>\n#include \u003Cfilesystem>\n#include \"utils\u002Fshader.h\"\n#include \"utils\u002FglmCompute.h\"\n#include \"utils\u002Flogger.h\"\n\nusing namespace cv;\nusing namespace glm;\n\n\u002F\u002F 窗口大小改变时的回调函数\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height) {\n    glViewport(0, 0, width, height);\n}\n\nstd::string getCurrentWorkingDirectory() {\n    namespace fs = std::filesystem;\n    try {\n        \u002F\u002F current_path() 返回当前工作目录\n        return fs::current_path().string();\n    } catch (const fs::filesystem_error& e) {\n        std::cerr \u003C\u003C \"Filesystem Error: \" \u003C\u003C e.what() \u003C\u003C std::endl;\n        return \"\";\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 view = mat4(1.0f);\n    view = translate(view, vec3(0.0f, 0.0f, -3.0f));\n\n    \u002F\u002F 投影矩阵\n    mat4 projection = perspective(radians(45.0f), (float)800 \u002F (float)600, 0.1f, 100.0f);\n\n    auto path = getCurrentWorkingDirectory().append(\"\u002FAssets\u002Fimage.png\");\n    auto path2 = getCurrentWorkingDirectory().append(\"\u002FAssets\u002Fimage2.png\");\n    cv::Mat image = cv::imread(path);\n    cv::Mat image2 = cv::imread(path2);\n    cv::flip(image2, image2, 0);\n    cv::cvtColor(image, image, cv::COLOR_BGR2RGB);\n    cv::cvtColor(image2, image2, cv::COLOR_BGR2RGB);\n\n    \u002F\u002F 转换为字节数组\n    std::vector\u003Cuchar> imageData;\n    std::vector\u003Cuchar> imageData2;\n    if (image.empty()) {\n        std::cerr \u003C\u003C \"Could not read the image: \" \u003C\u003C path \u003C\u003C std::endl;\n        return 1;\n    }\n    if (image2.empty()) {\n        std::cerr \u003C\u003C \"Could not read the image2: \" \u003C\u003C path2 \u003C\u003C std::endl;\n        return 1;\n    }\n    \n    std::cout \u003C\u003C \"Image 1 loaded: \" \u003C\u003C image.cols \u003C\u003C \"x\" \u003C\u003C image.rows \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"Image 2 loaded: \" \u003C\u003C image2.cols \u003C\u003C \"x\" \u003C\u003C image2.rows \u003C\u003C std::endl;\n\n    cv::imencode(\".png\", image, imageData);\n    cv::imencode(\".png\", image2, imageData2);\n\n\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 创建窗口\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 初始化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    float vertices[] = {\n    \u002F\u002F     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -\n        0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   \u002F\u002F 右上\n        0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   \u002F\u002F 右下\n        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   \u002F\u002F 左下\n        -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f    \u002F\u002F 左上\n    };\n    \n    unsigned int indices[] = {\n        0, 1, 3, \u002F\u002F 第一个三角形\n        1, 2, 3  \u002F\u002F 第二个三角形\n    };\n\n    \u002F\u002F 纹理\n    unsigned int texture;\n    unsigned int texture2;\n    glGenTextures(1, &texture); \u002F\u002F 生成纹理\n    glGenTextures(1, &texture2); \u002F\u002F 生成纹理\n    \n    \u002F\u002F 配置第一个纹理\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, texture); \u002F\u002F 绑定纹理\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.cols, image.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image.data); \u002F\u002F 设置纹理数据\n    glGenerateMipmap(GL_TEXTURE_2D); \u002F\u002F 生成mipmap\n\n    \u002F\u002F 配置第二个纹理\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, texture2); \u002F\u002F 绑定纹理\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); \u002F\u002F 设置纹理环绕方式   \n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image2.cols, image2.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image2.data); \u002F\u002F 设置纹理数据\n    glGenerateMipmap(GL_TEXTURE_2D); \u002F\u002F 生成mipmap\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    \u002F\u002F 创建EBO\n    unsigned int EBO;\n    glGenBuffers(1, &EBO);\n    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); \u002F\u002F 绑定EBO\n    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, 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);\n    \n    \u002F\u002F 纹理属性\n    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));\n    glEnableVertexAttribArray(2);\n\n    \u002F\u002F 构建并编译着色器程序\n    Shader ourShader(\"shader\u002Fcustom.vert\", \"shader\u002Ffragment.vert\");\n\n    \u002F\u002F 渲染循环\n    while (!glfwWindowShouldClose(window)) {\n        \u002F\u002F 处理输入\n        glfwPollEvents();\n        \n        \u002F\u002F 渲染指令\n        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);\n        glClear(GL_COLOR_BUFFER_BIT);\n        \n        \u002F\u002F 使用着色器程序\n        ourShader.use();\n\n        int modelLoc = glGetUniformLocation(ourShader.ID, \"model\");\n        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));\n\n        int viewLoc = glGetUniformLocation(ourShader.ID, \"view\");\n        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));\n\n        int projectionLoc = glGetUniformLocation(ourShader.ID, \"projection\");\n        glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));\n        \n        ourShader.setInt(\"ourTexture\", 0);\n        ourShader.setInt(\"ourTexture2\", 1);\n        \n        glBindVertexArray(VAO);\n        \n        \u002F\u002F 绘制矩形（使用EBO）\n        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);\n        \n        \u002F\u002F 交换缓冲区和检查IO事件\n        glfwSwapBuffers(window);\n    }\n\n    \u002F\u002F 清理资源\n    glDeleteVertexArrays(1, &VAO);\n    glDeleteBuffers(1, &VBO);\n    glDeleteBuffers(1, &EBO);\n    glDeleteTextures(1, &texture);\n    glDeleteTextures(1, &texture2);\n    glfwTerminate();\n    return 0;\n}\n",[171,4397,4398,4404,4410,4416,4422,4428,4434,4440,4446,4452,4456,4466,4476,4480,4484,4512,4526,4530,4534,4546,4562,4568,4572,4588,4606,4630,4638,4642,4646,4650,4658,4662,4667,4685,4730,4734,4739,4757,4795,4799,4804,4858,4862,4882,4902,4922,4942,4956,4970,4984,4988,4992,5006,5020,5030,5050,5058,5062,5072,5092,5100,5104,5108,5136,5164,5168,5182,5196,5200,5204,5208,5212,5218,5228,5238,5244,5248,5252,5286,5298,5314,5320,5330,5334,5338,5344,5350,5354,5358,5370,5386,5396,5400,5404,5414,5418,5470,5524,5580,5632,5636,5640,5652,5668,5682,5686,5690,5694,5702,5710,5726,5742,5746,5750,5756,5764,5772,5780,5788,5796,5812,5820,5824,5828,5834,5842,5850,5858,5866,5874,5890,5898,5902,5906,5910,5918,5932,5940,5944,5948,5956,5970,5978,5988,5992,5996,6004,6018,6026,6036,6040,6046,6056,6076,6080,6084,6118,6130,6134,6138,6180,6190,6194,6198,6240,6250,6254,6258,6274,6278,6282,6294,6298,6304,6308,6312,6342,6348,6352,6356,6364,6368,6385,6403,6407,6425,6445,6449,6467,6487,6491,6507,6523,6527,6533,6537,6541,6555,6559,6563,6569,6573,6577,6581,6595,6609,6623,6637,6651,6657,6665],{"__ignoreMap":169},[93,4399,4400,4402],{"class":175,"line":176},[93,4401,574],{"class":192},[93,4403,577],{"class":503},[93,4405,4406,4408],{"class":175,"line":186},[93,4407,574],{"class":192},[93,4409,584],{"class":503},[93,4411,4412,4414],{"class":175,"line":253},[93,4413,574],{"class":192},[93,4415,591],{"class":503},[93,4417,4418,4420],{"class":175,"line":357},[93,4419,574],{"class":192},[93,4421,598],{"class":503},[93,4423,4424,4426],{"class":175,"line":364},[93,4425,574],{"class":192},[93,4427,605],{"class":503},[93,4429,4430,4432],{"class":175,"line":370},[93,4431,574],{"class":192},[93,4433,612],{"class":503},[93,4435,4436,4438],{"class":175,"line":375},[93,4437,574],{"class":192},[93,4439,619],{"class":503},[93,4441,4442,4444],{"class":175,"line":381},[93,4443,574],{"class":192},[93,4445,626],{"class":503},[93,4447,4448,4450],{"class":175,"line":386},[93,4449,574],{"class":192},[93,4451,633],{"class":503},[93,4453,4454],{"class":175,"line":398},[93,4455,361],{"emptyLinePlaceholder":360},[93,4457,4458,4460,4462,4464],{"class":175,"line":404},[93,4459,642],{"class":192},[93,4461,645],{"class":192},[93,4463,648],{"class":179},[93,4465,651],{"class":182},[93,4467,4468,4470,4472,4474],{"class":175,"line":431},[93,4469,642],{"class":192},[93,4471,645],{"class":192},[93,4473,196],{"class":179},[93,4475,651],{"class":182},[93,4477,4478],{"class":175,"line":445},[93,4479,361],{"emptyLinePlaceholder":360},[93,4481,4482],{"class":175,"line":668},[93,4483,672],{"class":671},[93,4485,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510],{"class":175,"line":675},[93,4487,389],{"class":192},[93,4489,680],{"class":179},[93,4491,215],{"class":182},[93,4493,685],{"class":179},[93,4495,415],{"class":192},[93,4497,691],{"class":690},[93,4499,240],{"class":182},[93,4501,696],{"class":192},[93,4503,699],{"class":690},[93,4505,240],{"class":182},[93,4507,696],{"class":192},[93,4509,706],{"class":690},[93,4511,709],{"class":182},[93,4513,4514,4516,4518,4520,4522,4524],{"class":175,"line":712},[93,4515,715],{"class":179},[93,4517,215],{"class":182},[93,4519,720],{"class":218},[93,4521,240],{"class":182},[93,4523,720],{"class":218},[93,4525,727],{"class":182},[93,4527,4528],{"class":175,"line":730},[93,4529,448],{"class":182},[93,4531,4532],{"class":175,"line":735},[93,4533,361],{"emptyLinePlaceholder":360},[93,4535,4536,4538,4540,4542,4544],{"class":175,"line":740},[93,4537,743],{"class":179},[93,4539,199],{"class":182},[93,4541,748],{"class":179},[93,4543,751],{"class":179},[93,4545,754],{"class":182},[93,4547,4548,4550,4552,4554,4556,4558,4560],{"class":175,"line":757},[93,4549,760],{"class":192},[93,4551,763],{"class":179},[93,4553,766],{"class":192},[93,4555,769],{"class":179},[93,4557,199],{"class":182},[93,4559,774],{"class":179},[93,4561,651],{"class":182},[93,4563,4564,4566],{"class":175,"line":779},[93,4565,782],{"class":192},[93,4567,785],{"class":182},[93,4569,4570],{"class":175,"line":788},[93,4571,791],{"class":671},[93,4573,4574,4576,4578,4580,4582,4584,4586],{"class":175,"line":794},[93,4575,797],{"class":192},[93,4577,763],{"class":179},[93,4579,199],{"class":182},[93,4581,804],{"class":179},[93,4583,807],{"class":182},[93,4585,748],{"class":179},[93,4587,812],{"class":182},[93,4589,4590,4592,4594,4596,4598,4600,4602,4604],{"class":175,"line":815},[93,4591,818],{"class":182},[93,4593,821],{"class":192},[93,4595,824],{"class":182},[93,4597,827],{"class":192},[93,4599,763],{"class":179},[93,4601,832],{"class":182},[93,4603,835],{"class":192},[93,4605,838],{"class":182},[93,4607,4608,4610,4612,4614,4616,4618,4620,4622,4624,4626,4628],{"class":175,"line":841},[93,4609,844],{"class":179},[93,4611,847],{"class":182},[93,4613,850],{"class":192},[93,4615,853],{"class":503},[93,4617,856],{"class":192},[93,4619,859],{"class":182},[93,4621,862],{"class":179},[93,4623,865],{"class":182},[93,4625,850],{"class":192},[93,4627,769],{"class":179},[93,4629,872],{"class":182},[93,4631,4632,4634,4636],{"class":175,"line":875},[93,4633,797],{"class":192},[93,4635,880],{"class":503},[93,4637,651],{"class":182},[93,4639,4640],{"class":175,"line":885},[93,4641,888],{"class":182},[93,4643,4644],{"class":175,"line":891},[93,4645,448],{"class":182},[93,4647,4648],{"class":175,"line":896},[93,4649,361],{"emptyLinePlaceholder":360},[93,4651,4652,4654,4656],{"class":175,"line":901},[93,4653,696],{"class":192},[93,4655,392],{"class":179},[93,4657,754],{"class":182},[93,4659,4660],{"class":175,"line":910},[93,4661,361],{"emptyLinePlaceholder":360},[93,4663,4664],{"class":175,"line":932},[93,4665,4666],{"class":671},"    \u002F\u002F 模型矩阵\n",[93,4668,4669,4671,4673,4675,4677,4679,4681,4683],{"class":175,"line":971},[93,4670,913],{"class":179},[93,4672,4285],{"class":182},[93,4674,193],{"class":192},[93,4676,921],{"class":179},[93,4678,215],{"class":182},[93,4680,247],{"class":218},[93,4682,222],{"class":192},[93,4684,428],{"class":182},[93,4686,4687,4690,4692,4694,4696,4698,4700,4702,4704,4706,4708,4710,4712,4714,4716,4718,4720,4722,4724,4726,4728],{"class":175,"line":1018},[93,4688,4689],{"class":182},"    model ",[93,4691,193],{"class":192},[93,4693,978],{"class":179},[93,4695,3972],{"class":182},[93,4697,212],{"class":179},[93,4699,215],{"class":182},[93,4701,1778],{"class":192},[93,4703,3985],{"class":218},[93,4705,222],{"class":192},[93,4707,225],{"class":182},[93,4709,232],{"class":179},[93,4711,215],{"class":182},[93,4713,247],{"class":218},[93,4715,222],{"class":192},[93,4717,240],{"class":182},[93,4719,237],{"class":218},[93,4721,222],{"class":192},[93,4723,240],{"class":182},[93,4725,237],{"class":218},[93,4727,222],{"class":192},[93,4729,250],{"class":182},[93,4731,4732],{"class":175,"line":1023},[93,4733,361],{"emptyLinePlaceholder":360},[93,4735,4736],{"class":175,"line":1048},[93,4737,4738],{"class":671},"    \u002F\u002F 视点矩阵\n",[93,4740,4741,4743,4745,4747,4749,4751,4753,4755],{"class":175,"line":1071},[93,4742,913],{"class":179},[93,4744,4280],{"class":182},[93,4746,193],{"class":192},[93,4748,921],{"class":179},[93,4750,215],{"class":182},[93,4752,247],{"class":218},[93,4754,222],{"class":192},[93,4756,428],{"class":182},[93,4758,4759,4762,4764,4767,4770,4772,4774,4776,4778,4780,4782,4784,4786,4788,4791,4793],{"class":175,"line":1097},[93,4760,4761],{"class":182},"    view ",[93,4763,193],{"class":192},[93,4765,4766],{"class":179}," translate",[93,4768,4769],{"class":182},"(view, ",[93,4771,232],{"class":179},[93,4773,215],{"class":182},[93,4775,237],{"class":218},[93,4777,222],{"class":192},[93,4779,240],{"class":182},[93,4781,237],{"class":218},[93,4783,222],{"class":192},[93,4785,240],{"class":182},[93,4787,1778],{"class":192},[93,4789,4790],{"class":218},"3.0",[93,4792,222],{"class":192},[93,4794,250],{"class":182},[93,4796,4797],{"class":175,"line":1120},[93,4798,361],{"emptyLinePlaceholder":360},[93,4800,4801],{"class":175,"line":1137},[93,4802,4803],{"class":671},"    \u002F\u002F 投影矩阵\n",[93,4805,4806,4808,4810,4812,4815,4817,4819,4821,4823,4825,4827,4829,4831,4833,4836,4838,4840,4842,4844,4846,4848,4850,4852,4854,4856],{"class":175,"line":1156},[93,4807,913],{"class":179},[93,4809,4275],{"class":182},[93,4811,193],{"class":192},[93,4813,4814],{"class":179}," perspective",[93,4816,215],{"class":182},[93,4818,212],{"class":179},[93,4820,215],{"class":182},[93,4822,3740],{"class":218},[93,4824,222],{"class":192},[93,4826,2553],{"class":182},[93,4828,2550],{"class":192},[93,4830,2559],{"class":182},[93,4832,1520],{"class":218},[93,4834,4835],{"class":192}," \u002F",[93,4837,824],{"class":182},[93,4839,2550],{"class":192},[93,4841,2559],{"class":182},[93,4843,1525],{"class":218},[93,4845,240],{"class":182},[93,4847,3623],{"class":218},[93,4849,222],{"class":192},[93,4851,240],{"class":182},[93,4853,3630],{"class":218},[93,4855,222],{"class":192},[93,4857,428],{"class":182},[93,4859,4860],{"class":175,"line":1171},[93,4861,361],{"emptyLinePlaceholder":360},[93,4863,4864,4866,4868,4870,4872,4874,4876,4878,4880],{"class":175,"line":1176},[93,4865,1026],{"class":192},[93,4867,1029],{"class":182},[93,4869,193],{"class":192},[93,4871,751],{"class":179},[93,4873,807],{"class":182},[93,4875,1038],{"class":179},[93,4877,215],{"class":182},[93,4879,1043],{"class":503},[93,4881,428],{"class":182},[93,4883,4884,4886,4888,4890,4892,4894,4896,4898,4900],{"class":175,"line":1182},[93,4885,1026],{"class":192},[93,4887,1053],{"class":182},[93,4889,193],{"class":192},[93,4891,751],{"class":179},[93,4893,807],{"class":182},[93,4895,1038],{"class":179},[93,4897,215],{"class":182},[93,4899,1066],{"class":503},[93,4901,428],{"class":182},[93,4903,4904,4906,4908,4910,4912,4914,4916,4918,4920],{"class":175,"line":1202},[93,4905,1074],{"class":179},[93,4907,199],{"class":182},[93,4909,1079],{"class":179},[93,4911,1082],{"class":182},[93,4913,193],{"class":192},[93,4915,648],{"class":179},[93,4917,199],{"class":182},[93,4919,1091],{"class":179},[93,4921,1094],{"class":182},[93,4923,4924,4926,4928,4930,4932,4934,4936,4938,4940],{"class":175,"line":1218},[93,4925,1074],{"class":179},[93,4927,199],{"class":182},[93,4929,1079],{"class":179},[93,4931,1106],{"class":182},[93,4933,193],{"class":192},[93,4935,648],{"class":179},[93,4937,199],{"class":182},[93,4939,1091],{"class":179},[93,4941,1117],{"class":182},[93,4943,4944,4946,4948,4950,4952,4954],{"class":175,"line":1233},[93,4945,1074],{"class":179},[93,4947,199],{"class":182},[93,4949,1127],{"class":179},[93,4951,1130],{"class":182},[93,4953,720],{"class":218},[93,4955,428],{"class":182},[93,4957,4958,4960,4962,4964,4966,4968],{"class":175,"line":1255},[93,4959,1074],{"class":179},[93,4961,199],{"class":182},[93,4963,1144],{"class":179},[93,4965,1147],{"class":182},[93,4967,1150],{"class":179},[93,4969,1153],{"class":182},[93,4971,4972,4974,4976,4978,4980,4982],{"class":175,"line":1264},[93,4973,1074],{"class":179},[93,4975,199],{"class":182},[93,4977,1144],{"class":179},[93,4979,1130],{"class":182},[93,4981,1150],{"class":179},[93,4983,1153],{"class":182},[93,4985,4986],{"class":175,"line":1269},[93,4987,361],{"emptyLinePlaceholder":360},[93,4989,4990],{"class":175,"line":1281},[93,4991,1179],{"class":671},[93,4993,4994,4996,4998,5000,5002,5004],{"class":175,"line":1303},[93,4995,1185],{"class":179},[93,4997,199],{"class":182},[93,4999,1190],{"class":179},[93,5001,1193],{"class":182},[93,5003,1196],{"class":179},[93,5005,1199],{"class":182},[93,5007,5008,5010,5012,5014,5016,5018],{"class":175,"line":1312},[93,5009,1185],{"class":179},[93,5011,199],{"class":182},[93,5013,1190],{"class":179},[93,5015,1193],{"class":182},[93,5017,1196],{"class":179},[93,5019,1215],{"class":182},[93,5021,5022,5024,5026,5028],{"class":175,"line":1317},[93,5023,1221],{"class":192},[93,5025,1224],{"class":182},[93,5027,1227],{"class":179},[93,5029,1230],{"class":182},[93,5031,5032,5034,5036,5038,5040,5042,5044,5046,5048],{"class":175,"line":1323},[93,5033,844],{"class":179},[93,5035,847],{"class":182},[93,5037,850],{"class":192},[93,5039,1242],{"class":503},[93,5041,856],{"class":192},[93,5043,1029],{"class":182},[93,5045,850],{"class":192},[93,5047,769],{"class":179},[93,5049,872],{"class":182},[93,5051,5052,5054,5056],{"class":175,"line":1357},[93,5053,797],{"class":192},[93,5055,351],{"class":218},[93,5057,651],{"class":182},[93,5059,5060],{"class":175,"line":1389},[93,5061,888],{"class":182},[93,5063,5064,5066,5068,5070],{"class":175,"line":1394},[93,5065,1221],{"class":192},[93,5067,1274],{"class":182},[93,5069,1227],{"class":179},[93,5071,1230],{"class":182},[93,5073,5074,5076,5078,5080,5082,5084,5086,5088,5090],{"class":175,"line":1412},[93,5075,844],{"class":179},[93,5077,847],{"class":182},[93,5079,850],{"class":192},[93,5081,1290],{"class":503},[93,5083,856],{"class":192},[93,5085,1053],{"class":182},[93,5087,850],{"class":192},[93,5089,769],{"class":179},[93,5091,872],{"class":182},[93,5093,5094,5096,5098],{"class":175,"line":1428},[93,5095,797],{"class":192},[93,5097,351],{"class":218},[93,5099,651],{"class":182},[93,5101,5102],{"class":175,"line":1433},[93,5103,888],{"class":182},[93,5105,5106],{"class":175,"line":1438},[93,5107,1320],{"class":182},[93,5109,5110,5112,5114,5116,5118,5120,5122,5124,5126,5128,5130,5132,5134],{"class":175,"line":1443},[93,5111,1185],{"class":179},[93,5113,1328],{"class":182},[93,5115,850],{"class":192},[93,5117,1333],{"class":503},[93,5119,856],{"class":192},[93,5121,1338],{"class":182},[93,5123,850],{"class":192},[93,5125,1343],{"class":503},[93,5127,856],{"class":192},[93,5129,1348],{"class":182},[93,5131,850],{"class":192},[93,5133,769],{"class":179},[93,5135,872],{"class":182},[93,5137,5138,5140,5142,5144,5146,5148,5150,5152,5154,5156,5158,5160,5162],{"class":175,"line":1449},[93,5139,1185],{"class":179},[93,5141,1328],{"class":182},[93,5143,850],{"class":192},[93,5145,1366],{"class":503},[93,5147,856],{"class":192},[93,5149,1371],{"class":182},[93,5151,850],{"class":192},[93,5153,1343],{"class":503},[93,5155,856],{"class":192},[93,5157,1380],{"class":182},[93,5159,850],{"class":192},[93,5161,769],{"class":179},[93,5163,872],{"class":182},[93,5165,5166],{"class":175,"line":1457},[93,5167,361],{"emptyLinePlaceholder":360},[93,5169,5170,5172,5174,5176,5178,5180],{"class":175,"line":1471},[93,5171,1074],{"class":179},[93,5173,199],{"class":182},[93,5175,1401],{"class":179},[93,5177,215],{"class":182},[93,5179,1406],{"class":503},[93,5181,1409],{"class":182},[93,5183,5184,5186,5188,5190,5192,5194],{"class":175,"line":1483},[93,5185,1074],{"class":179},[93,5187,199],{"class":182},[93,5189,1401],{"class":179},[93,5191,215],{"class":182},[93,5193,1406],{"class":503},[93,5195,1425],{"class":182},[93,5197,5198],{"class":175,"line":1491},[93,5199,361],{"emptyLinePlaceholder":360},[93,5201,5202],{"class":175,"line":1496},[93,5203,361],{"emptyLinePlaceholder":360},[93,5205,5206],{"class":175,"line":1502},[93,5207,1320],{"class":182},[93,5209,5210],{"class":175,"line":1544},[93,5211,1446],{"class":671},[93,5213,5214,5216],{"class":175,"line":1560},[93,5215,1452],{"class":179},[93,5217,812],{"class":182},[93,5219,5220,5222,5224,5226],{"class":175,"line":1578},[93,5221,1460],{"class":179},[93,5223,1463],{"class":182},[93,5225,1466],{"class":218},[93,5227,428],{"class":182},[93,5229,5230,5232,5234,5236],{"class":175,"line":1586},[93,5231,1460],{"class":179},[93,5233,1476],{"class":182},[93,5235,1466],{"class":218},[93,5237,428],{"class":182},[93,5239,5240,5242],{"class":175,"line":1598},[93,5241,1460],{"class":179},[93,5243,1488],{"class":182},[93,5245,5246],{"class":175,"line":1603},[93,5247,361],{"emptyLinePlaceholder":360},[93,5249,5250],{"class":175,"line":1608},[93,5251,1499],{"class":671},[93,5253,5254,5256,5258,5260,5262,5264,5266,5268,5270,5272,5274,5276,5278,5280,5282,5284],{"class":175,"line":1617},[93,5255,1505],{"class":179},[93,5257,415],{"class":192},[93,5259,1510],{"class":182},[93,5261,193],{"class":192},[93,5263,1515],{"class":179},[93,5265,215],{"class":182},[93,5267,1520],{"class":218},[93,5269,240],{"class":182},[93,5271,1525],{"class":218},[93,5273,240],{"class":182},[93,5275,1530],{"class":503},[93,5277,240],{"class":182},[93,5279,1535],{"class":218},[93,5281,240],{"class":182},[93,5283,1535],{"class":218},[93,5285,428],{"class":182},[93,5287,5288,5290,5292,5294,5296],{"class":175,"line":1626},[93,5289,1221],{"class":192},[93,5291,1549],{"class":182},[93,5293,1552],{"class":192},[93,5295,1555],{"class":218},[93,5297,709],{"class":182},[93,5299,5300,5302,5304,5306,5308,5310,5312],{"class":175,"line":1631},[93,5301,844],{"class":179},[93,5303,1328],{"class":182},[93,5305,850],{"class":192},[93,5307,1569],{"class":503},[93,5309,856],{"class":192},[93,5311,769],{"class":179},[93,5313,872],{"class":182},[93,5315,5316,5318],{"class":175,"line":1637},[93,5317,1581],{"class":179},[93,5319,812],{"class":182},[93,5321,5322,5324,5326,5328],{"class":175,"line":1653},[93,5323,797],{"class":192},[93,5325,1591],{"class":192},[93,5327,517],{"class":218},[93,5329,651],{"class":182},[93,5331,5332],{"class":175,"line":1671},[93,5333,888],{"class":182},[93,5335,5336],{"class":175,"line":1682},[93,5337,1320],{"class":182},[93,5339,5340,5342],{"class":175,"line":1687},[93,5341,1611],{"class":179},[93,5343,1614],{"class":182},[93,5345,5346,5348],{"class":175,"line":1692},[93,5347,1620],{"class":179},[93,5349,1623],{"class":182},[93,5351,5352],{"class":175,"line":1705},[93,5353,361],{"emptyLinePlaceholder":360},[93,5355,5356],{"class":175,"line":1711},[93,5357,1634],{"class":671},[93,5359,5360,5362,5364,5366,5368],{"class":175,"line":1769},[93,5361,1221],{"class":192},[93,5363,824],{"class":182},[93,5365,1644],{"class":192},[93,5367,1647],{"class":179},[93,5369,1650],{"class":182},[93,5371,5372,5374,5376,5378,5380,5382,5384],{"class":175,"line":1826},[93,5373,844],{"class":179},[93,5375,1328],{"class":182},[93,5377,850],{"class":192},[93,5379,1662],{"class":503},[93,5381,856],{"class":192},[93,5383,769],{"class":179},[93,5385,872],{"class":182},[93,5387,5388,5390,5392,5394],{"class":175,"line":1885},[93,5389,797],{"class":192},[93,5391,1591],{"class":192},[93,5393,517],{"class":218},[93,5395,651],{"class":182},[93,5397,5398],{"class":175,"line":1939},[93,5399,888],{"class":182},[93,5401,5402],{"class":175,"line":1945},[93,5403,361],{"emptyLinePlaceholder":360},[93,5405,5406,5408,5410,5412],{"class":175,"line":1950},[93,5407,1695],{"class":192},[93,5409,1698],{"class":182},[93,5411,193],{"class":192},[93,5413,785],{"class":182},[93,5415,5416],{"class":175,"line":1965},[93,5417,1708],{"class":671},[93,5419,5420,5422,5424,5426,5428,5430,5432,5434,5436,5438,5440,5442,5444,5446,5448,5450,5452,5454,5456,5458,5460,5462,5464,5466,5468],{"class":175,"line":1984},[93,5421,1714],{"class":218},[93,5423,222],{"class":192},[93,5425,1719],{"class":182},[93,5427,277],{"class":218},[93,5429,222],{"class":192},[93,5431,240],{"class":182},[93,5433,237],{"class":218},[93,5435,222],{"class":192},[93,5437,1732],{"class":182},[93,5439,247],{"class":218},[93,5441,222],{"class":192},[93,5443,240],{"class":182},[93,5445,237],{"class":218},[93,5447,222],{"class":192},[93,5449,240],{"class":182},[93,5451,237],{"class":218},[93,5453,222],{"class":192},[93,5455,1732],{"class":182},[93,5457,247],{"class":218},[93,5459,222],{"class":192},[93,5461,240],{"class":182},[93,5463,247],{"class":218},[93,5465,222],{"class":192},[93,5467,1763],{"class":182},[93,5469,1766],{"class":671},[93,5471,5472,5474,5476,5478,5480,5482,5484,5486,5488,5490,5492,5494,5496,5498,5500,5502,5504,5506,5508,5510,5512,5514,5516,5518,5520,5522],{"class":175,"line":2002},[93,5473,1714],{"class":218},[93,5475,222],{"class":192},[93,5477,240],{"class":182},[93,5479,1778],{"class":192},[93,5481,277],{"class":218},[93,5483,222],{"class":192},[93,5485,240],{"class":182},[93,5487,237],{"class":218},[93,5489,222],{"class":192},[93,5491,1732],{"class":182},[93,5493,237],{"class":218},[93,5495,222],{"class":192},[93,5497,240],{"class":182},[93,5499,247],{"class":218},[93,5501,222],{"class":192},[93,5503,240],{"class":182},[93,5505,237],{"class":218},[93,5507,222],{"class":192},[93,5509,1732],{"class":182},[93,5511,247],{"class":218},[93,5513,222],{"class":192},[93,5515,240],{"class":182},[93,5517,237],{"class":218},[93,5519,222],{"class":192},[93,5521,1763],{"class":182},[93,5523,1823],{"class":671},[93,5525,5526,5528,5530,5532,5534,5536,5538,5540,5542,5544,5546,5548,5550,5552,5554,5556,5558,5560,5562,5564,5566,5568,5570,5572,5574,5576,5578],{"class":175,"line":2007},[93,5527,1829],{"class":192},[93,5529,277],{"class":218},[93,5531,222],{"class":192},[93,5533,240],{"class":182},[93,5535,1778],{"class":192},[93,5537,277],{"class":218},[93,5539,222],{"class":192},[93,5541,240],{"class":182},[93,5543,237],{"class":218},[93,5545,222],{"class":192},[93,5547,1732],{"class":182},[93,5549,237],{"class":218},[93,5551,222],{"class":192},[93,5553,240],{"class":182},[93,5555,237],{"class":218},[93,5557,222],{"class":192},[93,5559,240],{"class":182},[93,5561,247],{"class":218},[93,5563,222],{"class":192},[93,5565,1732],{"class":182},[93,5567,237],{"class":218},[93,5569,222],{"class":192},[93,5571,240],{"class":182},[93,5573,237],{"class":218},[93,5575,222],{"class":192},[93,5577,1763],{"class":182},[93,5579,1882],{"class":671},[93,5581,5582,5584,5586,5588,5590,5592,5594,5596,5598,5600,5602,5604,5606,5608,5610,5612,5614,5616,5618,5620,5622,5624,5626,5628,5630],{"class":175,"line":2012},[93,5583,1829],{"class":192},[93,5585,277],{"class":218},[93,5587,222],{"class":192},[93,5589,1719],{"class":182},[93,5591,277],{"class":218},[93,5593,222],{"class":192},[93,5595,240],{"class":182},[93,5597,237],{"class":218},[93,5599,222],{"class":192},[93,5601,1732],{"class":182},[93,5603,247],{"class":218},[93,5605,222],{"class":192},[93,5607,240],{"class":182},[93,5609,247],{"class":218},[93,5611,222],{"class":192},[93,5613,240],{"class":182},[93,5615,237],{"class":218},[93,5617,222],{"class":192},[93,5619,1732],{"class":182},[93,5621,237],{"class":218},[93,5623,222],{"class":192},[93,5625,240],{"class":182},[93,5627,247],{"class":218},[93,5629,222],{"class":192},[93,5631,1936],{"class":671},[93,5633,5634],{"class":175,"line":2018},[93,5635,1942],{"class":182},[93,5637,5638],{"class":175,"line":2028},[93,5639,1320],{"class":182},[93,5641,5642,5644,5646,5648,5650],{"class":175,"line":2038},[93,5643,1953],{"class":192},[93,5645,489],{"class":192},[93,5647,1958],{"class":182},[93,5649,193],{"class":192},[93,5651,785],{"class":182},[93,5653,5654,5656,5658,5660,5662,5664,5666],{"class":175,"line":2058},[93,5655,1968],{"class":218},[93,5657,240],{"class":182},[93,5659,517],{"class":218},[93,5661,240],{"class":182},[93,5663,1466],{"class":218},[93,5665,1763],{"class":182},[93,5667,1981],{"class":671},[93,5669,5670,5672,5674,5676,5678,5680],{"class":175,"line":2076},[93,5671,1987],{"class":218},[93,5673,240],{"class":182},[93,5675,1992],{"class":218},[93,5677,240],{"class":182},[93,5679,1466],{"class":218},[93,5681,1999],{"class":671},[93,5683,5684],{"class":175,"line":2081},[93,5685,1942],{"class":182},[93,5687,5688],{"class":175,"line":2087},[93,5689,361],{"emptyLinePlaceholder":360},[93,5691,5692],{"class":175,"line":2096},[93,5693,2015],{"class":671},[93,5695,5696,5698,5700],{"class":175,"line":2108},[93,5697,1953],{"class":192},[93,5699,489],{"class":192},[93,5701,2025],{"class":182},[93,5703,5704,5706,5708],{"class":175,"line":2120},[93,5705,1953],{"class":192},[93,5707,489],{"class":192},[93,5709,2035],{"class":182},[93,5711,5712,5714,5716,5718,5720,5722,5724],{"class":175,"line":2130},[93,5713,2041],{"class":179},[93,5715,215],{"class":182},[93,5717,517],{"class":218},[93,5719,240],{"class":182},[93,5721,835],{"class":192},[93,5723,2052],{"class":182},[93,5725,2055],{"class":671},[93,5727,5728,5730,5732,5734,5736,5738,5740],{"class":175,"line":2141},[93,5729,2041],{"class":179},[93,5731,215],{"class":182},[93,5733,517],{"class":218},[93,5735,240],{"class":182},[93,5737,835],{"class":192},[93,5739,2071],{"class":182},[93,5741,2055],{"class":671},[93,5743,5744],{"class":175,"line":2151},[93,5745,1320],{"class":182},[93,5747,5748],{"class":175,"line":2173},[93,5749,2084],{"class":671},[93,5751,5752,5754],{"class":175,"line":2185},[93,5753,2090],{"class":179},[93,5755,2093],{"class":182},[93,5757,5758,5760,5762],{"class":175,"line":2190},[93,5759,2099],{"class":179},[93,5761,2102],{"class":182},[93,5763,2105],{"class":671},[93,5765,5766,5768,5770],{"class":175,"line":2196},[93,5767,2111],{"class":179},[93,5769,2114],{"class":182},[93,5771,2117],{"class":671},[93,5773,5774,5776,5778],{"class":175,"line":2204},[93,5775,2111],{"class":179},[93,5777,2125],{"class":182},[93,5779,2117],{"class":671},[93,5781,5782,5784,5786],{"class":175,"line":2214},[93,5783,2111],{"class":179},[93,5785,2135],{"class":182},[93,5787,2138],{"class":671},[93,5789,5790,5792,5794],{"class":175,"line":2223},[93,5791,2111],{"class":179},[93,5793,2146],{"class":182},[93,5795,2138],{"class":671},[93,5797,5798,5800,5802,5804,5806,5808,5810],{"class":175,"line":2233},[93,5799,2154],{"class":179},[93,5801,2157],{"class":182},[93,5803,720],{"class":218},[93,5805,2162],{"class":182},[93,5807,720],{"class":218},[93,5809,2167],{"class":182},[93,5811,2170],{"class":671},[93,5813,5814,5816,5818],{"class":175,"line":2242},[93,5815,2176],{"class":179},[93,5817,2179],{"class":182},[93,5819,2182],{"class":671},[93,5821,5822],{"class":175,"line":2251},[93,5823,361],{"emptyLinePlaceholder":360},[93,5825,5826],{"class":175,"line":2270},[93,5827,2193],{"class":671},[93,5829,5830,5832],{"class":175,"line":2279},[93,5831,2090],{"class":179},[93,5833,2201],{"class":182},[93,5835,5836,5838,5840],{"class":175,"line":2284},[93,5837,2099],{"class":179},[93,5839,2209],{"class":182},[93,5841,2105],{"class":671},[93,5843,5844,5846,5848],{"class":175,"line":2289},[93,5845,2111],{"class":179},[93,5847,2114],{"class":182},[93,5849,2117],{"class":671},[93,5851,5852,5854,5856],{"class":175,"line":2295},[93,5853,2111],{"class":179},[93,5855,2125],{"class":182},[93,5857,2230],{"class":671},[93,5859,5860,5862,5864],{"class":175,"line":2305},[93,5861,2111],{"class":179},[93,5863,2135],{"class":182},[93,5865,2138],{"class":671},[93,5867,5868,5870,5872],{"class":175,"line":2322},[93,5869,2111],{"class":179},[93,5871,2146],{"class":182},[93,5873,2138],{"class":671},[93,5875,5876,5878,5880,5882,5884,5886,5888],{"class":175,"line":2334},[93,5877,2154],{"class":179},[93,5879,2157],{"class":182},[93,5881,720],{"class":218},[93,5883,2260],{"class":182},[93,5885,720],{"class":218},[93,5887,2265],{"class":182},[93,5889,2170],{"class":671},[93,5891,5892,5894,5896],{"class":175,"line":2339},[93,5893,2176],{"class":179},[93,5895,2179],{"class":182},[93,5897,2182],{"class":671},[93,5899,5900],{"class":175,"line":2345},[93,5901,361],{"emptyLinePlaceholder":360},[93,5903,5904],{"class":175,"line":2355},[93,5905,361],{"emptyLinePlaceholder":360},[93,5907,5908],{"class":175,"line":2372},[93,5909,2292],{"class":671},[93,5911,5912,5914,5916],{"class":175,"line":2384},[93,5913,1953],{"class":192},[93,5915,489],{"class":192},[93,5917,2302],{"class":182},[93,5919,5920,5922,5924,5926,5928,5930],{"class":175,"line":2399},[93,5921,2308],{"class":179},[93,5923,215],{"class":182},[93,5925,517],{"class":218},[93,5927,240],{"class":182},[93,5929,835],{"class":192},[93,5931,2319],{"class":182},[93,5933,5934,5936,5938],{"class":175,"line":2404},[93,5935,2325],{"class":179},[93,5937,2328],{"class":182},[93,5939,2331],{"class":671},[93,5941,5942],{"class":175,"line":2410},[93,5943,361],{"emptyLinePlaceholder":360},[93,5945,5946],{"class":175,"line":2420},[93,5947,2342],{"class":671},[93,5949,5950,5952,5954],{"class":175,"line":2436},[93,5951,1953],{"class":192},[93,5953,489],{"class":192},[93,5955,2352],{"class":182},[93,5957,5958,5960,5962,5964,5966,5968],{"class":175,"line":2447},[93,5959,2358],{"class":179},[93,5961,215],{"class":182},[93,5963,517],{"class":218},[93,5965,240],{"class":182},[93,5967,835],{"class":192},[93,5969,2369],{"class":182},[93,5971,5972,5974,5976],{"class":175,"line":2460},[93,5973,2375],{"class":179},[93,5975,2378],{"class":182},[93,5977,2381],{"class":671},[93,5979,5980,5982,5984,5986],{"class":175,"line":2465},[93,5981,2387],{"class":179},[93,5983,2390],{"class":182},[93,5985,2393],{"class":192},[93,5987,2396],{"class":182},[93,5989,5990],{"class":175,"line":2474},[93,5991,361],{"emptyLinePlaceholder":360},[93,5993,5994],{"class":175,"line":2488},[93,5995,2407],{"class":671},[93,5997,5998,6000,6002],{"class":175,"line":2511},[93,5999,1953],{"class":192},[93,6001,489],{"class":192},[93,6003,2417],{"class":182},[93,6005,6006,6008,6010,6012,6014,6016],{"class":175,"line":2516},[93,6007,2358],{"class":179},[93,6009,215],{"class":182},[93,6011,517],{"class":218},[93,6013,240],{"class":182},[93,6015,835],{"class":192},[93,6017,2433],{"class":182},[93,6019,6020,6022,6024],{"class":175,"line":2522},[93,6021,2375],{"class":179},[93,6023,2441],{"class":182},[93,6025,2444],{"class":671},[93,6027,6028,6030,6032,6034],{"class":175,"line":2566},[93,6029,2387],{"class":179},[93,6031,2452],{"class":182},[93,6033,2393],{"class":192},[93,6035,2457],{"class":182},[93,6037,6038],{"class":175,"line":2582},[93,6039,361],{"emptyLinePlaceholder":360},[93,6041,6042,6044],{"class":175,"line":2587},[93,6043,2468],{"class":192},[93,6045,2471],{"class":182},[93,6047,6048,6050,6052,6054],{"class":175,"line":2593},[93,6049,2477],{"class":179},[93,6051,2480],{"class":182},[93,6053,835],{"class":192},[93,6055,2485],{"class":182},[93,6057,6058,6060,6062,6064,6066,6068,6070,6072,6074],{"class":175,"line":2638},[93,6059,1185],{"class":179},[93,6061,1328],{"class":182},[93,6063,850],{"class":192},[93,6065,2497],{"class":503},[93,6067,856],{"class":192},[93,6069,2502],{"class":182},[93,6071,850],{"class":192},[93,6073,769],{"class":179},[93,6075,872],{"class":182},[93,6077,6078],{"class":175,"line":2649},[93,6079,361],{"emptyLinePlaceholder":360},[93,6081,6082],{"class":175,"line":2654},[93,6083,2519],{"class":671},[93,6085,6086,6088,6090,6092,6094,6096,6098,6100,6102,6104,6106,6108,6110,6112,6114,6116],{"class":175,"line":2660},[93,6087,2525],{"class":179},[93,6089,215],{"class":182},[93,6091,720],{"class":218},[93,6093,240],{"class":182},[93,6095,1466],{"class":218},[93,6097,2536],{"class":182},[93,6099,2539],{"class":218},[93,6101,2542],{"class":192},[93,6103,2545],{"class":192},[93,6105,215],{"class":182},[93,6107,2550],{"class":192},[93,6109,2553],{"class":182},[93,6111,2556],{"class":192},[93,6113,2559],{"class":182},[93,6115,720],{"class":218},[93,6117,428],{"class":182},[93,6119,6120,6122,6124,6126,6128],{"class":175,"line":2704},[93,6121,2569],{"class":179},[93,6123,215],{"class":182},[93,6125,720],{"class":218},[93,6127,2576],{"class":182},[93,6129,2579],{"class":671},[93,6131,6132],{"class":175,"line":2715},[93,6133,361],{"emptyLinePlaceholder":360},[93,6135,6136],{"class":175,"line":2720},[93,6137,2590],{"class":671},[93,6139,6140,6142,6144,6146,6148,6150,6152,6154,6156,6158,6160,6162,6164,6166,6168,6170,6172,6174,6176,6178],{"class":175,"line":2726},[93,6141,2525],{"class":179},[93,6143,215],{"class":182},[93,6145,517],{"class":218},[93,6147,240],{"class":182},[93,6149,1466],{"class":218},[93,6151,2536],{"class":182},[93,6153,2539],{"class":218},[93,6155,2542],{"class":192},[93,6157,2545],{"class":192},[93,6159,215],{"class":182},[93,6161,2550],{"class":192},[93,6163,2553],{"class":182},[93,6165,2556],{"class":192},[93,6167,2622],{"class":182},[93,6169,1466],{"class":218},[93,6171,2542],{"class":192},[93,6173,2545],{"class":192},[93,6175,215],{"class":182},[93,6177,2550],{"class":192},[93,6179,2635],{"class":182},[93,6181,6182,6184,6186,6188],{"class":175,"line":2747},[93,6183,2569],{"class":179},[93,6185,215],{"class":182},[93,6187,517],{"class":218},[93,6189,428],{"class":182},[93,6191,6192],{"class":175,"line":2752},[93,6193,1320],{"class":182},[93,6195,6196],{"class":175,"line":2758},[93,6197,2657],{"class":671},[93,6199,6200,6202,6204,6206,6208,6210,6212,6214,6216,6218,6220,6222,6224,6226,6228,6230,6232,6234,6236,6238],{"class":175,"line":2774},[93,6201,2525],{"class":179},[93,6203,215],{"class":182},[93,6205,1992],{"class":218},[93,6207,240],{"class":182},[93,6209,1992],{"class":218},[93,6211,2536],{"class":182},[93,6213,2539],{"class":218},[93,6215,2542],{"class":192},[93,6217,2545],{"class":192},[93,6219,215],{"class":182},[93,6221,2550],{"class":192},[93,6223,2553],{"class":182},[93,6225,2556],{"class":192},[93,6227,2622],{"class":182},[93,6229,2691],{"class":218},[93,6231,2542],{"class":192},[93,6233,2545],{"class":192},[93,6235,215],{"class":182},[93,6237,2550],{"class":192},[93,6239,2635],{"class":182},[93,6241,6242,6244,6246,6248],{"class":175,"line":2780},[93,6243,2569],{"class":179},[93,6245,215],{"class":182},[93,6247,1992],{"class":218},[93,6249,428],{"class":182},[93,6251,6252],{"class":175,"line":2788},[93,6253,361],{"emptyLinePlaceholder":360},[93,6255,6256],{"class":175,"line":2794},[93,6257,2723],{"class":671},[93,6259,6260,6262,6264,6266,6268,6270,6272],{"class":175,"line":2800},[93,6261,2729],{"class":179},[93,6263,2732],{"class":179},[93,6265,215],{"class":182},[93,6267,2737],{"class":503},[93,6269,240],{"class":182},[93,6271,2742],{"class":503},[93,6273,428],{"class":182},[93,6275,6276],{"class":175,"line":2834},[93,6277,361],{"emptyLinePlaceholder":360},[93,6279,6280],{"class":175,"line":2843},[93,6281,2755],{"class":671},[93,6283,6284,6286,6288,6290,6292],{"class":175,"line":2848},[93,6285,2761],{"class":192},[93,6287,824],{"class":182},[93,6289,1644],{"class":192},[93,6291,2768],{"class":179},[93,6293,2771],{"class":182},[93,6295,6296],{"class":175,"line":2854},[93,6297,2777],{"class":671},[93,6299,6300,6302],{"class":175,"line":2865},[93,6301,2783],{"class":179},[93,6303,812],{"class":182},[93,6305,6306],{"class":175,"line":2870},[93,6307,2791],{"class":182},[93,6309,6310],{"class":175,"line":2876},[93,6311,2797],{"class":671},[93,6313,6314,6316,6318,6320,6322,6324,6326,6328,6330,6332,6334,6336,6338,6340],{"class":175,"line":2896},[93,6315,2803],{"class":179},[93,6317,215],{"class":182},[93,6319,2808],{"class":218},[93,6321,222],{"class":192},[93,6323,240],{"class":182},[93,6325,2815],{"class":218},[93,6327,222],{"class":192},[93,6329,240],{"class":182},[93,6331,2815],{"class":218},[93,6333,222],{"class":192},[93,6335,240],{"class":182},[93,6337,247],{"class":218},[93,6339,222],{"class":192},[93,6341,428],{"class":182},[93,6343,6344,6346],{"class":175,"line":2916},[93,6345,2837],{"class":179},[93,6347,2840],{"class":182},[93,6349,6350],{"class":175,"line":2921},[93,6351,2791],{"class":182},[93,6353,6354],{"class":175,"line":2940},[93,6355,2851],{"class":671},[93,6357,6358,6360,6362],{"class":175,"line":2958},[93,6359,2857],{"class":182},[93,6361,2860],{"class":179},[93,6363,812],{"class":182},[93,6365,6366],{"class":175,"line":2963},[93,6367,361],{"emptyLinePlaceholder":360},[93,6369,6370,6373,6375,6377,6379,6381,6383],{"class":175,"line":2972},[93,6371,6372],{"class":192},"        int",[93,6374,4327],{"class":182},[93,6376,193],{"class":192},[93,6378,497],{"class":179},[93,6380,500],{"class":182},[93,6382,4336],{"class":503},[93,6384,428],{"class":182},[93,6386,6387,6389,6391,6393,6395,6397,6399,6401],{"class":175,"line":2977},[93,6388,2899],{"class":179},[93,6390,4345],{"class":182},[93,6392,517],{"class":218},[93,6394,520],{"class":182},[93,6396,115],{"class":179},[93,6398,199],{"class":182},[93,6400,527],{"class":179},[93,6402,4358],{"class":182},[93,6404,6405],{"class":175,"line":2983},[93,6406,361],{"emptyLinePlaceholder":360},[93,6408,6409,6411,6414,6416,6418,6420,6423],{"class":175,"line":3001},[93,6410,6372],{"class":192},[93,6412,6413],{"class":182}," viewLoc ",[93,6415,193],{"class":192},[93,6417,497],{"class":179},[93,6419,500],{"class":182},[93,6421,6422],{"class":503},"\"view\"",[93,6424,428],{"class":182},[93,6426,6427,6429,6432,6434,6436,6438,6440,6442],{"class":175,"line":3006},[93,6428,2899],{"class":179},[93,6430,6431],{"class":182},"(viewLoc, ",[93,6433,517],{"class":218},[93,6435,520],{"class":182},[93,6437,115],{"class":179},[93,6439,199],{"class":182},[93,6441,527],{"class":179},[93,6443,6444],{"class":182},"(view));\n",[93,6446,6447],{"class":175,"line":3012},[93,6448,361],{"emptyLinePlaceholder":360},[93,6450,6451,6453,6456,6458,6460,6462,6465],{"class":175,"line":3020},[93,6452,6372],{"class":192},[93,6454,6455],{"class":182}," projectionLoc ",[93,6457,193],{"class":192},[93,6459,497],{"class":179},[93,6461,500],{"class":182},[93,6463,6464],{"class":503},"\"projection\"",[93,6466,428],{"class":182},[93,6468,6469,6471,6474,6476,6478,6480,6482,6484],{"class":175,"line":3025},[93,6470,2899],{"class":179},[93,6472,6473],{"class":182},"(projectionLoc, ",[93,6475,517],{"class":218},[93,6477,520],{"class":182},[93,6479,115],{"class":179},[93,6481,199],{"class":182},[93,6483,527],{"class":179},[93,6485,6486],{"class":182},"(projection));\n",[93,6488,6489],{"class":175,"line":3030},[93,6490,2791],{"class":182},[93,6492,6493,6495,6497,6499,6501,6503,6505],{"class":175,"line":3036},[93,6494,2857],{"class":182},[93,6496,2926],{"class":179},[93,6498,215],{"class":182},[93,6500,2931],{"class":503},[93,6502,240],{"class":182},[93,6504,720],{"class":218},[93,6506,428],{"class":182},[93,6508,6509,6511,6513,6515,6517,6519,6521],{"class":175,"line":3052},[93,6510,2857],{"class":182},[93,6512,2926],{"class":179},[93,6514,215],{"class":182},[93,6516,2949],{"class":503},[93,6518,240],{"class":182},[93,6520,517],{"class":218},[93,6522,428],{"class":182},[93,6524,6525],{"class":175,"line":3068},[93,6526,2791],{"class":182},[93,6528,6529,6531],{"class":175,"line":3083},[93,6530,2966],{"class":179},[93,6532,2969],{"class":182},[93,6534,6535],{"class":175,"line":3100},[93,6536,2791],{"class":182},[93,6538,6539],{"class":175,"line":3116},[93,6540,2980],{"class":671},[93,6542,6543,6545,6547,6549,6551,6553],{"class":175,"line":3124},[93,6544,2986],{"class":179},[93,6546,2989],{"class":182},[93,6548,2691],{"class":218},[93,6550,2994],{"class":182},[93,6552,720],{"class":218},[93,6554,428],{"class":182},[93,6556,6557],{"class":175,"line":3134},[93,6558,2791],{"class":182},[93,6560,6561],{"class":175,"line":3139},[93,6562,3009],{"class":671},[93,6564,6565,6567],{"class":175,"line":3144},[93,6566,3015],{"class":179},[93,6568,1614],{"class":182},[93,6570,6571],{"class":175,"line":3153},[93,6572,888],{"class":182},[93,6574,6575],{"class":175,"line":3159},[93,6576,361],{"emptyLinePlaceholder":360},[93,6578,6579],{"class":175,"line":3165},[93,6580,3033],{"class":671},[93,6582,6583,6585,6587,6589,6591,6593],{"class":175,"line":3171},[93,6584,3039],{"class":179},[93,6586,215],{"class":182},[93,6588,517],{"class":218},[93,6590,240],{"class":182},[93,6592,835],{"class":192},[93,6594,2319],{"class":182},[93,6596,6597,6599,6601,6603,6605,6607],{"class":175,"line":3177},[93,6598,3055],{"class":179},[93,6600,215],{"class":182},[93,6602,517],{"class":218},[93,6604,240],{"class":182},[93,6606,835],{"class":192},[93,6608,2369],{"class":182},[93,6610,6611,6613,6615,6617,6619,6621],{"class":175,"line":3183},[93,6612,3055],{"class":179},[93,6614,215],{"class":182},[93,6616,517],{"class":218},[93,6618,240],{"class":182},[93,6620,835],{"class":192},[93,6622,2433],{"class":182},[93,6624,6625,6627,6629,6631,6633,6635],{"class":175,"line":3192},[93,6626,3086],{"class":179},[93,6628,215],{"class":182},[93,6630,517],{"class":218},[93,6632,240],{"class":182},[93,6634,835],{"class":192},[93,6636,3097],{"class":182},[93,6638,6639,6641,6643,6645,6647,6649],{"class":175,"line":3197},[93,6640,3086],{"class":179},[93,6642,215],{"class":182},[93,6644,517],{"class":218},[93,6646,240],{"class":182},[93,6648,835],{"class":192},[93,6650,3113],{"class":182},[93,6652,6653,6655],{"class":175,"line":3237},[93,6654,3119],{"class":179},[93,6656,812],{"class":182},[93,6658,6659,6661,6663],{"class":175,"line":3242},[93,6660,3127],{"class":192},[93,6662,337],{"class":218},[93,6664,651],{"class":182},[93,6666,6667],{"class":175,"line":3247},[93,6668,448],{"class":182},[10,6670,6671,6672,6674,6675,6677],{},"这三个步骤定义了顶点从 ",[48,6673,3431],{}," 到 ",[48,6676,3482],{}," 的完整变换流程。",[6679,6680],"hr",{},[64,6682,6684],{"id":6683},"_3d-变换三部曲mvp-矩阵","3D 变换三部曲：MVP 矩阵",[10,6686,6687,6688,6691],{},"这三个矩阵通常组合成一个 ",[48,6689,6690],{},"MVP 矩阵","（Model-View-Projection Matrix），一起发送到着色器中，对所有顶点进行一次性变换。",[10,6693,6694],{},"MVP=P×V×M",[3526,6696,6698],{"id":6697},"第一步模型矩阵-m","第一步：模型矩阵 (M)",[10,6700,6701],{},[32,6702],{"alt":6703,"src":6704},"image-20251010222649538",".\u002Fassets\u002Fimage-20251010222649538.png",[6706,6707,6708,6724],"table",{},[6709,6710,6711],"thead",{},[6712,6713,6714,6718,6721],"tr",{},[6715,6716,6717],"th",{},"作用",[6715,6719,6720],{},"详细解释",[6715,6722,6723],{},"目的空间",[6725,6726,6727,6745,6764,6779],"tbody",{},[6712,6728,6729,6735,6741],{},[6730,6731,6732],"td",{},[48,6733,6734],{},"放置物体",[6730,6736,6737,6738,6740],{},"将物体从它在建模软件中的初始坐标（",[48,6739,3431],{},"）移动、旋转和缩放到它在 3D 世界中的正确位置。",[6730,6742,6743],{},[48,6744,3448],{},[6712,6746,6747,6752,6762],{},[6730,6748,6749],{},[48,6750,6751],{},"操作",[6730,6753,6754,6756,6757,6756,6760,106],{},[48,6755,4070],{},"、",[48,6758,6759],{},"旋转 (Rotate)",[48,6761,4074],{},[6730,6763],{},[6712,6765,6766,6771,6777],{},[6730,6767,6768],{},[48,6769,6770],{},"意义",[6730,6772,6773,6774],{},"告诉 GPU ",[48,6775,6776],{},"“这个物体应该在哪里，应该以什么姿态存在。”",[6730,6778],{},[6712,6780,6781,6786,6789],{},[6730,6782,6783],{},[48,6784,6785],{},"结果",[6730,6787,6788],{},"顶点的坐标现在是相对于世界的全局原点 (0,0,0) 来定义的。",[6730,6790],{},[10,6792,6793],{},"第二步：观察矩阵 (V)",[10,6795,6796],{},[32,6797],{"alt":6798,"src":6799},"image-20251010222700794",".\u002Fassets\u002Fimage-20251010222700794.png",[10,6801,6802,6803,6806,6807,6810,6811,6751,6813,6827,6828,106,6831,6833],{},"​\t作用详细解释目的空间",[48,6804,6805],{},"模拟摄像机","定义用户或",[48,6808,6809],{},"摄像机的位置和朝向","。 实际上，它是对整个世界坐标系进行反向变换。",[48,6812,3468],{},[48,6814,6815,6816,6826],{},"通常使用 ",[48,6817,6818,6821,6822,6825],{},[171,6819,6820],{},"glm::lookAt()"," 函数创建，结合了位移和旋转。",[48,6823,6824],{},"核心原则","整个世界朝着摄像机移动。例如，如果","摄像机向 +Z 方向移动 5 个单位","，则观察矩阵",[48,6829,6830],{},"会施加 −Z 方向的 5 个单位位移给所有物体",[48,6832,6785],{},"顶点的坐标现在是相对于摄像机原点 (0,0,0) 来定义的。",[10,6835,6836],{},"第三步：投影矩阵 (P)",[10,6838,6839],{},[32,6840],{"alt":6841,"src":6842},"image-20251010222753876",".\u002Fassets\u002Fimage-20251010222753876.png",[10,6844,6802,6845,6848,6849,6852,6853,6855,6856,6858,6859,6862,6863,6865,6866,6869],{},[48,6846,6847],{},"定义可见区域","定义一个被称为",[48,6850,6851],{},"平截头体 (Frustum)"," 的 3D 盒子（或锥体），只有位于这个体内的物体才会被渲染。",[48,6854,3482],{},"类型透视投影**（近大远小，有深度感）或 ",[48,6857,3528],{},"（无透视，等比例）。**核心功能为透视除法做准备。它根据深度 (Z 轴) 修改顶点的 ",[48,6860,6861],{},"W 分量","，这是实现透视效果的关键。",[48,6864,6785],{},"顶点的坐标现在是 4D 的裁剪坐标 (x′,y′,z′,w′)，处于 ",[93,6867,6868],{},"−w′,w′"," 的范围内。",[64,6871,6873],{"id":6872},"最后的两步从-3d-到-2d-屏幕","最后的两步：从 3D 到 2D 屏幕",[10,6875,6876,6877,3578],{},"在 P×V×M 运算完成之后，",[48,6878,6879],{},"GPU 会自动执行最后两个步骤，将 3D 坐标转换为屏幕像素",[3526,6881,6883],{"id":6882},"_1-透视除法-perspective-division","1. 透视除法 (Perspective Division)",[3533,6885,6886,6896,6902],{},[3391,6887,6888,6891,6892,6895],{},[48,6889,6890],{},"作用："," 这是",[48,6893,6894],{},"实现“透视”效果","的数学步骤。",[3391,6897,6898,6901],{},[48,6899,6900],{},"实现："," 自动将裁剪坐标的 x,y,z 分量分别除以其 w 分量。",[3391,6903,6904,6907,6908,6911,6912,6869],{},[48,6905,6906],{},"结果："," 坐标被转换为 ",[48,6909,6910],{},"标准化设备坐标 (NDC)","。NDC 是一个统一的立方体空间，所有可见坐标都位于 ",[93,6913,6914],{},"−1.0,1.0",[10,6916,6917],{},[32,6918],{"alt":6919,"src":6920},"image-20251010223139983",".\u002Fassets\u002Fimage-20251010223139983.png",[3526,6922,6924],{"id":6923},"_2-视口变换-viewport-transform","2. 视口变换 (Viewport Transform)",[3533,6926,6927,6935],{},[3391,6928,6929,6931,6932,6934],{},[48,6930,6890],{}," 将 ",[93,6933,6914],{}," 的 NDC 坐标映射到您定义的屏幕像素范围（例如 0 到 800）。",[3391,6936,6937,6939,6940,6942],{},[48,6938,6906],{}," 顶点获得最终的",[48,6941,3923],{},"，等待光栅化器将其转换为片元（像素）。",[64,6944,6946],{"id":6945},"更加-3d","更加 3D",[10,6948,6949,6950,6953,6954,6959],{},"​\t到目前为止，**我们一直都在使用一个2D平面，而且甚至是在3D空间里！**所以，**让我们大胆地拓展我们的2D平面为一个3D立方体。**要想渲染一个立方体，",[48,6951,6952],{},"我们一共需要36个顶点（6个面 x 每个面有2个三角形组成 x 每个三角形有3个顶点）","，这36个顶点的位置你可以从",[100,6955,6958],{"href":6956,"rel":6957},"https:\u002F\u002Flearnopengl.com\u002Fcode_viewer.php?code=getting-started\u002Fcube_vertices",[104],"这里","获取。",[10,6961,6962],{},"为了有趣一点，我们将让立方体随着时间旋转：",[164,6964,6966],{"className":166,"code":6965,"language":168,"meta":169,"style":169},"model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));\n",[171,6967,6968],{"__ignoreMap":169},[93,6969,6970,6972,6974,6976,6978,6980,6983,6985,6987,6990,6992,6994,6996,6998,7000,7002,7005,7007,7009,7011,7013,7015,7017,7019,7021,7023,7025,7027,7029,7031,7033],{"class":175,"line":176},[93,6971,3961],{"class":182},[93,6973,193],{"class":192},[93,6975,196],{"class":179},[93,6977,199],{"class":182},[93,6979,202],{"class":179},[93,6981,6982],{"class":182},"(model, (",[93,6984,2550],{"class":192},[93,6986,2559],{"class":182},[93,6988,6989],{"class":179},"glfwGetTime",[93,6991,865],{"class":182},[93,6993,415],{"class":192},[93,6995,196],{"class":179},[93,6997,199],{"class":182},[93,6999,212],{"class":179},[93,7001,215],{"class":182},[93,7003,7004],{"class":218},"50.0",[93,7006,222],{"class":192},[93,7008,225],{"class":182},[93,7010,115],{"class":179},[93,7012,199],{"class":182},[93,7014,232],{"class":179},[93,7016,215],{"class":182},[93,7018,277],{"class":218},[93,7020,222],{"class":192},[93,7022,240],{"class":182},[93,7024,247],{"class":218},[93,7026,222],{"class":192},[93,7028,240],{"class":182},[93,7030,237],{"class":218},[93,7032,222],{"class":192},[93,7034,250],{"class":182},[10,7036,7037],{},"然后我们使用glDrawArrays来绘制立方体，但这一次总共有36个顶点。",[164,7039,7041],{"className":166,"code":7040,"language":168,"meta":169,"style":169},"glDrawArrays(GL_TRIANGLES, 0, 36);\n",[171,7042,7043],{"__ignoreMap":169},[93,7044,7045,7048,7050,7052,7054,7057],{"class":175,"line":176},[93,7046,7047],{"class":179},"glDrawArrays",[93,7049,2989],{"class":182},[93,7051,720],{"class":218},[93,7053,240],{"class":182},[93,7055,7056],{"class":218},"36",[93,7058,428],{"class":182},[10,7060,564],{},[164,7062,7064],{"className":166,"code":7063,"language":168,"meta":169,"style":169},"#include \u003Cglad\u002Fglad.h>\n#include \u003CGLFW\u002Fglfw3.h>\n#include \u003Copencv4\u002Fopencv2\u002Fopencv.hpp>\n#include \u003Ciostream>\n#include \u003Ccmath>\n#include \u003Cfilesystem>\n#include \"utils\u002Fshader.h\"\n#include \"utils\u002FglmCompute.h\"\n#include \"utils\u002Flogger.h\"\n\nusing namespace cv;\nusing namespace glm;\n\n\u002F\u002F 窗口大小改变时的回调函数\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height) {\n    glViewport(0, 0, width, height);\n}\n\nstd::string getCurrentWorkingDirectory() {\n    namespace fs = std::filesystem;\n    try {\n        \u002F\u002F current_path() 返回当前工作目录\n        return fs::current_path().string();\n    } catch (const fs::filesystem_error& e) {\n        std::cerr \u003C\u003C \"Filesystem Error: \" \u003C\u003C e.what() \u003C\u003C std::endl;\n        return \"\";\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 view = mat4(1.0f);\n    view = translate(view, vec3(0.0f, 0.0f, -3.0f));\n\n    \u002F\u002F 投影矩阵\n    mat4 projection = perspective(radians(45.0f), (float)800 \u002F (float)600, 0.1f, 100.0f);\n\n    auto path = getCurrentWorkingDirectory().append(\"\u002FAssets\u002Fimage.png\");\n    auto path2 = getCurrentWorkingDirectory().append(\"\u002FAssets\u002Fimage2.png\");\n    cv::Mat image = cv::imread(path);\n    cv::Mat image2 = cv::imread(path2);\n    cv::flip(image2, image2, 0);\n    cv::cvtColor(image, image, cv::COLOR_BGR2RGB);\n    cv::cvtColor(image2, image2, cv::COLOR_BGR2RGB);\n\n    \u002F\u002F 转换为字节数组\n    std::vector\u003Cuchar> imageData;\n    std::vector\u003Cuchar> imageData2;\n    if (image.empty()) {\n        std::cerr \u003C\u003C \"Could not read the image: \" \u003C\u003C path \u003C\u003C std::endl;\n        return 1;\n    }\n    if (image2.empty()) {\n        std::cerr \u003C\u003C \"Could not read the image2: \" \u003C\u003C path2 \u003C\u003C std::endl;\n        return 1;\n    }\n    \n    std::cout \u003C\u003C \"Image 1 loaded: \" \u003C\u003C image.cols \u003C\u003C \"x\" \u003C\u003C image.rows \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"Image 2 loaded: \" \u003C\u003C image2.cols \u003C\u003C \"x\" \u003C\u003C image2.rows \u003C\u003C std::endl;\n\n    cv::imencode(\".png\", image, imageData);\n    cv::imencode(\".png\", image2, imageData2);\n\n\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 创建窗口\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 初始化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 启用深度测试\n    glEnable(GL_DEPTH_TEST);\n\n    float vertices[] = {\n    \u002F\u002F 位置(3) + 纹理坐标(2)\n    -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,\n     0.5f, -0.5f, -0.5f,  1.0f, 0.0f,\n     0.5f,  0.5f, -0.5f,  1.0f, 1.0f,\n     0.5f,  0.5f, -0.5f,  1.0f, 1.0f,\n    -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,\n    -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,\n\n    -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,\n     0.5f, -0.5f,  0.5f,  1.0f, 0.0f,\n     0.5f,  0.5f,  0.5f,  1.0f, 1.0f,\n     0.5f,  0.5f,  0.5f,  1.0f, 1.0f,\n    -0.5f,  0.5f,  0.5f,  0.0f, 1.0f,\n    -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,\n\n    -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,\n    -0.5f,  0.5f, -0.5f,  1.0f, 1.0f,\n    -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,\n    -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,\n    -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,\n    -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,\n\n     0.5f,  0.5f,  0.5f,  1.0f, 0.0f,\n     0.5f,  0.5f, -0.5f,  1.0f, 1.0f,\n     0.5f, -0.5f, -0.5f,  0.0f, 1.0f,\n     0.5f, -0.5f, -0.5f,  0.0f, 1.0f,\n     0.5f, -0.5f,  0.5f,  0.0f, 0.0f,\n     0.5f,  0.5f,  0.5f,  1.0f, 0.0f,\n\n    -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,\n     0.5f, -0.5f, -0.5f,  1.0f, 1.0f,\n     0.5f, -0.5f,  0.5f,  1.0f, 0.0f,\n     0.5f, -0.5f,  0.5f,  1.0f, 0.0f,\n    -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,\n    -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,\n\n    -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,\n     0.5f,  0.5f, -0.5f,  1.0f, 1.0f,\n     0.5f,  0.5f,  0.5f,  1.0f, 0.0f,\n     0.5f,  0.5f,  0.5f,  1.0f, 0.0f,\n    -0.5f,  0.5f,  0.5f,  0.0f, 0.0f,\n    -0.5f,  0.5f, -0.5f,  0.0f, 1.0f\n};\n    \n    \u002F\u002F indices数组未使用，已删除\n\n    \u002F\u002F 纹理\n    unsigned int texture;\n    unsigned int texture2;\n    glGenTextures(1, &texture); \u002F\u002F 生成纹理\n    glGenTextures(1, &texture2); \u002F\u002F 生成纹理\n    \n    \u002F\u002F 配置第一个纹理\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, texture); \u002F\u002F 绑定纹理\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.cols, image.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image.data); \u002F\u002F 设置纹理数据\n    glGenerateMipmap(GL_TEXTURE_2D); \u002F\u002F 生成mipmap\n\n    \u002F\u002F 配置第二个纹理\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, texture2); \u002F\u002F 绑定纹理\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); \u002F\u002F 设置纹理环绕方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); \u002F\u002F 设置纹理环绕方式   \n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \u002F\u002F 设置纹理过滤方式\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image2.cols, image2.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image2.data); \u002F\u002F 设置纹理数据\n    glGenerateMipmap(GL_TEXTURE_2D); \u002F\u002F 生成mipmap\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, 5 * sizeof(float), (void*)0);\n    glEnableVertexAttribArray(0); \u002F\u002F 启用顶点属性\n    \n    \u002F\u002F 纹理属性\n    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));\n    glEnableVertexAttribArray(2);\n\n    \u002F\u002F 构建并编译着色器程序\n    Shader ourShader(\"shader\u002Fcustom.vert\", \"shader\u002Ffragment.vert\");\n\n    \u002F\u002F 渲染循环\n    while (!glfwWindowShouldClose(window)) {\n        \u002F\u002F 处理输入\n        glfwPollEvents();\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        ourShader.use();\n\n        int modelLoc = glGetUniformLocation(ourShader.ID, \"model\");\n        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));\n\n        int viewLoc = glGetUniformLocation(ourShader.ID, \"view\");\n        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));\n\n        int projectionLoc = glGetUniformLocation(ourShader.ID, \"projection\");\n        glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));\n        \n        ourShader.setInt(\"ourTexture\", 0);\n        ourShader.setInt(\"ourTexture2\", 1);\n        \n        glBindVertexArray(VAO);\n        \n        \u002F\u002F 绘制立方体\n        glDrawArrays(GL_TRIANGLES, 0, 36);\n        \n        \u002F\u002F 交换缓冲区和检查IO事件\n        glfwSwapBuffers(window);\n    }\n\n    \u002F\u002F 清理资源\n    glDeleteVertexArrays(1, &VAO);\n    glDeleteBuffers(1, &VBO);\n    glDeleteTextures(1, &texture);\n    glDeleteTextures(1, &texture2);\n    glfwTerminate();\n    return 0;\n}\n\n#version 330 core\nout vec4 FragColor;\nin vec2 TexCoord;\nuniform sampler2D ourTexture;\nuniform sampler2D ourTexture2;\nvoid main()\n{\n    FragColor = mix(texture(ourTexture, TexCoord), texture(ourTexture2, TexCoord), 0.5);\n}\n",[171,7065,7066,7072,7078,7084,7090,7096,7102,7108,7114,7120,7124,7134,7144,7148,7152,7180,7194,7198,7202,7214,7230,7236,7240,7256,7274,7298,7306,7310,7314,7318,7326,7330,7334,7352,7396,7400,7404,7422,7456,7460,7464,7516,7520,7540,7560,7580,7600,7614,7628,7642,7646,7650,7664,7678,7688,7708,7716,7720,7730,7750,7758,7762,7766,7794,7822,7826,7840,7854,7858,7862,7866,7870,7876,7886,7896,7902,7906,7910,7944,7956,7972,7978,7988,7992,7996,8002,8008,8012,8016,8028,8044,8054,8058,8062,8067,8075,8079,8089,8094,8134,8171,8205,8239,8275,8313,8317,8353,8387,8419,8451,8485,8521,8525,8559,8595,8633,8671,8707,8741,8745,8777,8811,8847,8883,8917,8949,8953,8991,9027,9061,9095,9131,9169,9173,9209,9243,9275,9307,9341,9376,9381,9385,9390,9394,9398,9406,9414,9430,9446,9450,9454,9460,9468,9476,9484,9492,9500,9516,9524,9528,9532,9538,9546,9554,9562,9570,9578,9594,9602,9606,9610,9614,9622,9636,9644,9648,9652,9660,9674,9682,9692,9696,9702,9712,9732,9736,9740,9775,9787,9791,9795,9837,9847,9851,9855,9871,9875,9879,9891,9895,9901,9905,9909,9939,9952,9956,9960,9968,9972,9988,10006,10010,10026,10044,10048,10064,10082,10086,10102,10118,10122,10128,10132,10137,10153,10158,10163,10170,10175,10180,10185,10200,10215,10230,10245,10252,10261,10266,10271,10280,10285,10290,10295,10300,10309,10314,10337],{"__ignoreMap":169},[93,7067,7068,7070],{"class":175,"line":176},[93,7069,574],{"class":192},[93,7071,577],{"class":503},[93,7073,7074,7076],{"class":175,"line":186},[93,7075,574],{"class":192},[93,7077,584],{"class":503},[93,7079,7080,7082],{"class":175,"line":253},[93,7081,574],{"class":192},[93,7083,591],{"class":503},[93,7085,7086,7088],{"class":175,"line":357},[93,7087,574],{"class":192},[93,7089,598],{"class":503},[93,7091,7092,7094],{"class":175,"line":364},[93,7093,574],{"class":192},[93,7095,605],{"class":503},[93,7097,7098,7100],{"class":175,"line":370},[93,7099,574],{"class":192},[93,7101,612],{"class":503},[93,7103,7104,7106],{"class":175,"line":375},[93,7105,574],{"class":192},[93,7107,619],{"class":503},[93,7109,7110,7112],{"class":175,"line":381},[93,7111,574],{"class":192},[93,7113,626],{"class":503},[93,7115,7116,7118],{"class":175,"line":386},[93,7117,574],{"class":192},[93,7119,633],{"class":503},[93,7121,7122],{"class":175,"line":398},[93,7123,361],{"emptyLinePlaceholder":360},[93,7125,7126,7128,7130,7132],{"class":175,"line":404},[93,7127,642],{"class":192},[93,7129,645],{"class":192},[93,7131,648],{"class":179},[93,7133,651],{"class":182},[93,7135,7136,7138,7140,7142],{"class":175,"line":431},[93,7137,642],{"class":192},[93,7139,645],{"class":192},[93,7141,196],{"class":179},[93,7143,651],{"class":182},[93,7145,7146],{"class":175,"line":445},[93,7147,361],{"emptyLinePlaceholder":360},[93,7149,7150],{"class":175,"line":668},[93,7151,672],{"class":671},[93,7153,7154,7156,7158,7160,7162,7164,7166,7168,7170,7172,7174,7176,7178],{"class":175,"line":675},[93,7155,389],{"class":192},[93,7157,680],{"class":179},[93,7159,215],{"class":182},[93,7161,685],{"class":179},[93,7163,415],{"class":192},[93,7165,691],{"class":690},[93,7167,240],{"class":182},[93,7169,696],{"class":192},[93,7171,699],{"class":690},[93,7173,240],{"class":182},[93,7175,696],{"class":192},[93,7177,706],{"class":690},[93,7179,709],{"class":182},[93,7181,7182,7184,7186,7188,7190,7192],{"class":175,"line":712},[93,7183,715],{"class":179},[93,7185,215],{"class":182},[93,7187,720],{"class":218},[93,7189,240],{"class":182},[93,7191,720],{"class":218},[93,7193,727],{"class":182},[93,7195,7196],{"class":175,"line":730},[93,7197,448],{"class":182},[93,7199,7200],{"class":175,"line":735},[93,7201,361],{"emptyLinePlaceholder":360},[93,7203,7204,7206,7208,7210,7212],{"class":175,"line":740},[93,7205,743],{"class":179},[93,7207,199],{"class":182},[93,7209,748],{"class":179},[93,7211,751],{"class":179},[93,7213,754],{"class":182},[93,7215,7216,7218,7220,7222,7224,7226,7228],{"class":175,"line":757},[93,7217,760],{"class":192},[93,7219,763],{"class":179},[93,7221,766],{"class":192},[93,7223,769],{"class":179},[93,7225,199],{"class":182},[93,7227,774],{"class":179},[93,7229,651],{"class":182},[93,7231,7232,7234],{"class":175,"line":779},[93,7233,782],{"class":192},[93,7235,785],{"class":182},[93,7237,7238],{"class":175,"line":788},[93,7239,791],{"class":671},[93,7241,7242,7244,7246,7248,7250,7252,7254],{"class":175,"line":794},[93,7243,797],{"class":192},[93,7245,763],{"class":179},[93,7247,199],{"class":182},[93,7249,804],{"class":179},[93,7251,807],{"class":182},[93,7253,748],{"class":179},[93,7255,812],{"class":182},[93,7257,7258,7260,7262,7264,7266,7268,7270,7272],{"class":175,"line":815},[93,7259,818],{"class":182},[93,7261,821],{"class":192},[93,7263,824],{"class":182},[93,7265,827],{"class":192},[93,7267,763],{"class":179},[93,7269,832],{"class":182},[93,7271,835],{"class":192},[93,7273,838],{"class":182},[93,7275,7276,7278,7280,7282,7284,7286,7288,7290,7292,7294,7296],{"class":175,"line":841},[93,7277,844],{"class":179},[93,7279,847],{"class":182},[93,7281,850],{"class":192},[93,7283,853],{"class":503},[93,7285,856],{"class":192},[93,7287,859],{"class":182},[93,7289,862],{"class":179},[93,7291,865],{"class":182},[93,7293,850],{"class":192},[93,7295,769],{"class":179},[93,7297,872],{"class":182},[93,7299,7300,7302,7304],{"class":175,"line":875},[93,7301,797],{"class":192},[93,7303,880],{"class":503},[93,7305,651],{"class":182},[93,7307,7308],{"class":175,"line":885},[93,7309,888],{"class":182},[93,7311,7312],{"class":175,"line":891},[93,7313,448],{"class":182},[93,7315,7316],{"class":175,"line":896},[93,7317,361],{"emptyLinePlaceholder":360},[93,7319,7320,7322,7324],{"class":175,"line":901},[93,7321,696],{"class":192},[93,7323,392],{"class":179},[93,7325,754],{"class":182},[93,7327,7328],{"class":175,"line":910},[93,7329,361],{"emptyLinePlaceholder":360},[93,7331,7332],{"class":175,"line":932},[93,7333,4666],{"class":671},[93,7335,7336,7338,7340,7342,7344,7346,7348,7350],{"class":175,"line":971},[93,7337,913],{"class":179},[93,7339,4285],{"class":182},[93,7341,193],{"class":192},[93,7343,921],{"class":179},[93,7345,215],{"class":182},[93,7347,247],{"class":218},[93,7349,222],{"class":192},[93,7351,428],{"class":182},[93,7353,7354,7356,7358,7360,7362,7364,7366,7368,7370,7372,7374,7376,7378,7380,7382,7384,7386,7388,7390,7392,7394],{"class":175,"line":1018},[93,7355,4689],{"class":182},[93,7357,193],{"class":192},[93,7359,978],{"class":179},[93,7361,3972],{"class":182},[93,7363,212],{"class":179},[93,7365,215],{"class":182},[93,7367,1778],{"class":192},[93,7369,3985],{"class":218},[93,7371,222],{"class":192},[93,7373,225],{"class":182},[93,7375,232],{"class":179},[93,7377,215],{"class":182},[93,7379,247],{"class":218},[93,7381,222],{"class":192},[93,7383,240],{"class":182},[93,7385,237],{"class":218},[93,7387,222],{"class":192},[93,7389,240],{"class":182},[93,7391,237],{"class":218},[93,7393,222],{"class":192},[93,7395,250],{"class":182},[93,7397,7398],{"class":175,"line":1023},[93,7399,361],{"emptyLinePlaceholder":360},[93,7401,7402],{"class":175,"line":1048},[93,7403,4738],{"class":671},[93,7405,7406,7408,7410,7412,7414,7416,7418,7420],{"class":175,"line":1071},[93,7407,913],{"class":179},[93,7409,4280],{"class":182},[93,7411,193],{"class":192},[93,7413,921],{"class":179},[93,7415,215],{"class":182},[93,7417,247],{"class":218},[93,7419,222],{"class":192},[93,7421,428],{"class":182},[93,7423,7424,7426,7428,7430,7432,7434,7436,7438,7440,7442,7444,7446,7448,7450,7452,7454],{"class":175,"line":1097},[93,7425,4761],{"class":182},[93,7427,193],{"class":192},[93,7429,4766],{"class":179},[93,7431,4769],{"class":182},[93,7433,232],{"class":179},[93,7435,215],{"class":182},[93,7437,237],{"class":218},[93,7439,222],{"class":192},[93,7441,240],{"class":182},[93,7443,237],{"class":218},[93,7445,222],{"class":192},[93,7447,240],{"class":182},[93,7449,1778],{"class":192},[93,7451,4790],{"class":218},[93,7453,222],{"class":192},[93,7455,250],{"class":182},[93,7457,7458],{"class":175,"line":1120},[93,7459,361],{"emptyLinePlaceholder":360},[93,7461,7462],{"class":175,"line":1137},[93,7463,4803],{"class":671},[93,7465,7466,7468,7470,7472,7474,7476,7478,7480,7482,7484,7486,7488,7490,7492,7494,7496,7498,7500,7502,7504,7506,7508,7510,7512,7514],{"class":175,"line":1156},[93,7467,913],{"class":179},[93,7469,4275],{"class":182},[93,7471,193],{"class":192},[93,7473,4814],{"class":179},[93,7475,215],{"class":182},[93,7477,212],{"class":179},[93,7479,215],{"class":182},[93,7481,3740],{"class":218},[93,7483,222],{"class":192},[93,7485,2553],{"class":182},[93,7487,2550],{"class":192},[93,7489,2559],{"class":182},[93,7491,1520],{"class":218},[93,7493,4835],{"class":192},[93,7495,824],{"class":182},[93,7497,2550],{"class":192},[93,7499,2559],{"class":182},[93,7501,1525],{"class":218},[93,7503,240],{"class":182},[93,7505,3623],{"class":218},[93,7507,222],{"class":192},[93,7509,240],{"class":182},[93,7511,3630],{"class":218},[93,7513,222],{"class":192},[93,7515,428],{"class":182},[93,7517,7518],{"class":175,"line":1171},[93,7519,361],{"emptyLinePlaceholder":360},[93,7521,7522,7524,7526,7528,7530,7532,7534,7536,7538],{"class":175,"line":1176},[93,7523,1026],{"class":192},[93,7525,1029],{"class":182},[93,7527,193],{"class":192},[93,7529,751],{"class":179},[93,7531,807],{"class":182},[93,7533,1038],{"class":179},[93,7535,215],{"class":182},[93,7537,1043],{"class":503},[93,7539,428],{"class":182},[93,7541,7542,7544,7546,7548,7550,7552,7554,7556,7558],{"class":175,"line":1182},[93,7543,1026],{"class":192},[93,7545,1053],{"class":182},[93,7547,193],{"class":192},[93,7549,751],{"class":179},[93,7551,807],{"class":182},[93,7553,1038],{"class":179},[93,7555,215],{"class":182},[93,7557,1066],{"class":503},[93,7559,428],{"class":182},[93,7561,7562,7564,7566,7568,7570,7572,7574,7576,7578],{"class":175,"line":1202},[93,7563,1074],{"class":179},[93,7565,199],{"class":182},[93,7567,1079],{"class":179},[93,7569,1082],{"class":182},[93,7571,193],{"class":192},[93,7573,648],{"class":179},[93,7575,199],{"class":182},[93,7577,1091],{"class":179},[93,7579,1094],{"class":182},[93,7581,7582,7584,7586,7588,7590,7592,7594,7596,7598],{"class":175,"line":1218},[93,7583,1074],{"class":179},[93,7585,199],{"class":182},[93,7587,1079],{"class":179},[93,7589,1106],{"class":182},[93,7591,193],{"class":192},[93,7593,648],{"class":179},[93,7595,199],{"class":182},[93,7597,1091],{"class":179},[93,7599,1117],{"class":182},[93,7601,7602,7604,7606,7608,7610,7612],{"class":175,"line":1233},[93,7603,1074],{"class":179},[93,7605,199],{"class":182},[93,7607,1127],{"class":179},[93,7609,1130],{"class":182},[93,7611,720],{"class":218},[93,7613,428],{"class":182},[93,7615,7616,7618,7620,7622,7624,7626],{"class":175,"line":1255},[93,7617,1074],{"class":179},[93,7619,199],{"class":182},[93,7621,1144],{"class":179},[93,7623,1147],{"class":182},[93,7625,1150],{"class":179},[93,7627,1153],{"class":182},[93,7629,7630,7632,7634,7636,7638,7640],{"class":175,"line":1264},[93,7631,1074],{"class":179},[93,7633,199],{"class":182},[93,7635,1144],{"class":179},[93,7637,1130],{"class":182},[93,7639,1150],{"class":179},[93,7641,1153],{"class":182},[93,7643,7644],{"class":175,"line":1269},[93,7645,361],{"emptyLinePlaceholder":360},[93,7647,7648],{"class":175,"line":1281},[93,7649,1179],{"class":671},[93,7651,7652,7654,7656,7658,7660,7662],{"class":175,"line":1303},[93,7653,1185],{"class":179},[93,7655,199],{"class":182},[93,7657,1190],{"class":179},[93,7659,1193],{"class":182},[93,7661,1196],{"class":179},[93,7663,1199],{"class":182},[93,7665,7666,7668,7670,7672,7674,7676],{"class":175,"line":1312},[93,7667,1185],{"class":179},[93,7669,199],{"class":182},[93,7671,1190],{"class":179},[93,7673,1193],{"class":182},[93,7675,1196],{"class":179},[93,7677,1215],{"class":182},[93,7679,7680,7682,7684,7686],{"class":175,"line":1317},[93,7681,1221],{"class":192},[93,7683,1224],{"class":182},[93,7685,1227],{"class":179},[93,7687,1230],{"class":182},[93,7689,7690,7692,7694,7696,7698,7700,7702,7704,7706],{"class":175,"line":1323},[93,7691,844],{"class":179},[93,7693,847],{"class":182},[93,7695,850],{"class":192},[93,7697,1242],{"class":503},[93,7699,856],{"class":192},[93,7701,1029],{"class":182},[93,7703,850],{"class":192},[93,7705,769],{"class":179},[93,7707,872],{"class":182},[93,7709,7710,7712,7714],{"class":175,"line":1357},[93,7711,797],{"class":192},[93,7713,351],{"class":218},[93,7715,651],{"class":182},[93,7717,7718],{"class":175,"line":1389},[93,7719,888],{"class":182},[93,7721,7722,7724,7726,7728],{"class":175,"line":1394},[93,7723,1221],{"class":192},[93,7725,1274],{"class":182},[93,7727,1227],{"class":179},[93,7729,1230],{"class":182},[93,7731,7732,7734,7736,7738,7740,7742,7744,7746,7748],{"class":175,"line":1412},[93,7733,844],{"class":179},[93,7735,847],{"class":182},[93,7737,850],{"class":192},[93,7739,1290],{"class":503},[93,7741,856],{"class":192},[93,7743,1053],{"class":182},[93,7745,850],{"class":192},[93,7747,769],{"class":179},[93,7749,872],{"class":182},[93,7751,7752,7754,7756],{"class":175,"line":1428},[93,7753,797],{"class":192},[93,7755,351],{"class":218},[93,7757,651],{"class":182},[93,7759,7760],{"class":175,"line":1433},[93,7761,888],{"class":182},[93,7763,7764],{"class":175,"line":1438},[93,7765,1320],{"class":182},[93,7767,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792],{"class":175,"line":1443},[93,7769,1185],{"class":179},[93,7771,1328],{"class":182},[93,7773,850],{"class":192},[93,7775,1333],{"class":503},[93,7777,856],{"class":192},[93,7779,1338],{"class":182},[93,7781,850],{"class":192},[93,7783,1343],{"class":503},[93,7785,856],{"class":192},[93,7787,1348],{"class":182},[93,7789,850],{"class":192},[93,7791,769],{"class":179},[93,7793,872],{"class":182},[93,7795,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820],{"class":175,"line":1449},[93,7797,1185],{"class":179},[93,7799,1328],{"class":182},[93,7801,850],{"class":192},[93,7803,1366],{"class":503},[93,7805,856],{"class":192},[93,7807,1371],{"class":182},[93,7809,850],{"class":192},[93,7811,1343],{"class":503},[93,7813,856],{"class":192},[93,7815,1380],{"class":182},[93,7817,850],{"class":192},[93,7819,769],{"class":179},[93,7821,872],{"class":182},[93,7823,7824],{"class":175,"line":1457},[93,7825,361],{"emptyLinePlaceholder":360},[93,7827,7828,7830,7832,7834,7836,7838],{"class":175,"line":1471},[93,7829,1074],{"class":179},[93,7831,199],{"class":182},[93,7833,1401],{"class":179},[93,7835,215],{"class":182},[93,7837,1406],{"class":503},[93,7839,1409],{"class":182},[93,7841,7842,7844,7846,7848,7850,7852],{"class":175,"line":1483},[93,7843,1074],{"class":179},[93,7845,199],{"class":182},[93,7847,1401],{"class":179},[93,7849,215],{"class":182},[93,7851,1406],{"class":503},[93,7853,1425],{"class":182},[93,7855,7856],{"class":175,"line":1491},[93,7857,361],{"emptyLinePlaceholder":360},[93,7859,7860],{"class":175,"line":1496},[93,7861,361],{"emptyLinePlaceholder":360},[93,7863,7864],{"class":175,"line":1502},[93,7865,1320],{"class":182},[93,7867,7868],{"class":175,"line":1544},[93,7869,1446],{"class":671},[93,7871,7872,7874],{"class":175,"line":1560},[93,7873,1452],{"class":179},[93,7875,812],{"class":182},[93,7877,7878,7880,7882,7884],{"class":175,"line":1578},[93,7879,1460],{"class":179},[93,7881,1463],{"class":182},[93,7883,1466],{"class":218},[93,7885,428],{"class":182},[93,7887,7888,7890,7892,7894],{"class":175,"line":1586},[93,7889,1460],{"class":179},[93,7891,1476],{"class":182},[93,7893,1466],{"class":218},[93,7895,428],{"class":182},[93,7897,7898,7900],{"class":175,"line":1598},[93,7899,1460],{"class":179},[93,7901,1488],{"class":182},[93,7903,7904],{"class":175,"line":1603},[93,7905,361],{"emptyLinePlaceholder":360},[93,7907,7908],{"class":175,"line":1608},[93,7909,1499],{"class":671},[93,7911,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7936,7938,7940,7942],{"class":175,"line":1617},[93,7913,1505],{"class":179},[93,7915,415],{"class":192},[93,7917,1510],{"class":182},[93,7919,193],{"class":192},[93,7921,1515],{"class":179},[93,7923,215],{"class":182},[93,7925,1520],{"class":218},[93,7927,240],{"class":182},[93,7929,1525],{"class":218},[93,7931,240],{"class":182},[93,7933,1530],{"class":503},[93,7935,240],{"class":182},[93,7937,1535],{"class":218},[93,7939,240],{"class":182},[93,7941,1535],{"class":218},[93,7943,428],{"class":182},[93,7945,7946,7948,7950,7952,7954],{"class":175,"line":1626},[93,7947,1221],{"class":192},[93,7949,1549],{"class":182},[93,7951,1552],{"class":192},[93,7953,1555],{"class":218},[93,7955,709],{"class":182},[93,7957,7958,7960,7962,7964,7966,7968,7970],{"class":175,"line":1631},[93,7959,844],{"class":179},[93,7961,1328],{"class":182},[93,7963,850],{"class":192},[93,7965,1569],{"class":503},[93,7967,856],{"class":192},[93,7969,769],{"class":179},[93,7971,872],{"class":182},[93,7973,7974,7976],{"class":175,"line":1637},[93,7975,1581],{"class":179},[93,7977,812],{"class":182},[93,7979,7980,7982,7984,7986],{"class":175,"line":1653},[93,7981,797],{"class":192},[93,7983,1591],{"class":192},[93,7985,517],{"class":218},[93,7987,651],{"class":182},[93,7989,7990],{"class":175,"line":1671},[93,7991,888],{"class":182},[93,7993,7994],{"class":175,"line":1682},[93,7995,1320],{"class":182},[93,7997,7998,8000],{"class":175,"line":1687},[93,7999,1611],{"class":179},[93,8001,1614],{"class":182},[93,8003,8004,8006],{"class":175,"line":1692},[93,8005,1620],{"class":179},[93,8007,1623],{"class":182},[93,8009,8010],{"class":175,"line":1705},[93,8011,361],{"emptyLinePlaceholder":360},[93,8013,8014],{"class":175,"line":1711},[93,8015,1634],{"class":671},[93,8017,8018,8020,8022,8024,8026],{"class":175,"line":1769},[93,8019,1221],{"class":192},[93,8021,824],{"class":182},[93,8023,1644],{"class":192},[93,8025,1647],{"class":179},[93,8027,1650],{"class":182},[93,8029,8030,8032,8034,8036,8038,8040,8042],{"class":175,"line":1826},[93,8031,844],{"class":179},[93,8033,1328],{"class":182},[93,8035,850],{"class":192},[93,8037,1662],{"class":503},[93,8039,856],{"class":192},[93,8041,769],{"class":179},[93,8043,872],{"class":182},[93,8045,8046,8048,8050,8052],{"class":175,"line":1885},[93,8047,797],{"class":192},[93,8049,1591],{"class":192},[93,8051,517],{"class":218},[93,8053,651],{"class":182},[93,8055,8056],{"class":175,"line":1939},[93,8057,888],{"class":182},[93,8059,8060],{"class":175,"line":1945},[93,8061,361],{"emptyLinePlaceholder":360},[93,8063,8064],{"class":175,"line":1950},[93,8065,8066],{"class":671},"    \u002F\u002F 启用深度测试\n",[93,8068,8069,8072],{"class":175,"line":1965},[93,8070,8071],{"class":179},"    glEnable",[93,8073,8074],{"class":182},"(GL_DEPTH_TEST);\n",[93,8076,8077],{"class":175,"line":1984},[93,8078,361],{"emptyLinePlaceholder":360},[93,8080,8081,8083,8085,8087],{"class":175,"line":2002},[93,8082,1695],{"class":192},[93,8084,1698],{"class":182},[93,8086,193],{"class":192},[93,8088,785],{"class":182},[93,8090,8091],{"class":175,"line":2007},[93,8092,8093],{"class":671},"    \u002F\u002F 位置(3) + 纹理坐标(2)\n",[93,8095,8096,8099,8101,8103,8105,8107,8109,8111,8113,8115,8117,8119,8121,8123,8125,8127,8129,8131],{"class":175,"line":2012},[93,8097,8098],{"class":192},"    -",[93,8100,277],{"class":218},[93,8102,222],{"class":192},[93,8104,240],{"class":182},[93,8106,1778],{"class":192},[93,8108,277],{"class":218},[93,8110,222],{"class":192},[93,8112,240],{"class":182},[93,8114,1778],{"class":192},[93,8116,277],{"class":218},[93,8118,222],{"class":192},[93,8120,1719],{"class":182},[93,8122,237],{"class":218},[93,8124,222],{"class":192},[93,8126,240],{"class":182},[93,8128,237],{"class":218},[93,8130,222],{"class":192},[93,8132,8133],{"class":182},",\n",[93,8135,8136,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159,8161,8163,8165,8167,8169],{"class":175,"line":2018},[93,8137,8138],{"class":218},"     0.5",[93,8140,222],{"class":192},[93,8142,240],{"class":182},[93,8144,1778],{"class":192},[93,8146,277],{"class":218},[93,8148,222],{"class":192},[93,8150,240],{"class":182},[93,8152,1778],{"class":192},[93,8154,277],{"class":218},[93,8156,222],{"class":192},[93,8158,1719],{"class":182},[93,8160,247],{"class":218},[93,8162,222],{"class":192},[93,8164,240],{"class":182},[93,8166,237],{"class":218},[93,8168,222],{"class":192},[93,8170,8133],{"class":182},[93,8172,8173,8175,8177,8179,8181,8183,8185,8187,8189,8191,8193,8195,8197,8199,8201,8203],{"class":175,"line":2028},[93,8174,8138],{"class":218},[93,8176,222],{"class":192},[93,8178,1719],{"class":182},[93,8180,277],{"class":218},[93,8182,222],{"class":192},[93,8184,240],{"class":182},[93,8186,1778],{"class":192},[93,8188,277],{"class":218},[93,8190,222],{"class":192},[93,8192,1719],{"class":182},[93,8194,247],{"class":218},[93,8196,222],{"class":192},[93,8198,240],{"class":182},[93,8200,247],{"class":218},[93,8202,222],{"class":192},[93,8204,8133],{"class":182},[93,8206,8207,8209,8211,8213,8215,8217,8219,8221,8223,8225,8227,8229,8231,8233,8235,8237],{"class":175,"line":2038},[93,8208,8138],{"class":218},[93,8210,222],{"class":192},[93,8212,1719],{"class":182},[93,8214,277],{"class":218},[93,8216,222],{"class":192},[93,8218,240],{"class":182},[93,8220,1778],{"class":192},[93,8222,277],{"class":218},[93,8224,222],{"class":192},[93,8226,1719],{"class":182},[93,8228,247],{"class":218},[93,8230,222],{"class":192},[93,8232,240],{"class":182},[93,8234,247],{"class":218},[93,8236,222],{"class":192},[93,8238,8133],{"class":182},[93,8240,8241,8243,8245,8247,8249,8251,8253,8255,8257,8259,8261,8263,8265,8267,8269,8271,8273],{"class":175,"line":2058},[93,8242,8098],{"class":192},[93,8244,277],{"class":218},[93,8246,222],{"class":192},[93,8248,1719],{"class":182},[93,8250,277],{"class":218},[93,8252,222],{"class":192},[93,8254,240],{"class":182},[93,8256,1778],{"class":192},[93,8258,277],{"class":218},[93,8260,222],{"class":192},[93,8262,1719],{"class":182},[93,8264,237],{"class":218},[93,8266,222],{"class":192},[93,8268,240],{"class":182},[93,8270,247],{"class":218},[93,8272,222],{"class":192},[93,8274,8133],{"class":182},[93,8276,8277,8279,8281,8283,8285,8287,8289,8291,8293,8295,8297,8299,8301,8303,8305,8307,8309,8311],{"class":175,"line":2076},[93,8278,8098],{"class":192},[93,8280,277],{"class":218},[93,8282,222],{"class":192},[93,8284,240],{"class":182},[93,8286,1778],{"class":192},[93,8288,277],{"class":218},[93,8290,222],{"class":192},[93,8292,240],{"class":182},[93,8294,1778],{"class":192},[93,8296,277],{"class":218},[93,8298,222],{"class":192},[93,8300,1719],{"class":182},[93,8302,237],{"class":218},[93,8304,222],{"class":192},[93,8306,240],{"class":182},[93,8308,237],{"class":218},[93,8310,222],{"class":192},[93,8312,8133],{"class":182},[93,8314,8315],{"class":175,"line":2081},[93,8316,361],{"emptyLinePlaceholder":360},[93,8318,8319,8321,8323,8325,8327,8329,8331,8333,8335,8337,8339,8341,8343,8345,8347,8349,8351],{"class":175,"line":2087},[93,8320,8098],{"class":192},[93,8322,277],{"class":218},[93,8324,222],{"class":192},[93,8326,240],{"class":182},[93,8328,1778],{"class":192},[93,8330,277],{"class":218},[93,8332,222],{"class":192},[93,8334,1719],{"class":182},[93,8336,277],{"class":218},[93,8338,222],{"class":192},[93,8340,1719],{"class":182},[93,8342,237],{"class":218},[93,8344,222],{"class":192},[93,8346,240],{"class":182},[93,8348,237],{"class":218},[93,8350,222],{"class":192},[93,8352,8133],{"class":182},[93,8354,8355,8357,8359,8361,8363,8365,8367,8369,8371,8373,8375,8377,8379,8381,8383,8385],{"class":175,"line":2096},[93,8356,8138],{"class":218},[93,8358,222],{"class":192},[93,8360,240],{"class":182},[93,8362,1778],{"class":192},[93,8364,277],{"class":218},[93,8366,222],{"class":192},[93,8368,1719],{"class":182},[93,8370,277],{"class":218},[93,8372,222],{"class":192},[93,8374,1719],{"class":182},[93,8376,247],{"class":218},[93,8378,222],{"class":192},[93,8380,240],{"class":182},[93,8382,237],{"class":218},[93,8384,222],{"class":192},[93,8386,8133],{"class":182},[93,8388,8389,8391,8393,8395,8397,8399,8401,8403,8405,8407,8409,8411,8413,8415,8417],{"class":175,"line":2108},[93,8390,8138],{"class":218},[93,8392,222],{"class":192},[93,8394,1719],{"class":182},[93,8396,277],{"class":218},[93,8398,222],{"class":192},[93,8400,1719],{"class":182},[93,8402,277],{"class":218},[93,8404,222],{"class":192},[93,8406,1719],{"class":182},[93,8408,247],{"class":218},[93,8410,222],{"class":192},[93,8412,240],{"class":182},[93,8414,247],{"class":218},[93,8416,222],{"class":192},[93,8418,8133],{"class":182},[93,8420,8421,8423,8425,8427,8429,8431,8433,8435,8437,8439,8441,8443,8445,8447,8449],{"class":175,"line":2120},[93,8422,8138],{"class":218},[93,8424,222],{"class":192},[93,8426,1719],{"class":182},[93,8428,277],{"class":218},[93,8430,222],{"class":192},[93,8432,1719],{"class":182},[93,8434,277],{"class":218},[93,8436,222],{"class":192},[93,8438,1719],{"class":182},[93,8440,247],{"class":218},[93,8442,222],{"class":192},[93,8444,240],{"class":182},[93,8446,247],{"class":218},[93,8448,222],{"class":192},[93,8450,8133],{"class":182},[93,8452,8453,8455,8457,8459,8461,8463,8465,8467,8469,8471,8473,8475,8477,8479,8481,8483],{"class":175,"line":2130},[93,8454,8098],{"class":192},[93,8456,277],{"class":218},[93,8458,222],{"class":192},[93,8460,1719],{"class":182},[93,8462,277],{"class":218},[93,8464,222],{"class":192},[93,8466,1719],{"class":182},[93,8468,277],{"class":218},[93,8470,222],{"class":192},[93,8472,1719],{"class":182},[93,8474,237],{"class":218},[93,8476,222],{"class":192},[93,8478,240],{"class":182},[93,8480,247],{"class":218},[93,8482,222],{"class":192},[93,8484,8133],{"class":182},[93,8486,8487,8489,8491,8493,8495,8497,8499,8501,8503,8505,8507,8509,8511,8513,8515,8517,8519],{"class":175,"line":2141},[93,8488,8098],{"class":192},[93,8490,277],{"class":218},[93,8492,222],{"class":192},[93,8494,240],{"class":182},[93,8496,1778],{"class":192},[93,8498,277],{"class":218},[93,8500,222],{"class":192},[93,8502,1719],{"class":182},[93,8504,277],{"class":218},[93,8506,222],{"class":192},[93,8508,1719],{"class":182},[93,8510,237],{"class":218},[93,8512,222],{"class":192},[93,8514,240],{"class":182},[93,8516,237],{"class":218},[93,8518,222],{"class":192},[93,8520,8133],{"class":182},[93,8522,8523],{"class":175,"line":2151},[93,8524,361],{"emptyLinePlaceholder":360},[93,8526,8527,8529,8531,8533,8535,8537,8539,8541,8543,8545,8547,8549,8551,8553,8555,8557],{"class":175,"line":2173},[93,8528,8098],{"class":192},[93,8530,277],{"class":218},[93,8532,222],{"class":192},[93,8534,1719],{"class":182},[93,8536,277],{"class":218},[93,8538,222],{"class":192},[93,8540,1719],{"class":182},[93,8542,277],{"class":218},[93,8544,222],{"class":192},[93,8546,1719],{"class":182},[93,8548,247],{"class":218},[93,8550,222],{"class":192},[93,8552,240],{"class":182},[93,8554,237],{"class":218},[93,8556,222],{"class":192},[93,8558,8133],{"class":182},[93,8560,8561,8563,8565,8567,8569,8571,8573,8575,8577,8579,8581,8583,8585,8587,8589,8591,8593],{"class":175,"line":2185},[93,8562,8098],{"class":192},[93,8564,277],{"class":218},[93,8566,222],{"class":192},[93,8568,1719],{"class":182},[93,8570,277],{"class":218},[93,8572,222],{"class":192},[93,8574,240],{"class":182},[93,8576,1778],{"class":192},[93,8578,277],{"class":218},[93,8580,222],{"class":192},[93,8582,1719],{"class":182},[93,8584,247],{"class":218},[93,8586,222],{"class":192},[93,8588,240],{"class":182},[93,8590,247],{"class":218},[93,8592,222],{"class":192},[93,8594,8133],{"class":182},[93,8596,8597,8599,8601,8603,8605,8607,8609,8611,8613,8615,8617,8619,8621,8623,8625,8627,8629,8631],{"class":175,"line":2190},[93,8598,8098],{"class":192},[93,8600,277],{"class":218},[93,8602,222],{"class":192},[93,8604,240],{"class":182},[93,8606,1778],{"class":192},[93,8608,277],{"class":218},[93,8610,222],{"class":192},[93,8612,240],{"class":182},[93,8614,1778],{"class":192},[93,8616,277],{"class":218},[93,8618,222],{"class":192},[93,8620,1719],{"class":182},[93,8622,237],{"class":218},[93,8624,222],{"class":192},[93,8626,240],{"class":182},[93,8628,247],{"class":218},[93,8630,222],{"class":192},[93,8632,8133],{"class":182},[93,8634,8635,8637,8639,8641,8643,8645,8647,8649,8651,8653,8655,8657,8659,8661,8663,8665,8667,8669],{"class":175,"line":2196},[93,8636,8098],{"class":192},[93,8638,277],{"class":218},[93,8640,222],{"class":192},[93,8642,240],{"class":182},[93,8644,1778],{"class":192},[93,8646,277],{"class":218},[93,8648,222],{"class":192},[93,8650,240],{"class":182},[93,8652,1778],{"class":192},[93,8654,277],{"class":218},[93,8656,222],{"class":192},[93,8658,1719],{"class":182},[93,8660,237],{"class":218},[93,8662,222],{"class":192},[93,8664,240],{"class":182},[93,8666,247],{"class":218},[93,8668,222],{"class":192},[93,8670,8133],{"class":182},[93,8672,8673,8675,8677,8679,8681,8683,8685,8687,8689,8691,8693,8695,8697,8699,8701,8703,8705],{"class":175,"line":2204},[93,8674,8098],{"class":192},[93,8676,277],{"class":218},[93,8678,222],{"class":192},[93,8680,240],{"class":182},[93,8682,1778],{"class":192},[93,8684,277],{"class":218},[93,8686,222],{"class":192},[93,8688,1719],{"class":182},[93,8690,277],{"class":218},[93,8692,222],{"class":192},[93,8694,1719],{"class":182},[93,8696,237],{"class":218},[93,8698,222],{"class":192},[93,8700,240],{"class":182},[93,8702,237],{"class":218},[93,8704,222],{"class":192},[93,8706,8133],{"class":182},[93,8708,8709,8711,8713,8715,8717,8719,8721,8723,8725,8727,8729,8731,8733,8735,8737,8739],{"class":175,"line":2214},[93,8710,8098],{"class":192},[93,8712,277],{"class":218},[93,8714,222],{"class":192},[93,8716,1719],{"class":182},[93,8718,277],{"class":218},[93,8720,222],{"class":192},[93,8722,1719],{"class":182},[93,8724,277],{"class":218},[93,8726,222],{"class":192},[93,8728,1719],{"class":182},[93,8730,247],{"class":218},[93,8732,222],{"class":192},[93,8734,240],{"class":182},[93,8736,237],{"class":218},[93,8738,222],{"class":192},[93,8740,8133],{"class":182},[93,8742,8743],{"class":175,"line":2223},[93,8744,361],{"emptyLinePlaceholder":360},[93,8746,8747,8749,8751,8753,8755,8757,8759,8761,8763,8765,8767,8769,8771,8773,8775],{"class":175,"line":2233},[93,8748,8138],{"class":218},[93,8750,222],{"class":192},[93,8752,1719],{"class":182},[93,8754,277],{"class":218},[93,8756,222],{"class":192},[93,8758,1719],{"class":182},[93,8760,277],{"class":218},[93,8762,222],{"class":192},[93,8764,1719],{"class":182},[93,8766,247],{"class":218},[93,8768,222],{"class":192},[93,8770,240],{"class":182},[93,8772,237],{"class":218},[93,8774,222],{"class":192},[93,8776,8133],{"class":182},[93,8778,8779,8781,8783,8785,8787,8789,8791,8793,8795,8797,8799,8801,8803,8805,8807,8809],{"class":175,"line":2242},[93,8780,8138],{"class":218},[93,8782,222],{"class":192},[93,8784,1719],{"class":182},[93,8786,277],{"class":218},[93,8788,222],{"class":192},[93,8790,240],{"class":182},[93,8792,1778],{"class":192},[93,8794,277],{"class":218},[93,8796,222],{"class":192},[93,8798,1719],{"class":182},[93,8800,247],{"class":218},[93,8802,222],{"class":192},[93,8804,240],{"class":182},[93,8806,247],{"class":218},[93,8808,222],{"class":192},[93,8810,8133],{"class":182},[93,8812,8813,8815,8817,8819,8821,8823,8825,8827,8829,8831,8833,8835,8837,8839,8841,8843,8845],{"class":175,"line":2251},[93,8814,8138],{"class":218},[93,8816,222],{"class":192},[93,8818,240],{"class":182},[93,8820,1778],{"class":192},[93,8822,277],{"class":218},[93,8824,222],{"class":192},[93,8826,240],{"class":182},[93,8828,1778],{"class":192},[93,8830,277],{"class":218},[93,8832,222],{"class":192},[93,8834,1719],{"class":182},[93,8836,237],{"class":218},[93,8838,222],{"class":192},[93,8840,240],{"class":182},[93,8842,247],{"class":218},[93,8844,222],{"class":192},[93,8846,8133],{"class":182},[93,8848,8849,8851,8853,8855,8857,8859,8861,8863,8865,8867,8869,8871,8873,8875,8877,8879,8881],{"class":175,"line":2270},[93,8850,8138],{"class":218},[93,8852,222],{"class":192},[93,8854,240],{"class":182},[93,8856,1778],{"class":192},[93,8858,277],{"class":218},[93,8860,222],{"class":192},[93,8862,240],{"class":182},[93,8864,1778],{"class":192},[93,8866,277],{"class":218},[93,8868,222],{"class":192},[93,8870,1719],{"class":182},[93,8872,237],{"class":218},[93,8874,222],{"class":192},[93,8876,240],{"class":182},[93,8878,247],{"class":218},[93,8880,222],{"class":192},[93,8882,8133],{"class":182},[93,8884,8885,8887,8889,8891,8893,8895,8897,8899,8901,8903,8905,8907,8909,8911,8913,8915],{"class":175,"line":2279},[93,8886,8138],{"class":218},[93,8888,222],{"class":192},[93,8890,240],{"class":182},[93,8892,1778],{"class":192},[93,8894,277],{"class":218},[93,8896,222],{"class":192},[93,8898,1719],{"class":182},[93,8900,277],{"class":218},[93,8902,222],{"class":192},[93,8904,1719],{"class":182},[93,8906,237],{"class":218},[93,8908,222],{"class":192},[93,8910,240],{"class":182},[93,8912,237],{"class":218},[93,8914,222],{"class":192},[93,8916,8133],{"class":182},[93,8918,8919,8921,8923,8925,8927,8929,8931,8933,8935,8937,8939,8941,8943,8945,8947],{"class":175,"line":2284},[93,8920,8138],{"class":218},[93,8922,222],{"class":192},[93,8924,1719],{"class":182},[93,8926,277],{"class":218},[93,8928,222],{"class":192},[93,8930,1719],{"class":182},[93,8932,277],{"class":218},[93,8934,222],{"class":192},[93,8936,1719],{"class":182},[93,8938,247],{"class":218},[93,8940,222],{"class":192},[93,8942,240],{"class":182},[93,8944,237],{"class":218},[93,8946,222],{"class":192},[93,8948,8133],{"class":182},[93,8950,8951],{"class":175,"line":2289},[93,8952,361],{"emptyLinePlaceholder":360},[93,8954,8955,8957,8959,8961,8963,8965,8967,8969,8971,8973,8975,8977,8979,8981,8983,8985,8987,8989],{"class":175,"line":2295},[93,8956,8098],{"class":192},[93,8958,277],{"class":218},[93,8960,222],{"class":192},[93,8962,240],{"class":182},[93,8964,1778],{"class":192},[93,8966,277],{"class":218},[93,8968,222],{"class":192},[93,8970,240],{"class":182},[93,8972,1778],{"class":192},[93,8974,277],{"class":218},[93,8976,222],{"class":192},[93,8978,1719],{"class":182},[93,8980,237],{"class":218},[93,8982,222],{"class":192},[93,8984,240],{"class":182},[93,8986,247],{"class":218},[93,8988,222],{"class":192},[93,8990,8133],{"class":182},[93,8992,8993,8995,8997,8999,9001,9003,9005,9007,9009,9011,9013,9015,9017,9019,9021,9023,9025],{"class":175,"line":2305},[93,8994,8138],{"class":218},[93,8996,222],{"class":192},[93,8998,240],{"class":182},[93,9000,1778],{"class":192},[93,9002,277],{"class":218},[93,9004,222],{"class":192},[93,9006,240],{"class":182},[93,9008,1778],{"class":192},[93,9010,277],{"class":218},[93,9012,222],{"class":192},[93,9014,1719],{"class":182},[93,9016,247],{"class":218},[93,9018,222],{"class":192},[93,9020,240],{"class":182},[93,9022,247],{"class":218},[93,9024,222],{"class":192},[93,9026,8133],{"class":182},[93,9028,9029,9031,9033,9035,9037,9039,9041,9043,9045,9047,9049,9051,9053,9055,9057,9059],{"class":175,"line":2322},[93,9030,8138],{"class":218},[93,9032,222],{"class":192},[93,9034,240],{"class":182},[93,9036,1778],{"class":192},[93,9038,277],{"class":218},[93,9040,222],{"class":192},[93,9042,1719],{"class":182},[93,9044,277],{"class":218},[93,9046,222],{"class":192},[93,9048,1719],{"class":182},[93,9050,247],{"class":218},[93,9052,222],{"class":192},[93,9054,240],{"class":182},[93,9056,237],{"class":218},[93,9058,222],{"class":192},[93,9060,8133],{"class":182},[93,9062,9063,9065,9067,9069,9071,9073,9075,9077,9079,9081,9083,9085,9087,9089,9091,9093],{"class":175,"line":2334},[93,9064,8138],{"class":218},[93,9066,222],{"class":192},[93,9068,240],{"class":182},[93,9070,1778],{"class":192},[93,9072,277],{"class":218},[93,9074,222],{"class":192},[93,9076,1719],{"class":182},[93,9078,277],{"class":218},[93,9080,222],{"class":192},[93,9082,1719],{"class":182},[93,9084,247],{"class":218},[93,9086,222],{"class":192},[93,9088,240],{"class":182},[93,9090,237],{"class":218},[93,9092,222],{"class":192},[93,9094,8133],{"class":182},[93,9096,9097,9099,9101,9103,9105,9107,9109,9111,9113,9115,9117,9119,9121,9123,9125,9127,9129],{"class":175,"line":2339},[93,9098,8098],{"class":192},[93,9100,277],{"class":218},[93,9102,222],{"class":192},[93,9104,240],{"class":182},[93,9106,1778],{"class":192},[93,9108,277],{"class":218},[93,9110,222],{"class":192},[93,9112,1719],{"class":182},[93,9114,277],{"class":218},[93,9116,222],{"class":192},[93,9118,1719],{"class":182},[93,9120,237],{"class":218},[93,9122,222],{"class":192},[93,9124,240],{"class":182},[93,9126,237],{"class":218},[93,9128,222],{"class":192},[93,9130,8133],{"class":182},[93,9132,9133,9135,9137,9139,9141,9143,9145,9147,9149,9151,9153,9155,9157,9159,9161,9163,9165,9167],{"class":175,"line":2345},[93,9134,8098],{"class":192},[93,9136,277],{"class":218},[93,9138,222],{"class":192},[93,9140,240],{"class":182},[93,9142,1778],{"class":192},[93,9144,277],{"class":218},[93,9146,222],{"class":192},[93,9148,240],{"class":182},[93,9150,1778],{"class":192},[93,9152,277],{"class":218},[93,9154,222],{"class":192},[93,9156,1719],{"class":182},[93,9158,237],{"class":218},[93,9160,222],{"class":192},[93,9162,240],{"class":182},[93,9164,247],{"class":218},[93,9166,222],{"class":192},[93,9168,8133],{"class":182},[93,9170,9171],{"class":175,"line":2355},[93,9172,361],{"emptyLinePlaceholder":360},[93,9174,9175,9177,9179,9181,9183,9185,9187,9189,9191,9193,9195,9197,9199,9201,9203,9205,9207],{"class":175,"line":2372},[93,9176,8098],{"class":192},[93,9178,277],{"class":218},[93,9180,222],{"class":192},[93,9182,1719],{"class":182},[93,9184,277],{"class":218},[93,9186,222],{"class":192},[93,9188,240],{"class":182},[93,9190,1778],{"class":192},[93,9192,277],{"class":218},[93,9194,222],{"class":192},[93,9196,1719],{"class":182},[93,9198,237],{"class":218},[93,9200,222],{"class":192},[93,9202,240],{"class":182},[93,9204,247],{"class":218},[93,9206,222],{"class":192},[93,9208,8133],{"class":182},[93,9210,9211,9213,9215,9217,9219,9221,9223,9225,9227,9229,9231,9233,9235,9237,9239,9241],{"class":175,"line":2384},[93,9212,8138],{"class":218},[93,9214,222],{"class":192},[93,9216,1719],{"class":182},[93,9218,277],{"class":218},[93,9220,222],{"class":192},[93,9222,240],{"class":182},[93,9224,1778],{"class":192},[93,9226,277],{"class":218},[93,9228,222],{"class":192},[93,9230,1719],{"class":182},[93,9232,247],{"class":218},[93,9234,222],{"class":192},[93,9236,240],{"class":182},[93,9238,247],{"class":218},[93,9240,222],{"class":192},[93,9242,8133],{"class":182},[93,9244,9245,9247,9249,9251,9253,9255,9257,9259,9261,9263,9265,9267,9269,9271,9273],{"class":175,"line":2399},[93,9246,8138],{"class":218},[93,9248,222],{"class":192},[93,9250,1719],{"class":182},[93,9252,277],{"class":218},[93,9254,222],{"class":192},[93,9256,1719],{"class":182},[93,9258,277],{"class":218},[93,9260,222],{"class":192},[93,9262,1719],{"class":182},[93,9264,247],{"class":218},[93,9266,222],{"class":192},[93,9268,240],{"class":182},[93,9270,237],{"class":218},[93,9272,222],{"class":192},[93,9274,8133],{"class":182},[93,9276,9277,9279,9281,9283,9285,9287,9289,9291,9293,9295,9297,9299,9301,9303,9305],{"class":175,"line":2404},[93,9278,8138],{"class":218},[93,9280,222],{"class":192},[93,9282,1719],{"class":182},[93,9284,277],{"class":218},[93,9286,222],{"class":192},[93,9288,1719],{"class":182},[93,9290,277],{"class":218},[93,9292,222],{"class":192},[93,9294,1719],{"class":182},[93,9296,247],{"class":218},[93,9298,222],{"class":192},[93,9300,240],{"class":182},[93,9302,237],{"class":218},[93,9304,222],{"class":192},[93,9306,8133],{"class":182},[93,9308,9309,9311,9313,9315,9317,9319,9321,9323,9325,9327,9329,9331,9333,9335,9337,9339],{"class":175,"line":2410},[93,9310,8098],{"class":192},[93,9312,277],{"class":218},[93,9314,222],{"class":192},[93,9316,1719],{"class":182},[93,9318,277],{"class":218},[93,9320,222],{"class":192},[93,9322,1719],{"class":182},[93,9324,277],{"class":218},[93,9326,222],{"class":192},[93,9328,1719],{"class":182},[93,9330,237],{"class":218},[93,9332,222],{"class":192},[93,9334,240],{"class":182},[93,9336,237],{"class":218},[93,9338,222],{"class":192},[93,9340,8133],{"class":182},[93,9342,9343,9345,9347,9349,9351,9353,9355,9357,9359,9361,9363,9365,9367,9369,9371,9373],{"class":175,"line":2420},[93,9344,8098],{"class":192},[93,9346,277],{"class":218},[93,9348,222],{"class":192},[93,9350,1719],{"class":182},[93,9352,277],{"class":218},[93,9354,222],{"class":192},[93,9356,240],{"class":182},[93,9358,1778],{"class":192},[93,9360,277],{"class":218},[93,9362,222],{"class":192},[93,9364,1719],{"class":182},[93,9366,237],{"class":218},[93,9368,222],{"class":192},[93,9370,240],{"class":182},[93,9372,247],{"class":218},[93,9374,9375],{"class":192},"f\n",[93,9377,9378],{"class":175,"line":2436},[93,9379,9380],{"class":182},"};\n",[93,9382,9383],{"class":175,"line":2447},[93,9384,1320],{"class":182},[93,9386,9387],{"class":175,"line":2460},[93,9388,9389],{"class":671},"    \u002F\u002F indices数组未使用，已删除\n",[93,9391,9392],{"class":175,"line":2465},[93,9393,361],{"emptyLinePlaceholder":360},[93,9395,9396],{"class":175,"line":2474},[93,9397,2015],{"class":671},[93,9399,9400,9402,9404],{"class":175,"line":2488},[93,9401,1953],{"class":192},[93,9403,489],{"class":192},[93,9405,2025],{"class":182},[93,9407,9408,9410,9412],{"class":175,"line":2511},[93,9409,1953],{"class":192},[93,9411,489],{"class":192},[93,9413,2035],{"class":182},[93,9415,9416,9418,9420,9422,9424,9426,9428],{"class":175,"line":2516},[93,9417,2041],{"class":179},[93,9419,215],{"class":182},[93,9421,517],{"class":218},[93,9423,240],{"class":182},[93,9425,835],{"class":192},[93,9427,2052],{"class":182},[93,9429,2055],{"class":671},[93,9431,9432,9434,9436,9438,9440,9442,9444],{"class":175,"line":2522},[93,9433,2041],{"class":179},[93,9435,215],{"class":182},[93,9437,517],{"class":218},[93,9439,240],{"class":182},[93,9441,835],{"class":192},[93,9443,2071],{"class":182},[93,9445,2055],{"class":671},[93,9447,9448],{"class":175,"line":2566},[93,9449,1320],{"class":182},[93,9451,9452],{"class":175,"line":2582},[93,9453,2084],{"class":671},[93,9455,9456,9458],{"class":175,"line":2587},[93,9457,2090],{"class":179},[93,9459,2093],{"class":182},[93,9461,9462,9464,9466],{"class":175,"line":2593},[93,9463,2099],{"class":179},[93,9465,2102],{"class":182},[93,9467,2105],{"class":671},[93,9469,9470,9472,9474],{"class":175,"line":2638},[93,9471,2111],{"class":179},[93,9473,2114],{"class":182},[93,9475,2117],{"class":671},[93,9477,9478,9480,9482],{"class":175,"line":2649},[93,9479,2111],{"class":179},[93,9481,2125],{"class":182},[93,9483,2117],{"class":671},[93,9485,9486,9488,9490],{"class":175,"line":2654},[93,9487,2111],{"class":179},[93,9489,2135],{"class":182},[93,9491,2138],{"class":671},[93,9493,9494,9496,9498],{"class":175,"line":2660},[93,9495,2111],{"class":179},[93,9497,2146],{"class":182},[93,9499,2138],{"class":671},[93,9501,9502,9504,9506,9508,9510,9512,9514],{"class":175,"line":2704},[93,9503,2154],{"class":179},[93,9505,2157],{"class":182},[93,9507,720],{"class":218},[93,9509,2162],{"class":182},[93,9511,720],{"class":218},[93,9513,2167],{"class":182},[93,9515,2170],{"class":671},[93,9517,9518,9520,9522],{"class":175,"line":2715},[93,9519,2176],{"class":179},[93,9521,2179],{"class":182},[93,9523,2182],{"class":671},[93,9525,9526],{"class":175,"line":2720},[93,9527,361],{"emptyLinePlaceholder":360},[93,9529,9530],{"class":175,"line":2726},[93,9531,2193],{"class":671},[93,9533,9534,9536],{"class":175,"line":2747},[93,9535,2090],{"class":179},[93,9537,2201],{"class":182},[93,9539,9540,9542,9544],{"class":175,"line":2752},[93,9541,2099],{"class":179},[93,9543,2209],{"class":182},[93,9545,2105],{"class":671},[93,9547,9548,9550,9552],{"class":175,"line":2758},[93,9549,2111],{"class":179},[93,9551,2114],{"class":182},[93,9553,2117],{"class":671},[93,9555,9556,9558,9560],{"class":175,"line":2774},[93,9557,2111],{"class":179},[93,9559,2125],{"class":182},[93,9561,2230],{"class":671},[93,9563,9564,9566,9568],{"class":175,"line":2780},[93,9565,2111],{"class":179},[93,9567,2135],{"class":182},[93,9569,2138],{"class":671},[93,9571,9572,9574,9576],{"class":175,"line":2788},[93,9573,2111],{"class":179},[93,9575,2146],{"class":182},[93,9577,2138],{"class":671},[93,9579,9580,9582,9584,9586,9588,9590,9592],{"class":175,"line":2794},[93,9581,2154],{"class":179},[93,9583,2157],{"class":182},[93,9585,720],{"class":218},[93,9587,2260],{"class":182},[93,9589,720],{"class":218},[93,9591,2265],{"class":182},[93,9593,2170],{"class":671},[93,9595,9596,9598,9600],{"class":175,"line":2800},[93,9597,2176],{"class":179},[93,9599,2179],{"class":182},[93,9601,2182],{"class":671},[93,9603,9604],{"class":175,"line":2834},[93,9605,361],{"emptyLinePlaceholder":360},[93,9607,9608],{"class":175,"line":2843},[93,9609,361],{"emptyLinePlaceholder":360},[93,9611,9612],{"class":175,"line":2848},[93,9613,2292],{"class":671},[93,9615,9616,9618,9620],{"class":175,"line":2854},[93,9617,1953],{"class":192},[93,9619,489],{"class":192},[93,9621,2302],{"class":182},[93,9623,9624,9626,9628,9630,9632,9634],{"class":175,"line":2865},[93,9625,2308],{"class":179},[93,9627,215],{"class":182},[93,9629,517],{"class":218},[93,9631,240],{"class":182},[93,9633,835],{"class":192},[93,9635,2319],{"class":182},[93,9637,9638,9640,9642],{"class":175,"line":2870},[93,9639,2325],{"class":179},[93,9641,2328],{"class":182},[93,9643,2331],{"class":671},[93,9645,9646],{"class":175,"line":2876},[93,9647,361],{"emptyLinePlaceholder":360},[93,9649,9650],{"class":175,"line":2896},[93,9651,2342],{"class":671},[93,9653,9654,9656,9658],{"class":175,"line":2916},[93,9655,1953],{"class":192},[93,9657,489],{"class":192},[93,9659,2352],{"class":182},[93,9661,9662,9664,9666,9668,9670,9672],{"class":175,"line":2921},[93,9663,2358],{"class":179},[93,9665,215],{"class":182},[93,9667,517],{"class":218},[93,9669,240],{"class":182},[93,9671,835],{"class":192},[93,9673,2369],{"class":182},[93,9675,9676,9678,9680],{"class":175,"line":2940},[93,9677,2375],{"class":179},[93,9679,2378],{"class":182},[93,9681,2381],{"class":671},[93,9683,9684,9686,9688,9690],{"class":175,"line":2958},[93,9685,2387],{"class":179},[93,9687,2390],{"class":182},[93,9689,2393],{"class":192},[93,9691,2396],{"class":182},[93,9693,9694],{"class":175,"line":2963},[93,9695,361],{"emptyLinePlaceholder":360},[93,9697,9698,9700],{"class":175,"line":2972},[93,9699,2468],{"class":192},[93,9701,2471],{"class":182},[93,9703,9704,9706,9708,9710],{"class":175,"line":2977},[93,9705,2477],{"class":179},[93,9707,2480],{"class":182},[93,9709,835],{"class":192},[93,9711,2485],{"class":182},[93,9713,9714,9716,9718,9720,9722,9724,9726,9728,9730],{"class":175,"line":2983},[93,9715,1185],{"class":179},[93,9717,1328],{"class":182},[93,9719,850],{"class":192},[93,9721,2497],{"class":503},[93,9723,856],{"class":192},[93,9725,2502],{"class":182},[93,9727,850],{"class":192},[93,9729,769],{"class":179},[93,9731,872],{"class":182},[93,9733,9734],{"class":175,"line":3001},[93,9735,361],{"emptyLinePlaceholder":360},[93,9737,9738],{"class":175,"line":3006},[93,9739,2519],{"class":671},[93,9741,9742,9744,9746,9748,9750,9752,9754,9757,9759,9761,9763,9765,9767,9769,9771,9773],{"class":175,"line":3012},[93,9743,2525],{"class":179},[93,9745,215],{"class":182},[93,9747,720],{"class":218},[93,9749,240],{"class":182},[93,9751,1466],{"class":218},[93,9753,2536],{"class":182},[93,9755,9756],{"class":218},"5",[93,9758,2542],{"class":192},[93,9760,2545],{"class":192},[93,9762,215],{"class":182},[93,9764,2550],{"class":192},[93,9766,2553],{"class":182},[93,9768,2556],{"class":192},[93,9770,2559],{"class":182},[93,9772,720],{"class":218},[93,9774,428],{"class":182},[93,9776,9777,9779,9781,9783,9785],{"class":175,"line":3020},[93,9778,2569],{"class":179},[93,9780,215],{"class":182},[93,9782,720],{"class":218},[93,9784,2576],{"class":182},[93,9786,2579],{"class":671},[93,9788,9789],{"class":175,"line":3025},[93,9790,1320],{"class":182},[93,9792,9793],{"class":175,"line":3030},[93,9794,2657],{"class":671},[93,9796,9797,9799,9801,9803,9805,9807,9809,9811,9813,9815,9817,9819,9821,9823,9825,9827,9829,9831,9833,9835],{"class":175,"line":3036},[93,9798,2525],{"class":179},[93,9800,215],{"class":182},[93,9802,1992],{"class":218},[93,9804,240],{"class":182},[93,9806,1992],{"class":218},[93,9808,2536],{"class":182},[93,9810,9756],{"class":218},[93,9812,2542],{"class":192},[93,9814,2545],{"class":192},[93,9816,215],{"class":182},[93,9818,2550],{"class":192},[93,9820,2553],{"class":182},[93,9822,2556],{"class":192},[93,9824,2622],{"class":182},[93,9826,1466],{"class":218},[93,9828,2542],{"class":192},[93,9830,2545],{"class":192},[93,9832,215],{"class":182},[93,9834,2550],{"class":192},[93,9836,2635],{"class":182},[93,9838,9839,9841,9843,9845],{"class":175,"line":3052},[93,9840,2569],{"class":179},[93,9842,215],{"class":182},[93,9844,1992],{"class":218},[93,9846,428],{"class":182},[93,9848,9849],{"class":175,"line":3068},[93,9850,361],{"emptyLinePlaceholder":360},[93,9852,9853],{"class":175,"line":3083},[93,9854,2723],{"class":671},[93,9856,9857,9859,9861,9863,9865,9867,9869],{"class":175,"line":3100},[93,9858,2729],{"class":179},[93,9860,2732],{"class":179},[93,9862,215],{"class":182},[93,9864,2737],{"class":503},[93,9866,240],{"class":182},[93,9868,2742],{"class":503},[93,9870,428],{"class":182},[93,9872,9873],{"class":175,"line":3116},[93,9874,361],{"emptyLinePlaceholder":360},[93,9876,9877],{"class":175,"line":3124},[93,9878,2755],{"class":671},[93,9880,9881,9883,9885,9887,9889],{"class":175,"line":3134},[93,9882,2761],{"class":192},[93,9884,824],{"class":182},[93,9886,1644],{"class":192},[93,9888,2768],{"class":179},[93,9890,2771],{"class":182},[93,9892,9893],{"class":175,"line":3139},[93,9894,2777],{"class":671},[93,9896,9897,9899],{"class":175,"line":3144},[93,9898,2783],{"class":179},[93,9900,812],{"class":182},[93,9902,9903],{"class":175,"line":3153},[93,9904,2791],{"class":182},[93,9906,9907],{"class":175,"line":3159},[93,9908,2797],{"class":671},[93,9910,9911,9913,9915,9917,9919,9921,9923,9925,9927,9929,9931,9933,9935,9937],{"class":175,"line":3165},[93,9912,2803],{"class":179},[93,9914,215],{"class":182},[93,9916,2808],{"class":218},[93,9918,222],{"class":192},[93,9920,240],{"class":182},[93,9922,2815],{"class":218},[93,9924,222],{"class":192},[93,9926,240],{"class":182},[93,9928,2815],{"class":218},[93,9930,222],{"class":192},[93,9932,240],{"class":182},[93,9934,247],{"class":218},[93,9936,222],{"class":192},[93,9938,428],{"class":182},[93,9940,9941,9943,9946,9949],{"class":175,"line":3171},[93,9942,2837],{"class":179},[93,9944,9945],{"class":182},"(GL_COLOR_BUFFER_BIT ",[93,9947,9948],{"class":192},"|",[93,9950,9951],{"class":182}," GL_DEPTH_BUFFER_BIT);\n",[93,9953,9954],{"class":175,"line":3177},[93,9955,2791],{"class":182},[93,9957,9958],{"class":175,"line":3183},[93,9959,2851],{"class":671},[93,9961,9962,9964,9966],{"class":175,"line":3192},[93,9963,2857],{"class":182},[93,9965,2860],{"class":179},[93,9967,812],{"class":182},[93,9969,9970],{"class":175,"line":3197},[93,9971,361],{"emptyLinePlaceholder":360},[93,9973,9974,9976,9978,9980,9982,9984,9986],{"class":175,"line":3237},[93,9975,6372],{"class":192},[93,9977,4327],{"class":182},[93,9979,193],{"class":192},[93,9981,497],{"class":179},[93,9983,500],{"class":182},[93,9985,4336],{"class":503},[93,9987,428],{"class":182},[93,9989,9990,9992,9994,9996,9998,10000,10002,10004],{"class":175,"line":3242},[93,9991,2899],{"class":179},[93,9993,4345],{"class":182},[93,9995,517],{"class":218},[93,9997,520],{"class":182},[93,9999,115],{"class":179},[93,10001,199],{"class":182},[93,10003,527],{"class":179},[93,10005,4358],{"class":182},[93,10007,10008],{"class":175,"line":3247},[93,10009,361],{"emptyLinePlaceholder":360},[93,10011,10012,10014,10016,10018,10020,10022,10024],{"class":175,"line":3256},[93,10013,6372],{"class":192},[93,10015,6413],{"class":182},[93,10017,193],{"class":192},[93,10019,497],{"class":179},[93,10021,500],{"class":182},[93,10023,6422],{"class":503},[93,10025,428],{"class":182},[93,10027,10028,10030,10032,10034,10036,10038,10040,10042],{"class":175,"line":3270},[93,10029,2899],{"class":179},[93,10031,6431],{"class":182},[93,10033,517],{"class":218},[93,10035,520],{"class":182},[93,10037,115],{"class":179},[93,10039,199],{"class":182},[93,10041,527],{"class":179},[93,10043,6444],{"class":182},[93,10045,10046],{"class":175,"line":3284},[93,10047,361],{"emptyLinePlaceholder":360},[93,10049,10050,10052,10054,10056,10058,10060,10062],{"class":175,"line":3298},[93,10051,6372],{"class":192},[93,10053,6455],{"class":182},[93,10055,193],{"class":192},[93,10057,497],{"class":179},[93,10059,500],{"class":182},[93,10061,6464],{"class":503},[93,10063,428],{"class":182},[93,10065,10066,10068,10070,10072,10074,10076,10078,10080],{"class":175,"line":3304},[93,10067,2899],{"class":179},[93,10069,6473],{"class":182},[93,10071,517],{"class":218},[93,10073,520],{"class":182},[93,10075,115],{"class":179},[93,10077,199],{"class":182},[93,10079,527],{"class":179},[93,10081,6486],{"class":182},[93,10083,10084],{"class":175,"line":3309},[93,10085,2791],{"class":182},[93,10087,10088,10090,10092,10094,10096,10098,10100],{"class":175,"line":3314},[93,10089,2857],{"class":182},[93,10091,2926],{"class":179},[93,10093,215],{"class":182},[93,10095,2931],{"class":503},[93,10097,240],{"class":182},[93,10099,720],{"class":218},[93,10101,428],{"class":182},[93,10103,10104,10106,10108,10110,10112,10114,10116],{"class":175,"line":3323},[93,10105,2857],{"class":182},[93,10107,2926],{"class":179},[93,10109,215],{"class":182},[93,10111,2949],{"class":503},[93,10113,240],{"class":182},[93,10115,517],{"class":218},[93,10117,428],{"class":182},[93,10119,10120],{"class":175,"line":3328},[93,10121,2791],{"class":182},[93,10123,10124,10126],{"class":175,"line":3347},[93,10125,2966],{"class":179},[93,10127,2969],{"class":182},[93,10129,10130],{"class":175,"line":3358},[93,10131,2791],{"class":182},[93,10133,10134],{"class":175,"line":3368},[93,10135,10136],{"class":671},"        \u002F\u002F 绘制立方体\n",[93,10138,10140,10143,10145,10147,10149,10151],{"class":175,"line":10139},224,[93,10141,10142],{"class":179},"        glDrawArrays",[93,10144,2989],{"class":182},[93,10146,720],{"class":218},[93,10148,240],{"class":182},[93,10150,7056],{"class":218},[93,10152,428],{"class":182},[93,10154,10156],{"class":175,"line":10155},225,[93,10157,2791],{"class":182},[93,10159,10161],{"class":175,"line":10160},226,[93,10162,3009],{"class":671},[93,10164,10166,10168],{"class":175,"line":10165},227,[93,10167,3015],{"class":179},[93,10169,1614],{"class":182},[93,10171,10173],{"class":175,"line":10172},228,[93,10174,888],{"class":182},[93,10176,10178],{"class":175,"line":10177},229,[93,10179,361],{"emptyLinePlaceholder":360},[93,10181,10183],{"class":175,"line":10182},230,[93,10184,3033],{"class":671},[93,10186,10188,10190,10192,10194,10196,10198],{"class":175,"line":10187},231,[93,10189,3039],{"class":179},[93,10191,215],{"class":182},[93,10193,517],{"class":218},[93,10195,240],{"class":182},[93,10197,835],{"class":192},[93,10199,2319],{"class":182},[93,10201,10203,10205,10207,10209,10211,10213],{"class":175,"line":10202},232,[93,10204,3055],{"class":179},[93,10206,215],{"class":182},[93,10208,517],{"class":218},[93,10210,240],{"class":182},[93,10212,835],{"class":192},[93,10214,2369],{"class":182},[93,10216,10218,10220,10222,10224,10226,10228],{"class":175,"line":10217},233,[93,10219,3086],{"class":179},[93,10221,215],{"class":182},[93,10223,517],{"class":218},[93,10225,240],{"class":182},[93,10227,835],{"class":192},[93,10229,3097],{"class":182},[93,10231,10233,10235,10237,10239,10241,10243],{"class":175,"line":10232},234,[93,10234,3086],{"class":179},[93,10236,215],{"class":182},[93,10238,517],{"class":218},[93,10240,240],{"class":182},[93,10242,835],{"class":192},[93,10244,3113],{"class":182},[93,10246,10248,10250],{"class":175,"line":10247},235,[93,10249,3119],{"class":179},[93,10251,812],{"class":182},[93,10253,10255,10257,10259],{"class":175,"line":10254},236,[93,10256,3127],{"class":192},[93,10258,337],{"class":218},[93,10260,651],{"class":182},[93,10262,10264],{"class":175,"line":10263},237,[93,10265,448],{"class":182},[93,10267,10269],{"class":175,"line":10268},238,[93,10270,361],{"emptyLinePlaceholder":360},[93,10272,10274,10276,10278],{"class":175,"line":10273},239,[93,10275,318],{"class":182},[93,10277,321],{"class":218},[93,10279,324],{"class":182},[93,10281,10283],{"class":175,"line":10282},240,[93,10284,3156],{"class":182},[93,10286,10288],{"class":175,"line":10287},241,[93,10289,3168],{"class":182},[93,10291,10293],{"class":175,"line":10292},242,[93,10294,3174],{"class":182},[93,10296,10298],{"class":175,"line":10297},243,[93,10299,3180],{"class":182},[93,10301,10303,10305,10307],{"class":175,"line":10302},244,[93,10304,389],{"class":192},[93,10306,392],{"class":179},[93,10308,395],{"class":182},[93,10310,10312],{"class":175,"line":10311},245,[93,10313,401],{"class":182},[93,10315,10317,10319,10321,10323,10325,10327,10329,10331,10333,10335],{"class":175,"line":10316},246,[93,10318,3200],{"class":182},[93,10320,193],{"class":192},[93,10322,3205],{"class":179},[93,10324,215],{"class":182},[93,10326,3210],{"class":179},[93,10328,3213],{"class":182},[93,10330,3210],{"class":179},[93,10332,3218],{"class":182},[93,10334,277],{"class":218},[93,10336,428],{"class":182},[93,10338,10340],{"class":175,"line":10339},247,[93,10341,448],{"class":182},[10,10343,10344,10345,10348,10349,106,10352,106],{},"​\tOpenGL",[48,10346,10347],{},"存储深度信息在一个叫做Z缓冲(Z-buffer)的缓冲中","，它",[48,10350,10351],{},"允许OpenGL决定何时覆盖一个像素而何时不覆盖",[48,10353,10354],{},"通过使用Z缓冲，我们可以配置OpenGL来进行深度测试",[3526,10356,10358],{"id":10357},"更多的立方体","更多的立方体！",[10,10360,10361],{},"​\t现在我们想在屏幕上显示10个立方体。每个立方体看起来都是一样的，区别在于它们在世界的位置及旋转角度不同。立方体的图形布局已经定义好了，所以当渲染更多物体的时候我们不需要改变我们的缓冲数组和属性数组，我们唯一需要做的只是改变每个对象的模型矩阵来将立方体变换到世界坐标系中。",[10,10363,10364,10365,10368,10369,10372],{},"​\t首先，让我们",[48,10366,10367],{},"为每个立方体定义一个位移向量来指定它在世界空间的位置","。我们将在一个",[171,10370,10371],{},"glm::vec3","数组中定义10个立方体位置：",[164,10374,10376],{"className":166,"code":10375,"language":168,"meta":169,"style":169},"glm::vec3 cubePositions[] = {\n  glm::vec3( 0.0f,  0.0f,  0.0f), \n  glm::vec3( 2.0f,  5.0f, -15.0f), \n  glm::vec3(-1.5f, -2.2f, -2.5f),  \n  glm::vec3(-3.8f, -2.0f, -12.3f),  \n  glm::vec3( 2.4f, -0.4f, -3.5f),  \n  glm::vec3(-1.7f,  3.0f, -7.5f),  \n  glm::vec3( 1.3f, -2.0f, -2.5f),  \n  glm::vec3( 1.5f,  2.0f, -2.5f), \n  glm::vec3( 1.5f,  0.2f, -1.5f), \n  glm::vec3(-1.3f,  1.0f, -1.5f)  \n};\n",[171,10377,10378,10393,10424,10457,10495,10531,10566,10600,10633,10663,10693,10726],{"__ignoreMap":169},[93,10379,10380,10382,10384,10386,10389,10391],{"class":175,"line":176},[93,10381,115],{"class":179},[93,10383,199],{"class":182},[93,10385,232],{"class":179},[93,10387,10388],{"class":182}," cubePositions[] ",[93,10390,193],{"class":192},[93,10392,785],{"class":182},[93,10394,10395,10398,10400,10402,10405,10407,10409,10411,10413,10415,10417,10419,10421],{"class":175,"line":186},[93,10396,10397],{"class":179},"  glm",[93,10399,199],{"class":182},[93,10401,232],{"class":179},[93,10403,10404],{"class":182},"( ",[93,10406,237],{"class":218},[93,10408,222],{"class":192},[93,10410,1719],{"class":182},[93,10412,237],{"class":218},[93,10414,222],{"class":192},[93,10416,1719],{"class":182},[93,10418,237],{"class":218},[93,10420,222],{"class":192},[93,10422,10423],{"class":182},"), \n",[93,10425,10426,10428,10430,10432,10434,10437,10439,10441,10444,10446,10448,10450,10453,10455],{"class":175,"line":253},[93,10427,10397],{"class":179},[93,10429,199],{"class":182},[93,10431,232],{"class":179},[93,10433,10404],{"class":182},[93,10435,10436],{"class":218},"2.0",[93,10438,222],{"class":192},[93,10440,1719],{"class":182},[93,10442,10443],{"class":218},"5.0",[93,10445,222],{"class":192},[93,10447,240],{"class":182},[93,10449,1778],{"class":192},[93,10451,10452],{"class":218},"15.0",[93,10454,222],{"class":192},[93,10456,10423],{"class":182},[93,10458,10459,10461,10463,10465,10467,10469,10472,10474,10476,10478,10481,10483,10485,10487,10490,10492],{"class":175,"line":357},[93,10460,10397],{"class":179},[93,10462,199],{"class":182},[93,10464,232],{"class":179},[93,10466,215],{"class":182},[93,10468,1778],{"class":192},[93,10470,10471],{"class":218},"1.5",[93,10473,222],{"class":192},[93,10475,240],{"class":182},[93,10477,1778],{"class":192},[93,10479,10480],{"class":218},"2.2",[93,10482,222],{"class":192},[93,10484,240],{"class":182},[93,10486,1778],{"class":192},[93,10488,10489],{"class":218},"2.5",[93,10491,222],{"class":192},[93,10493,10494],{"class":182},"),  \n",[93,10496,10497,10499,10501,10503,10505,10507,10510,10512,10514,10516,10518,10520,10522,10524,10527,10529],{"class":175,"line":364},[93,10498,10397],{"class":179},[93,10500,199],{"class":182},[93,10502,232],{"class":179},[93,10504,215],{"class":182},[93,10506,1778],{"class":192},[93,10508,10509],{"class":218},"3.8",[93,10511,222],{"class":192},[93,10513,240],{"class":182},[93,10515,1778],{"class":192},[93,10517,10436],{"class":218},[93,10519,222],{"class":192},[93,10521,240],{"class":182},[93,10523,1778],{"class":192},[93,10525,10526],{"class":218},"12.3",[93,10528,222],{"class":192},[93,10530,10494],{"class":182},[93,10532,10533,10535,10537,10539,10541,10544,10546,10548,10550,10553,10555,10557,10559,10562,10564],{"class":175,"line":370},[93,10534,10397],{"class":179},[93,10536,199],{"class":182},[93,10538,232],{"class":179},[93,10540,10404],{"class":182},[93,10542,10543],{"class":218},"2.4",[93,10545,222],{"class":192},[93,10547,240],{"class":182},[93,10549,1778],{"class":192},[93,10551,10552],{"class":218},"0.4",[93,10554,222],{"class":192},[93,10556,240],{"class":182},[93,10558,1778],{"class":192},[93,10560,10561],{"class":218},"3.5",[93,10563,222],{"class":192},[93,10565,10494],{"class":182},[93,10567,10568,10570,10572,10574,10576,10578,10581,10583,10585,10587,10589,10591,10593,10596,10598],{"class":175,"line":375},[93,10569,10397],{"class":179},[93,10571,199],{"class":182},[93,10573,232],{"class":179},[93,10575,215],{"class":182},[93,10577,1778],{"class":192},[93,10579,10580],{"class":218},"1.7",[93,10582,222],{"class":192},[93,10584,1719],{"class":182},[93,10586,4790],{"class":218},[93,10588,222],{"class":192},[93,10590,240],{"class":182},[93,10592,1778],{"class":192},[93,10594,10595],{"class":218},"7.5",[93,10597,222],{"class":192},[93,10599,10494],{"class":182},[93,10601,10602,10604,10606,10608,10610,10613,10615,10617,10619,10621,10623,10625,10627,10629,10631],{"class":175,"line":381},[93,10603,10397],{"class":179},[93,10605,199],{"class":182},[93,10607,232],{"class":179},[93,10609,10404],{"class":182},[93,10611,10612],{"class":218},"1.3",[93,10614,222],{"class":192},[93,10616,240],{"class":182},[93,10618,1778],{"class":192},[93,10620,10436],{"class":218},[93,10622,222],{"class":192},[93,10624,240],{"class":182},[93,10626,1778],{"class":192},[93,10628,10489],{"class":218},[93,10630,222],{"class":192},[93,10632,10494],{"class":182},[93,10634,10635,10637,10639,10641,10643,10645,10647,10649,10651,10653,10655,10657,10659,10661],{"class":175,"line":386},[93,10636,10397],{"class":179},[93,10638,199],{"class":182},[93,10640,232],{"class":179},[93,10642,10404],{"class":182},[93,10644,10471],{"class":218},[93,10646,222],{"class":192},[93,10648,1719],{"class":182},[93,10650,10436],{"class":218},[93,10652,222],{"class":192},[93,10654,240],{"class":182},[93,10656,1778],{"class":192},[93,10658,10489],{"class":218},[93,10660,222],{"class":192},[93,10662,10423],{"class":182},[93,10664,10665,10667,10669,10671,10673,10675,10677,10679,10681,10683,10685,10687,10689,10691],{"class":175,"line":398},[93,10666,10397],{"class":179},[93,10668,199],{"class":182},[93,10670,232],{"class":179},[93,10672,10404],{"class":182},[93,10674,10471],{"class":218},[93,10676,222],{"class":192},[93,10678,1719],{"class":182},[93,10680,2808],{"class":218},[93,10682,222],{"class":192},[93,10684,240],{"class":182},[93,10686,1778],{"class":192},[93,10688,10471],{"class":218},[93,10690,222],{"class":192},[93,10692,10423],{"class":182},[93,10694,10695,10697,10699,10701,10703,10705,10707,10709,10711,10713,10715,10717,10719,10721,10723],{"class":175,"line":404},[93,10696,10397],{"class":179},[93,10698,199],{"class":182},[93,10700,232],{"class":179},[93,10702,215],{"class":182},[93,10704,1778],{"class":192},[93,10706,10612],{"class":218},[93,10708,222],{"class":192},[93,10710,1719],{"class":182},[93,10712,247],{"class":218},[93,10714,222],{"class":192},[93,10716,240],{"class":182},[93,10718,1778],{"class":192},[93,10720,10471],{"class":218},[93,10722,222],{"class":192},[93,10724,10725],{"class":182},")  \n",[93,10727,10728],{"class":175,"line":431},[93,10729,9380],{"class":182},[10,10731,10732],{},"​\t然后在循环绘制中，调用drawArray 几次。并且对每个cube进行旋转。",[164,10734,10736],{"className":166,"code":10735,"language":168,"meta":169,"style":169},"glBindVertexArray(VAO);\nfor(unsigned int i = 0; i \u003C 10; i++)\n{\n  glm::mat4 model;\n  model = glm::translate(model, cubePositions[i]);\n  float angle = 20.0f * i; \n  model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));\n  ourShader.setMat4(\"model\", model);\n\n  glDrawArrays(GL_TRIANGLES, 0, 36);\n}\n",[171,10737,10738,10745,10780,10784,10795,10812,10832,10881,10896,10900,10915],{"__ignoreMap":169},[93,10739,10740,10743],{"class":175,"line":176},[93,10741,10742],{"class":179},"glBindVertexArray",[93,10744,2969],{"class":182},[93,10746,10747,10750,10752,10754,10756,10759,10761,10763,10766,10768,10771,10774,10777],{"class":175,"line":186},[93,10748,10749],{"class":192},"for",[93,10751,215],{"class":182},[93,10753,486],{"class":192},[93,10755,489],{"class":192},[93,10757,10758],{"class":182}," i ",[93,10760,193],{"class":192},[93,10762,337],{"class":218},[93,10764,10765],{"class":182},"; i ",[93,10767,1193],{"class":192},[93,10769,10770],{"class":218}," 10",[93,10772,10773],{"class":182},"; i",[93,10775,10776],{"class":192},"++",[93,10778,10779],{"class":182},")\n",[93,10781,10782],{"class":175,"line":253},[93,10783,401],{"class":182},[93,10785,10786,10788,10790,10792],{"class":175,"line":357},[93,10787,10397],{"class":179},[93,10789,199],{"class":182},[93,10791,300],{"class":179},[93,10793,10794],{"class":182}," model;\n",[93,10796,10797,10800,10802,10804,10806,10809],{"class":175,"line":364},[93,10798,10799],{"class":182},"  model ",[93,10801,193],{"class":192},[93,10803,196],{"class":179},[93,10805,199],{"class":182},[93,10807,10808],{"class":179},"translate",[93,10810,10811],{"class":182},"(model, cubePositions[i]);\n",[93,10813,10814,10817,10820,10822,10825,10827,10829],{"class":175,"line":370},[93,10815,10816],{"class":192},"  float",[93,10818,10819],{"class":182}," angle ",[93,10821,193],{"class":192},[93,10823,10824],{"class":218}," 20.0",[93,10826,222],{"class":192},[93,10828,2542],{"class":192},[93,10830,10831],{"class":182}," i; \n",[93,10833,10834,10836,10838,10840,10842,10844,10846,10848,10850,10852,10855,10857,10859,10861,10863,10865,10867,10869,10871,10873,10875,10877,10879],{"class":175,"line":375},[93,10835,10799],{"class":182},[93,10837,193],{"class":192},[93,10839,196],{"class":179},[93,10841,199],{"class":182},[93,10843,202],{"class":179},[93,10845,3972],{"class":182},[93,10847,115],{"class":179},[93,10849,199],{"class":182},[93,10851,212],{"class":179},[93,10853,10854],{"class":182},"(angle), ",[93,10856,115],{"class":179},[93,10858,199],{"class":182},[93,10860,232],{"class":179},[93,10862,215],{"class":182},[93,10864,247],{"class":218},[93,10866,222],{"class":192},[93,10868,240],{"class":182},[93,10870,2815],{"class":218},[93,10872,222],{"class":192},[93,10874,240],{"class":182},[93,10876,277],{"class":218},[93,10878,222],{"class":192},[93,10880,250],{"class":182},[93,10882,10883,10886,10889,10891,10893],{"class":175,"line":381},[93,10884,10885],{"class":182},"  ourShader.",[93,10887,10888],{"class":179},"setMat4",[93,10890,215],{"class":182},[93,10892,4336],{"class":503},[93,10894,10895],{"class":182},", model);\n",[93,10897,10898],{"class":175,"line":386},[93,10899,361],{"emptyLinePlaceholder":360},[93,10901,10902,10905,10907,10909,10911,10913],{"class":175,"line":398},[93,10903,10904],{"class":179},"  glDrawArrays",[93,10906,2989],{"class":182},[93,10908,720],{"class":218},[93,10910,240],{"class":182},[93,10912,7056],{"class":218},[93,10914,428],{"class":182},[93,10916,10917],{"class":175,"line":404},[93,10918,448],{"class":182},[10920,10921,10922],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":169,"searchDepth":186,"depth":186,"links":10924},[10925,10926,10927,10928,10929,10930,10934,10935,10938,10942],{"id":66,"depth":186,"text":66},{"id":115,"depth":186,"text":116},{"id":3431,"depth":186,"text":3431},{"id":3448,"depth":186,"text":3448},{"id":3468,"depth":186,"text":3468},{"id":3482,"depth":186,"text":3482,"children":10931},[10932,10933],{"id":3528,"depth":253,"text":3528},{"id":3659,"depth":253,"text":3659},{"id":3873,"depth":186,"text":3873},{"id":6683,"depth":186,"text":6684,"children":10936},[10937],{"id":6697,"depth":253,"text":6698},{"id":6872,"depth":186,"text":6873,"children":10939},[10940,10941],{"id":6882,"depth":253,"text":6883},{"id":6923,"depth":253,"text":6924},{"id":6945,"depth":186,"text":6946,"children":10943},[10944],{"id":10357,"depth":253,"text":10358},"md",{},"\u002Fgraphy\u002Fopengel\u002F坐标和变换",{"description":12},"graphy\u002Fopengel\u002F坐标和变换","IRzu09rN9dcuKBoovy-ZH1nSMQDnp8S6Hm2mD_PDjS8",1792338203428]