{"id":22243813,"url":"https://github.com/guyi2000/terrainengine","last_synced_at":"2026-05-04T04:31:56.806Z","repository":{"id":242326925,"uuid":"809272476","full_name":"guyi2000/TerrainEngine","owner":"guyi2000","description":"Terrain Engine by OpenGL","archived":false,"fork":false,"pushed_at":"2024-06-02T08:32:05.000Z","size":1384,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-30T10:13:05.081Z","etag":null,"topics":["glsl","opengl","shader"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guyi2000.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-02T08:06:36.000Z","updated_at":"2024-06-02T08:32:08.000Z","dependencies_parsed_at":"2024-06-02T09:29:03.534Z","dependency_job_id":"332d0c66-84ea-42d4-8e6d-4c0c94da1243","html_url":"https://github.com/guyi2000/TerrainEngine","commit_stats":null,"previous_names":["guyi2000/terrainengine"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTerrainEngine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTerrainEngine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTerrainEngine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTerrainEngine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guyi2000","download_url":"https://codeload.github.com/guyi2000/TerrainEngine/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245449531,"owners_count":20617187,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["glsl","opengl","shader"],"created_at":"2024-12-03T04:29:24.151Z","updated_at":"2026-05-04T04:31:51.784Z","avatar_url":"https://github.com/guyi2000.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Terrain Engine\n\n## 演示视频\n\nhttps://github.com/guyi2000/TerrainEngine/assets/16850027/af0a0626-a7dc-443a-996c-9899e0b4db94\n\n## SkyBox\n\n- 没有使用Cubemap，原因是底面为水，纹理的重复模式不同\n- 绑定一个VAO、VBO、EBO，对五个面进行旋转方法进行绘制\n- 封装为一个类中，完成天空盒的Stretch功能\n- 使用`GL_CLAMP_TO_EDGE`完成边缘消去\n\n## Water wave\n\n- Water使用新的VAO、VBO、EBO，纹理使用`GL_REPEAT`重复\n- 通过改变纹理坐标完成水的流动效果\n\n## Terrain model\n\n- 读取`heightmap.bmp`，注意其为3通道8位灰度图，所以可以间隔取值，并将值映射到高度所在范围\n- 以`heightmap.bmp`为分辨率生成`vertices`和`indices`用于VAO、VBO、EBO\n\n```C++\nunsigned char* data = stbi_load(\"data/heightmap.bmp\", \u0026width, \u0026height, \u0026nrComponents, 0);\nfor (int i = 0; i \u003c height; i++) {\n    for (int j = 0; j \u003c width; j++) {\n        vertices.push_back((float)j / height);\n        vertices.push_back((float)(*(data + 3 * (i * width + j))) / 1500.0f);\n        vertices.push_back((float)i / width);\n        vertices.push_back((float)j / height);\n        vertices.push_back((float)i / width);\n    }\n}\nfor (int i = 0; i \u003c height - 1; i++) {\n    for (int j = 0; j \u003c width - 1; j++) {\n        indices.push_back(i * width + j);\n        indices.push_back(i * width + j + 1);\n        indices.push_back((i + 1) * width + j);\n        indices.push_back(i * width + j + 1);\n        indices.push_back((i + 1) * width + j + 1);\n        indices.push_back((i + 1) * width + j);\n    }\n}\n```\n\n- 纹理坐标映射后，注意此处使用两个纹理，一个是`terrain-texture3.bmp`另一个是`detail.bmp`\n- 纹理坐标的混合使用`SRC1+SRC2-0.5`的形式\n- 由于detail需要重复，因此在片段着色器中将其`*10`，表示每个方向重复10次\n\n## Reflection\n\n- 反射实现主要是将Water改为半透明，然后重新绘制一个倒的天空盒与Terrain Model\n- 具体可以修改顶点着色器，将y坐标反转并做简单的坐标变换\n\n## Interaction\n\n- 使用`camera.hpp`完成，同之前作业，增加了UP与DOWN的行为\n\n### 操作指南\n\n- \u003ckbd\u003eW\u003c/kbd\u003e: 前进\n- \u003ckbd\u003eS\u003c/kbd\u003e: 后退\n- \u003ckbd\u003eA\u003c/kbd\u003e: 向左\n- \u003ckbd\u003eD\u003c/kbd\u003e: 向右\n- \u003ckbd\u003eSpace\u003c/kbd\u003e: 上升\n- \u003ckbd\u003eQ\u003c/kbd\u003e: 下降\n- 鼠标移动：视角变换\n- 鼠标滚轮：放大缩小\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguyi2000%2Fterrainengine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguyi2000%2Fterrainengine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguyi2000%2Fterrainengine/lists"}