{"id":20144944,"url":"https://github.com/blurgyy/rwwtt","last_synced_at":"2025-03-03T00:12:00.943Z","repository":{"id":117975092,"uuid":"262653627","full_name":"blurgyy/rwwtt","owner":"blurgyy","description":"Rendering 🍦 with two triangles","archived":false,"fork":false,"pushed_at":"2020-05-25T16:02:42.000Z","size":3898,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"rwwtt","last_synced_at":"2025-01-13T10:51:11.848Z","etag":null,"topics":["glsl","sdf","shader","vulkan"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/blurgyy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2020-05-09T20:30:10.000Z","updated_at":"2022-05-21T14:10:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"a6693fa6-d324-493e-93a4-7eab6cc3fe94","html_url":"https://github.com/blurgyy/rwwtt","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blurgyy%2Frwwtt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blurgyy%2Frwwtt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blurgyy%2Frwwtt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blurgyy%2Frwwtt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blurgyy","download_url":"https://codeload.github.com/blurgyy/rwwtt/tar.gz/refs/heads/rwwtt","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241587858,"owners_count":19986628,"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","sdf","shader","vulkan"],"created_at":"2024-11-13T22:12:52.177Z","updated_at":"2025-03-03T00:12:00.935Z","avatar_url":"https://github.com/blurgyy.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Final Project: 用两个三角形渲染世界\n\n演示视频: [`https://blurgy.xyz/cg/demo.mp4`](https://blurgy.xyz/cg/demo.mp4)\n\npresentation 视频: [`https://blurgy.xyz/cg/pre.mp4`](https://blurgy.xyz/cg/pre.mp4)\n\nGitHub: [`https://github.com/Blurgyy/rwwtt`](https://github.com/Blurgyy/rwwtt)\n\n![demo](images/demo.png)\n\n## 使用\n\n1. 在 `/shaders` 目录下执行 `make all` 以编译顶点着色器和片段着色器 (需要安装 GLSL 编译器 `glslc`)\n2. **得到编译出的 `/shaders/vert.spv` 和 `/shaders/icecream.spv` 之后**, 回到根目录下执行\n\n```bash\n$ mkdir build \u0026\u0026 cd build\n$ cmake ..\t# 需要 Vulkan 支持\n$ make\t\t# 编译\n$ ./rwwtt \t# 运行\n```\n\n## 说明\n\n- 使用 Vulkan 直接传递两个覆盖整个屏幕的三角形给 vertex shader. 渲染过程全部使用 GLSL 在 fragment shader 中实现.\n- 在 Fragment shader 中构造距离场, 然后使用 ray marching 方法渲染场景.\n- ray marching 中使用了 adaptive eps, 令固定的 epsilon 乘以当前点与起点之间的距离, 代表 ray marching 走得越远, 则判断与物体相交的条件越宽松.\n- 距离场中某一位置 p 的法线方向可以通过计算距离场的梯度方向来估计, 距离场的梯度方向是该点到场景中物体的距离变化最快的方向.\n- 根据 ray marching 的特性估计了软阴影, 具体: 从着色点向光源做 ray marching, 在每一步估计一个阴影, 某一步距离附近的物体越近则阴影越黑; 同时在某一步离着色点越远, 该步估计的阴影颜色应越浅, 两个因素结合起来再乘以一个系数 k, 取 ray marching 时估计的最\"黑\"的阴影作为着色点的阴影颜色. 如果途中打到物体, 则直接返回黑色.\n- 根据 ray marching 的特性估计了环境光遮蔽. 具体: 沿表面法向量向外取若干个点 q (5 个), 根据 q 点到世界的距离 d=map(q) 和 q 点到 p 点的距离 h, 就可以估计出点 p 处的环境光遮蔽系数 occ.\n- 定义了材质\n- 最后添加了反走样 (SSAA 2x).\n\n## 参考资料\n\n- 调用 Vulkan API 的 C++ 代码参考自 [`https://vulkan-tutorial.com/`](https://vulkan-tutorial.com/)\n- Fragment shader 中:\n  - 平滑融合两个形状的函数参考自 [`https://iquilezles.org/www/articles/smin/smin.htm`](https://iquilezles.org/www/articles/smin/smin.htm), 使用了其中提到的多项式型 blend 函数.\n  - 自己实现的圆台距离场函数因为没有考虑点在内部时的距离, 对圆台求法线时会在侧面出现大量噪点. 修正后的圆台的距离场函数参考自 [`https://iquilezles.org/www/articles/distfunctions/distfunctions.htm`](https://iquilezles.org/www/articles/distfunctions/distfunctions.htm).\n  - 软阴影的估计方式参考自 [`https://iquilezles.org/www/articles/rmshadows/rmshadows.htm`](https://iquilezles.org/www/articles/rmshadows/rmshadows.htm).\n  - 环境光遮蔽的估计方式参考自:\n    - [`https://www.iquilezles.org/www/material/nvscene2008/rwwtt.pdf`](https://www.iquilezles.org/www/material/nvscene2008/rwwtt.pdf) 第 53 页\n    - [`https://www.shadertoy.com/view/lsKcDD`](https://www.shadertoy.com/view/lsKcDD)\n- ray marching 中的 adaptive eps, 使用距离场通过变换生成绕轴对称的物体, 环境光遮蔽等技巧参考自:\n  - NVScene 2008: Rendering Worlds with Two Triangles: Raytracing on the GPU\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblurgyy%2Frwwtt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblurgyy%2Frwwtt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblurgyy%2Frwwtt/lists"}