TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
2 months ago | |
|---|---|---|
| .. | ||
| cpp-src | 2 months ago | |
| php-src | 2 months ago | |
| 1r.png | 2 months ago | |
| README.md | 2 months ago | |
| main.php | 2 months ago | |
| project.yml | 2 months ago | |
| ref1.txt | 2 months ago | |
| ref2.txt | 2 months ago | |
README.md
TypePHP Ocean Demo
这是一个新的 OpenGL 示例项目,场景为海洋、天空和一条可移动小船。它复用 minecraft-demo 的 Win32/WGL 思路,但不使用方块世界,重点展示程序化水面和天气变化。
特性
- PHP/TypePHP 负责游戏逻辑:小船移动、惯性、昼夜循环、随机天气切换。
- C++ 只负责底层窗口、键盘输入、OpenGL 渲染和退出确认框。
- 程序化天空:白天、夜晚、傍晚、清晨的颜色变化。
- 程序化 skybox:远景只保留镜头旋转,不参与世界平移。
- 程序化海面:动态波浪、法线扰动、漫反射、镜面高光和菲涅尔近似。
- 参考
D:\workspace\Ocean-Simulation\Ocean_Simulation的 Phillips Spectrum、PBR/Fresnel、roughness/AO 和指数雾思路,移植为固定管线可运行的轻量版本。 - 天气:晴天、阴天、雨天随机变化。
- 小船支持
W/A/S/D四方向移动。 - 鼠标控制自由摄像机视角。
- WASD 采用类似 Minecraft 的镜头相对移动:
W向镜头前方,A/D横向移动。 - 开放世界分块:PHP 按小船所在 chunk 渐进生成和卸载海上对象。
- 海上对象包括浮标、灯浮标和小礁石,用于提供移动参照和远景层次。
- 新增程序化海岛和大型帆船对象,尝试接近
1r.png的前景船、中景岛、远景层次构图。 - 远处线性雾效,使海平线自然融合。
- HDR 风格 tone mapping,使强高光和暗部层次更自然。
- Bloom 近似:太阳、晨昏地平线和夜间船灯有柔和光晕。
- 夜间小船灯作为点光源影响近处水面。
- 参考
D:\workspace\volumetric-clouds的体积云 shader,将 coverage、wind shear、多层噪声、Beer-Lambert 透射、powder effect 和 Henyey-Greenstein 相位函数移植为固定管线可绘制的分层云近似。
关于 ref1.txt 建议
ref1.txt 建议使用 OpenGL 3.3、GLFW、GLEW/GLAD、GLM 和 stb_image。这个示例为了保持 TypePHP 示例项目轻量、可直接用当前编译器构建,继续使用 Win32/WGL 和 OpenGL 固定管线,没有引入额外第三方依赖。
已按同类思路实现:
- 天空盒式远景层
- 动态水面网格
- 多正弦波浪
- 基础光照、高光和菲涅尔近似
- 鼠标摄像机控制
- 雾效
关于 Ocean-Simulation
D:\workspace\Ocean-Simulation\Ocean_Simulation 使用现代 OpenGL shader、tessellation、OpenCL FFT、高度贴图、HDR skybox 和 PBR/IBL。当前 TypePHP demo 没有引入这些运行时依赖,而是提取了其中适合示例项目的核心算法思想:
- 多频谱波浪叠加,使用深水色散关系
sqrt(g * k)。 - 斜率推导法线、roughness 和 ambient occlusion。
- Fresnel-Schlick 近似。
- GGX/Reitz 风格高光分布的轻量化版本。
- 指数平方雾效,使海面远处自然融入天空。
关于 ref2.txt 建议
ref2.txt 进一步建议 PBR/IBL、FFT、HDR、Bloom、多光源和大气雾效。当前示例仍保持低依赖固定管线实现,但继续补上了可落地的近似:
- HDR 风格曝光和 tone mapping。
- 屏幕空间 Bloom 近似,不依赖 framebuffer 后处理。
- 夜间船灯点光源。
- 水面材质继续使用 Fresnel、roughness、AO 和高光分布。
- 继续保留指数平方雾效来模拟大气融合。
关于 volumetric-clouds
D:\workspace\volumetric-clouds 使用 OpenGL 4、3D 噪声纹理、compute shader 和全屏 ray marching。当前示例没有引入这些依赖,而是提取核心思路做轻量实现:
- 使用 value noise + Worley FBM 近似云密度。
- 使用 coverage 控制云层覆盖率,天气越差云层越厚。
- 使用 wind shear 和时间偏移让云层缓慢移动。
- 使用 Beer-Lambert 透射模拟云体厚度。
- 使用 powder effect 和 Henyey-Greenstein 相位函数近似云层散射。
- 使用多层半透明 quad strip 叠加,替代原先简单椭圆云。
- 海洋颜色使用深海吸收色、浅层散射、天空反射和雨天灰蓝衰减,比早期的亮青色更接近真实海面。
已知视觉问题修正
- 早期 skybox 使用立方体四个侧面,镜头旋转时会看到类似四面“屏障”的硬边界。现在已改为半球天空穹顶。
- 早期水面是方形网格并按单方向淡出,远处边缘可能像边界。现在改为更大范围的水面网格,并按径向距离平滑淡出。
编译
php bin\compiler.php examples\ocean-demo\project.yml
编译产物输出到仓库根目录:
ocean_demo.exe
运行
.\ocean_demo.exe
操作
W/A/S/D移动小船- 鼠标移动视角
Esc弹出退出确认框