{"id":1323,"date":"2024-08-19T08:27:18","date_gmt":"2024-08-19T08:27:18","guid":{"rendered":"https:\/\/www.gislxz.com\/?p=1323"},"modified":"2024-08-19T08:27:20","modified_gmt":"2024-08-19T08:27:20","slug":"opengl%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%882%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.gislxz.com\/index.php\/2024\/08\/19\/opengl%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%882%ef%bc%89\/","title":{"rendered":"OpenGL\u5b66\u4e60\u7b14\u8bb0\uff082\uff09"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u7eb9\u7406<\/h2>\n\n\n\n<p>\u7531\u4e8e\u5750\u6807\u5dee\u5f02\uff0c\u8bfb\u53d6\u56fe\u50cf\u540e\u8981\u53cd\u8f6cy\u8f74\uff0c\u8bfb\u53d6\u540e\u53d1\u5230\u663e\u5b58\u540e\u8bb0\u5f97\u628a\u5185\u5b58\u91cc\u7684\u56fe\u7247\u5bf9\u8c61\u91ca\u653e\u6389<\/p>\n\n\n\n<p>\u4e4b\u540e\u751f\u6210\u7eb9\u7406\u6fc0\u6d3b\u7ed1\u5b9a\uff0c\u7eb9\u7406\u6570\u636e\u4f20\u8f93\u5230\u663e\u5b58<\/p>\n\n\n\n<p>\u6839\u636euv\u5750\u6807\u53bb\u91c7\u6837\uff0c\u8bbe\u7f6euv\u6570\u636e\uff0c\u4f20\u5165vbo\uff0c\u52a0\u5165\u63cf\u8ff0\u6570\u636e<\/p>\n\n\n\n<p>\u8bbe\u7f6e\u91c7\u6837\u5668\uff0c\u7eb9\u7406\u5bf9\u8c61-\u7eb9\u7406\u5355\u5143-\u91c7\u6837\u5668\u3002\u91c7\u6837\u5668\u7528uniform\u53d8\u91cf\uff0c\u9002\u7528texture\u51fd\u6570\u8c03\u7528<\/p>\n\n\n\n<p>sampler\u901a\u8fc7int\u4f20\u9012\uff0c\u8bbe\u7f6e<\/p>\n\n\n\n<p>\u6700\u540e\u8bbe\u7f6e\u7eb9\u7406\u8fc7\u6ee4\u65b9\u5f0f\u548c\u5305\u88f9\u65b9\u5f0f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main.cpp\n#include &lt;iostream>\n\n#include \"glframework\/core.h\"\n#include \"glframework\/shader.h\"\n#include &lt;string>\n#include &lt;assert.h>\/\/\u65ad\u8a00\n#include \"wrapper\/checkError.h\"\n#include \"application\/Application.h\"\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"application\/stb_image.h\"\n\/*\n*\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n*\u2502\u3000\u76ee\t   \u6807\uff1a \u7eb9\u7406\u4e0e\u91c7\u6837\n*\u2502\u3000\u8bb2    \u5e08\uff1a \u8d75\u65b0\u653f(Carma Zhao)\n*\u2502\u3000\u62c6\u5206\u76ee\u6807\uff1a\n*\t\t\t1 \u521b\u5efa\u7eb9\u7406\u5bf9\u8c61\n\t\t\t\t\t-\u56fe\u7247\u8bfb\u53d6-StbImage\n\t\t\t\t\t-\u521b\u5efa\u7eb9\u7406\u5bf9\u8c61\uff08texture\uff09\n\t\t\t\t\t-\u7ed1\u5b9a\u7eb9\u7406\u5355\u5143\uff081\u3001\u6fc0\u6d3b\u7eb9\u7406\u5355\u5143 2\u3001bind\u7eb9\u7406\u5bf9\u8c61\uff09\n\t\t\t\t\t-\u4f20\u8f93\u56fe\u7247\u6570\u636e(\u63cf\u8ff0\u3001\u5185\u5bb9\u6570\u636e)\n*\t\t\t2 \u8bbe\u7f6e\u7eb9\u7406\u8fc7\u6ee4\u65b9\u5f0f\n*\t\t\t\t\t-\u5f53\u9700\u8981\u7684\u50cf\u7d20 > \u56fe\u7247\u7684\u50cf\u7d20  Linear\n*\t\t\t\t\t-\u5f53\u9700\u8981\u7684\u50cf\u7d20 &lt; \u56fe\u7247\u7684\u50cf\u7d20  Nearest\n*\t\t\t3 \u8bbe\u7f6e\u7eb9\u7406\u5305\u88f9\u65b9\u5f0f\uff08Wrapping\uff09\n*\t\t\t\t\t-Repeat Mirror ClampToEdge ClampToBorder\n*\t\t\t4 \u91c7\u6837\u5668\u4e0e\u91c7\u6837\n*\t\t\t\t\t-\u52a0\u5165uv\u5c5e\u6027\u6570\u636e\uff0c\u5e76\u4e14\u5355\u72ec\u5f00\u8f9f\u4e00\u4e2avbo\n*\t\t\t\t\t-vs\u4e2d\u52a0\u5165uv\u5c5e\u6027\u7684\u83b7\u53d6\u4ee5\u53ca\u5411\u4e0b\u4e2a\u9636\u6bb5\u7684\u4f20\u8f93\uff0cfs\u52a0\u5165\u83b7\u53d6uv\u6570\u503c\n*\t\t\t\t\t-fs\u4e2d\u52a0\u5165\u91c7\u6837\u5668\uff0c\u5e76\u4e14\u901a\u8fc7\u91c7\u6837\u5668\u91c7\u6837\u989c\u8272\n*\t\t\t\t\t-\u5c06\u91c7\u6837\u5668\u4e0e\u67d0\u4e00\u4e2a\u7eb9\u7406\u5355\u5143\u7ed1\u5b9a\n*\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n*\/\n\nGLuint vao;\nGLuint texture;\nShader* shader = nullptr;\n\nvoid OnResize(int width, int height) {\n\tGL_CALL(glViewport(0, 0, width, height));\n\tstd::cout &lt;&lt; \"OnResize\" &lt;&lt; std::endl;\n}\n\nvoid OnKey(int key, int action, int mods) {\n\tstd::cout &lt;&lt; key &lt;&lt; std::endl;\n}\n\n\n\nvoid prepareVAO() {\n\t\/\/1 \u51c6\u5907positions colors\n\tfloat positions&#91;] = {\n\t\t-0.5f, -0.5f, 0.0f,\n\t\t0.5f, -0.5f, 0.0f,\n\t\t0.0f,  0.5f, 0.0f,\n\t};\n\n\tfloat colors&#91;] = {\n\t\t1.0f, 0.0f,0.0f,\n\t\t0.0f, 1.0f,0.0f,\n\t\t0.0f, 0.0f,1.0f\n\t};\n\n\tfloat uvs&#91;] = {\n\t\t0.0f, 0.0f,\n\t\t1.0f, 0.0f,\n\t\t0.5f, 1.0f,\n\t};\n\n\tunsigned int indices&#91;] = {\n\t\t0, 1, 2\n\t};\n\n\t\/\/2 VBO\u521b\u5efa\n\tGLuint posVbo, colorVbo, uvVbo;\n\tglGenBuffers(1, &amp;posVbo);\n\tglBindBuffer(GL_ARRAY_BUFFER, posVbo);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);\n\n\tglGenBuffers(1, &amp;colorVbo);\n\tglBindBuffer(GL_ARRAY_BUFFER, colorVbo);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);\n\n\tglGenBuffers(1, &amp;uvVbo);\n\tglBindBuffer(GL_ARRAY_BUFFER, uvVbo);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(uvs), uvs, GL_STATIC_DRAW);\n\n\t\/\/3 EBO\u521b\u5efa\n\tGLuint ebo;\n\tglGenBuffers(1, &amp;ebo);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);\n\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);\n\n\t\/\/4 VAO\u521b\u5efa\n\tglGenVertexArrays(1, &amp;vao);\n\tglBindVertexArray(vao);\n\n\t\/\/5 \u7ed1\u5b9avbo ebo \u52a0\u5165\u5c5e\u6027\u63cf\u8ff0\u4fe1\u606f\n\t\/\/5.1 \u52a0\u5165\u4f4d\u7f6e\u5c5e\u6027\u63cf\u8ff0\u4fe1\u606f\n\tglBindBuffer(GL_ARRAY_BUFFER, posVbo);\n\tglEnableVertexAttribArray(0);\n\tglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);\n\n\t\/\/5.2 \u52a0\u5165\u989c\u8272\u5c5e\u6027\u63cf\u8ff0\u6570\u636e\n\tglBindBuffer(GL_ARRAY_BUFFER, colorVbo);\n\tglEnableVertexAttribArray(1);\n\tglVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);\n\n\t\/\/5.3 \u52a0\u5165uv\u5c5e\u6027\u63cf\u8ff0\u6570\u636e\n\tglBindBuffer(GL_ARRAY_BUFFER, uvVbo);\n\tglEnableVertexAttribArray(2);\n\tglVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, (void*)0);\n\n\t\/\/5.4 \u52a0\u5165ebo\u5230\u5f53\u524d\u7684vao\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);\n\n\tglBindVertexArray(0);\n}\n\nvoid prepareShader() {\n\tshader = new Shader(\"assets\/shaders\/vertex.glsl\",\"assets\/shaders\/fragment.glsl\");\n}\n\nvoid prepareTexture() {\n\t\/\/1 stbImage \u8bfb\u53d6\u56fe\u7247\n\tint width, height, channels;\n\n\t\/\/--\u53cd\u8f6cy\u8f74\n\tstbi_set_flip_vertically_on_load(true);\n\n\tunsigned char* data = stbi_load(\"assets\/textures\/goku.jpg\", &amp;width, &amp;height, &amp;channels, STBI_rgb_alpha);\n\n\t\/\/2 \u751f\u6210\u7eb9\u7406\u5e76\u4e14\u6fc0\u6d3b\u5355\u5143\u7ed1\u5b9a\n\tglGenTextures(1, &amp;texture);\n\t\/\/--\u6fc0\u6d3b\u7eb9\u7406\u5355\u5143--\n\tglActiveTexture(GL_TEXTURE0);\n\t\/\/--\u7ed1\u5b9a\u7eb9\u7406\u5bf9\u8c61--\n\tglBindTexture(GL_TEXTURE_2D, texture);\n\n\t\/\/3 \u4f20\u8f93\u7eb9\u7406\u6570\u636e,\u5f00\u8f9f\u663e\u5b58\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);\n\n\t\/\/***\u91ca\u653e\u6570\u636e\n\tstbi_image_free(data);\n\n\t\/\/4 \u8bbe\u7f6e\u7eb9\u7406\u7684\u8fc7\u6ee4\u65b9\u5f0f\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\n\t\/\/5 \u8bbe\u7f6e\u7eb9\u7406\u7684\u5305\u88f9\u65b9\u5f0f\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\/\/u\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\/\/v\n}\n\nvoid render() {\n\t\/\/\u6267\u884copengl\u753b\u5e03\u6e05\u7406\u64cd\u4f5c\n\tGL_CALL(glClear(GL_COLOR_BUFFER_BIT));\n\n\t\/\/\u7ed1\u5b9a\u5f53\u524d\u7684program\n\tshader->begin();\n\n\tshader->setInt(\"sampler\", 0);\n\n\t\/\/\u7ed1\u5b9a\u5f53\u524d\u7684vao\n\tGL_CALL(glBindVertexArray(vao));\n\n\t\/\/\u53d1\u51fa\u7ed8\u5236\u6307\u4ee4\n\tGL_CALL(glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0));\n\tGL_CALL(glBindVertexArray(0));\n\n\tshader->end();\n}\n\n\nint main() {\n\tif (!app->init(800, 600)) {\n\t\treturn -1;\n\t}\n\n\tapp->setResizeCallback(OnResize);\n\tapp->setKeyBoardCallback(OnKey);\n\n\t\/\/\u8bbe\u7f6eopengl\u89c6\u53e3\u4ee5\u53ca\u6e05\u7406\u989c\u8272\n\tGL_CALL(glViewport(0, 0, 800, 600));\n\tGL_CALL(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));\n\n\tprepareShader();\n\tprepareVAO();\n\tprepareTexture();\n\n\twhile (app->update()) {\n\n\t\trender();\n\t\t\n\t}\n\n\tapp->destroy();\n\n\treturn 0;\n}\n\nfragment.glsl\n#version 460 core\nout vec4 FragColor;\n\nin vec3 color;\nin vec2 uv;\n\nuniform sampler2D sampler;\n\nvoid main()\n{\n\tFragColor = texture(sampler, uv);\n}\n\nshader.cpp\n#include\"shader.h\"\n#include\"..\/wrapper\/checkError.h\"\n\n#include&lt;string>\n#include&lt;fstream>\n#include&lt;sstream>\n#include&lt;iostream>\n\nShader::Shader(const char* vertexPath, const char* fragmentPath) {\n\t\/\/\u58f0\u660e\u88c5\u5165shader\u4ee3\u7801\u5b57\u7b26\u4e32\u7684\u4e24\u4e2astring\n\tstd::string vertexCode;\n\tstd::string fragmentCode;\n\n\t\/\/\u58f0\u660e\u7528\u4e8e\u8bfb\u53d6vs\u8ddffs\u6587\u4ef6\u7684inFileStream\n\tstd::ifstream vShaderFile;\n\tstd::ifstream fShaderFile;\n\n\t\/\/\u4fdd\u8bc1ifstream\u9047\u5230\u95ee\u9898\u7684\u65f6\u5019\u53ef\u4ee5\u629b\u51fa\u5f02\u5e38\n\tvShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);\n\tfShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);\n\ttry {\n\t\t\/\/1 \u6253\u5f00\u6587\u4ef6\n\t\tvShaderFile.open(vertexPath);\n\t\tfShaderFile.open(fragmentPath);\n\t\t\n\t\t\/\/2 \u5c06\u6587\u4ef6\u8f93\u5165\u6d41\u5f53\u4e2d\u7684\u5b57\u7b26\u4e32\u8f93\u5165\u5230stringStream\u91cc\u9762\n\t\tstd::stringstream vShaderStream, fShaderStream;\n\t\tvShaderStream &lt;&lt; vShaderFile.rdbuf();\n\t\tfShaderStream &lt;&lt; fShaderFile.rdbuf();\n\n\t\t\/\/3 \u5173\u95ed\u6587\u4ef6\n\t\tvShaderFile.close();\n\t\tfShaderFile.close();\n\n\t\t\/\/4 \u5c06\u5b57\u7b26\u4e32\u4ecestringStream\u5f53\u4e2d\u8bfb\u53d6\u51fa\u6765\uff0c\u8f6c\u5316\u5230code String\u5f53\u4e2d\n\t\tvertexCode = vShaderStream.str();\n\t\tfragmentCode = fShaderStream.str();\n\t}\n\tcatch (std::ifstream::failure&amp; e) {\n\t\tstd::cout &lt;&lt; \"ERROR: Shader File Error: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n\t}\n\n\tconst char* vertexShaderSource = vertexCode.c_str();\n\tconst char* fragmentShaderSource = fragmentCode.c_str();\n\t\/\/1 \u521b\u5efaShader\u7a0b\u5e8f\uff08vs\u3001fs\uff09\n\tGLuint vertex, fragment;\n\tvertex = glCreateShader(GL_VERTEX_SHADER);\n\tfragment = glCreateShader(GL_FRAGMENT_SHADER);\n\n\t\/\/2 \u4e3ashader\u7a0b\u5e8f\u8f93\u5165shader\u4ee3\u7801\n\tglShaderSource(vertex, 1, &amp;vertexShaderSource, NULL);\n\tglShaderSource(fragment, 1, &amp;fragmentShaderSource, NULL);\n\n\t\/\/3 \u6267\u884cshader\u4ee3\u7801\u7f16\u8bd1 \n\tglCompileShader(vertex);\n\t\/\/\u68c0\u67e5vertex\u7f16\u8bd1\u7ed3\u679c\n\tcheckShaderErrors(vertex, \"COMPILE\");\n\t\n\tglCompileShader(fragment);\n\t\/\/\u68c0\u67e5fragment\u7f16\u8bd1\u7ed3\u679c\n\tcheckShaderErrors(fragment, \"COMPILE\");\n\t\n\t\/\/4 \u521b\u5efa\u4e00\u4e2aProgram\u58f3\u5b50\n\tmProgram = glCreateProgram();\n\n\t\/\/6 \u5c06vs\u4e0efs\u7f16\u8bd1\u597d\u7684\u7ed3\u679c\u653e\u5230program\u8fd9\u4e2a\u58f3\u5b50\u91cc\n\tglAttachShader(mProgram, vertex);\n\tglAttachShader(mProgram, fragment);\n\n\t\/\/7 \u6267\u884cprogram\u7684\u94fe\u63a5\u64cd\u4f5c\uff0c\u5f62\u6210\u6700\u7ec8\u53ef\u6267\u884cshader\u7a0b\u5e8f\n\tglLinkProgram(mProgram);\n\n\t\/\/\u68c0\u67e5\u94fe\u63a5\u9519\u8bef\n\tcheckShaderErrors(mProgram, \"LINK\");\n\n\t\/\/\u6e05\u7406\n\tglDeleteShader(vertex);\n\tglDeleteShader(fragment);\n}\nShader::~Shader() {\n\n}\n\nvoid Shader::begin() {\n\tGL_CALL(glUseProgram(mProgram));\n}\n\nvoid Shader::end() {\n\tGL_CALL(glUseProgram(0));\n}\n\nvoid Shader::setFloat(const std::string&amp; name, float value) {\n\t\/\/1 \u901a\u8fc7\u540d\u79f0\u62ff\u5230Uniform\u53d8\u91cf\u7684\u4f4d\u7f6eLocation\n\tGLint location = GL_CALL(glGetUniformLocation(mProgram, name.c_str()));\n\n\t\/\/2 \u901a\u8fc7Location\u66f4\u65b0Uniform\u53d8\u91cf\u7684\u503c\n\tGL_CALL(glUniform1f(location, value));\n}\n\nvoid Shader::setVector3(const std::string&amp; name, float x, float y, float z) {\n\t\/\/1 \u901a\u8fc7\u540d\u79f0\u62ff\u5230Uniform\u53d8\u91cf\u7684\u4f4d\u7f6eLocation\n\tGLint location = GL_CALL(glGetUniformLocation(mProgram, name.c_str()));\n\t\n\t\/\/2 \u901a\u8fc7Location\u66f4\u65b0Uniform\u53d8\u91cf\u7684\u503c\n\tGL_CALL(glUniform3f(location, x, y, z));\n}\n\n\/\/\u91cd\u8f7d overload\nvoid Shader::setVector3(const std::string&amp; name, const float* values) {\n\t\/\/1 \u901a\u8fc7\u540d\u79f0\u62ff\u5230Uniform\u53d8\u91cf\u7684\u4f4d\u7f6eLocation\n\tGLint location = GL_CALL(glGetUniformLocation(mProgram, name.c_str()));\n\n\t\/\/2 \u901a\u8fc7Location\u66f4\u65b0Uniform\u53d8\u91cf\u7684\u503c\n\t\/\/\u7b2c\u4e8c\u4e2a\u53c2\u6570\uff1a\u4f60\u5f53\u524d\u8981\u66f4\u65b0\u7684uniform\u53d8\u91cf\u5982\u679c\u662f\u6570\u7ec4\uff0c\u6570\u7ec4\u91cc\u9762\u5305\u62ec\u591a\u5c11\u4e2a\u5411\u91cfvec3\n\tGL_CALL(glUniform3fv(location, 1, values));\n}\n\nvoid Shader::setInt(const std::string&amp; name, int value) {\n\t\/\/1 \u901a\u8fc7\u540d\u79f0\u62ff\u5230Uniform\u53d8\u91cf\u7684\u4f4d\u7f6eLocation\n\tGLint location = GL_CALL(glGetUniformLocation(mProgram, name.c_str()));\n\n\t\/\/2 \u901a\u8fc7Location\u66f4\u65b0Uniform\u53d8\u91cf\u7684\u503c\n\tglUniform1i(location, value);\n}\n\n\nvoid Shader::checkShaderErrors(GLuint target, std::string type) {\n\tint success = 0;\n\tchar infoLog&#91;1024];\n\n\tif (type == \"COMPILE\") {\n\t\tglGetShaderiv(target, GL_COMPILE_STATUS, &amp;success);\n\t\tif (!success) {\n\t\t\tglGetShaderInfoLog(target, 1024, NULL, infoLog);\n\t\t\tstd::cout &lt;&lt; \"Error: SHADER COMPILE ERROR\" &lt;&lt; \"\\n\" &lt;&lt; infoLog &lt;&lt; std::endl;\n\t\t}\n\t}\n\telse if (type == \"LINK\") {\n\t\tglGetProgramiv(target, GL_LINK_STATUS, &amp;success);\n\t\tif (!success) {\n\t\t\tglGetProgramInfoLog(target, 1024, NULL, infoLog);\n\t\t\tstd::cout &lt;&lt; \"Error: SHADER LINK ERROR \" &lt;&lt; \"\\n\" &lt;&lt; infoLog &lt;&lt; std::endl;\n\t\t}\n\t}\n\telse {\n\t\tstd::cout &lt;&lt; \"Error: Check shader errors Type is wrong\" &lt;&lt; std::endl;\n\t}\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">MIPMAP<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u6444\u50cf\u673a<\/h2>\n","protected":false},"excerpt":{"rendered":"<p>\u7eb9\u7406 \u7531\u4e8e\u5750\u6807\u5dee\u5f02\uff0c\u8bfb\u53d6\u56fe\u50cf\u540e\u8981\u53cd\u8f6cy\u8f74\uff0c\u8bfb\u53d6\u540e\u53d1\u5230\u663e\u5b58\u540e\u8bb0\u5f97\u628a\u5185\u5b58\u91cc\u7684\u56fe\u7247\u5bf9\u8c61\u91ca\u653e\u6389 \u4e4b\u540e\u751f\u6210\u7eb9\u7406\u6fc0\u6d3b\u7ed1\u5b9a\uff0c\u7eb9\u7406\u6570\u636e\u4f20\u8f93\u5230\u663e\u5b58  &#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1323","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts\/1323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/comments?post=1323"}],"version-history":[{"count":2,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts\/1323\/revisions"}],"predecessor-version":[{"id":1325,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts\/1323\/revisions\/1325"}],"wp:attachment":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/media?parent=1323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/categories?post=1323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/tags?post=1323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}