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.
 
 
韩天峰 e5dbf10ceb feat(ocean): add ocean demo with Godot integration 2 months ago
..
cpp-src feat(ocean): add ocean demo with Godot integration 2 months ago
php-src feat(ocean): add ocean demo with Godot integration 2 months ago
1r.png feat(ocean): add ocean demo with Godot integration 2 months ago
README.md feat(ocean): add ocean demo with Godot integration 2 months ago
main.php feat(ocean): add ocean demo with Godot integration 2 months ago
project.yml feat(ocean): add ocean demo with Godot integration 2 months ago
ref1.txt feat(ocean): add ocean demo with Godot integration 2 months ago
ref2.txt feat(ocean): add ocean demo with Godot integration 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 弹出退出确认框