top of page
简易我的世界
![](https://static.wixstatic.com/media/bd49bc_d700d10490944374bdfb2d1f3620444bf000.jpg/v1/fill/w_812,h_487,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_d700d10490944374bdfb2d1f3620444bf000.jpg)
项目总览
程序化生成
基于Perlin Noise的程序化地图生成,包含草地、泥土、海滩、雪原、河流、海洋并且根据不同的地形生成各种植被
![](https://static.wixstatic.com/media/bd49bc_c95b3f12cc9b4450a8a20a4e964a9058f000.jpg/v1/fill/w_475,h_267,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_c95b3f12cc9b4450a8a20a4e964a9058f000.jpg)
程序化生成
每个Chunk程序生成代码
Hidden Surface Removal
通过使用背面剔除来剔除 99% 的面以优化性能,即使有1 亿个块,也能保持大约600 FPS。对于每个块,只有当相邻块为空气时,我才将顶点信息放入顶点缓冲区。
![](https://static.wixstatic.com/media/bd49bc_9e07eefc692d4d73854372d9d4203206f000.jpg/v1/fill/w_475,h_267,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_9e07eefc692d4d73854372d9d4203206f000.jpg)
Hidden Surface Removal
每个方块Hidden Surface Removal的代码
基于体素的光照
每当玩家放置一个方块时,该方块都会使用方块迭代器检查所有附近的方块(16x16),并进行光强度衰减(初始强度为 16,迭代每个方块时为 -1)重建Chunk,并根据光强度在着色器中设置亮度。
![](https://static.wixstatic.com/media/bd49bc_fb7a8d6ea7b94e8a97b6044a528db069f000.jpg/v1/fill/w_373,h_210,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_fb7a8d6ea7b94e8a97b6044a528db069f000.jpg)
将 GlowStone 放到世界中
![](https://static.wixstatic.com/media/bd49bc_af8e21039ffc47979dc04e700eb0d284f000.jpg/v1/fill/w_373,h_210,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_af8e21039ffc47979dc04e700eb0d284f000.jpg)
体素光照传播
放置/移除方块时把Chunk标记为Dirty并处理灯光
放置/挖掘方块
我使用了快速射线投射与方块相交,并且在此基础上,为了提高性能,我还使用方块迭代器来加速相交过程。
![](https://static.wixstatic.com/media/bd49bc_ced7df7311ec4652bfe19a87c14d840ef000.jpg/v1/fill/w_357,h_201,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_ced7df7311ec4652bfe19a87c14d840ef000.jpg)
将方块放置到世界里
方块迭代器类的代码
使用方块迭代器进行射线投射
地图流式加载
我使用多线程根据玩家的世界位置每帧仅加载一个Chunk(32768个方块) ,并取消最大半径之外的Chunk。
通过距离雾来掩盖新Chunk的加载。
![](https://static.wixstatic.com/media/bd49bc_8fef28283b3649a09a8d9187cafbc731f000.jpg/v1/fill/w_421,h_237,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_8fef28283b3649a09a8d9187cafbc731f000.jpg)
地图流式加载和雾
地图流式加载代码
截图
![sm1](https://static.wixstatic.com/media/bd49bc_5f1c94fe291f4728aab2eea6e52e8cb8~mv2.png/v1/fill/w_980,h_487,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_5f1c94fe291f4728aab2eea6e52e8cb8~mv2.png)
sm1
![sm3](https://static.wixstatic.com/media/bd49bc_a9925f523d8d4ff78d57fdbddc23b745~mv2.png/v1/fill/w_980,h_493,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_a9925f523d8d4ff78d57fdbddc23b745~mv2.png)
sm3
![sm4](https://static.wixstatic.com/media/bd49bc_15c3fae6053b4836a6e89dc1cd4e31f3~mv2.png/v1/fill/w_980,h_489,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_15c3fae6053b4836a6e89dc1cd4e31f3~mv2.png)
sm4
![sm1](https://static.wixstatic.com/media/bd49bc_5f1c94fe291f4728aab2eea6e52e8cb8~mv2.png/v1/fill/w_980,h_487,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/bd49bc_5f1c94fe291f4728aab2eea6e52e8cb8~mv2.png)
sm1
1/4
bottom of page