# hms-scene-RTcore-demo
**Repository Path**: hms-core/hms-scene-RTcore-demo
## Basic Information
- **Project Name**: hms-scene-RTcore-demo
- **Description**: 华为图形引擎服务光线追踪内核使用的示例代码,实现了利用RTcore接口实现反射效果和绘制三角形两种使用示例
- **Primary Language**: C++
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2021-04-19
- **Last Updated**: 2025-01-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 光线追踪内核使用的示例代码
[English](README.md) | 中文
## 目录
* [简介](#简介)
* [编译](#编译)
* [例子](#例子)
* [参考项目](#参考项目)
* [技术支持](#技术支持)
* [许可证](#许可证)
## 简介
本项目主要是用于展示如使用华为提供的移动端光线追踪内核,搭建混合渲染管线以及实现局部光追反射效果。项目中关于Vulkan封装参考了SaschaWillems的VulkanExample[[1]](https://github.com/SaschaWillems/Vulkan)项目,例子中关于PBR部分知识参考了LearnOpenGL[[2]](https://learnopengl-cn.github.io/07%20PBR/02%20Lighting/#pbr), 在画三角形的例子中,关于屏幕上每个像素点主光线计算原理参考了Ray Tracing in One Weekend[[3]](https://raytracing.github.io/books/RayTracingInOneWeekend.html)。
本项目涉及2个Demo:(1)通过光线追踪内核画一个三角形;(2)实现PBR的渲染管线,并在此基础上搭建基于混合渲染的反射效果;
## 编译
目前所有例子均在Android / HarmonyOS平台测试过,且包含了所需要的所有配置文件。
**运行在 Android / HarmonyOS 平台**
1\. 开发环境
* Android studio 4.0及以上版本
* ndk 20.1.5948944及以上版本
* Android SDK 29.0.0及以上版本
* 设置环境变量ANDROID_HOME ANDROID_NDK_HOME分别指向 Android SDK目录和NDK目录
2\. 编译运行
2.1 使用IDE
用Android Studio打开`android`目录,同步后,连接手机,点击运行按钮或快捷键Shift+F10即可执行代码
生成的apk文件归档在android\examples\bin目录下。
2.2 使用命令行
USB连接手机,开启ADB调试模式,执行以下命令
```bat
cd android
call .\gradlew clean
call .\gradlew installDebug # or `call .\gradlew assembleDebug` for just build apk
adb shell am start -n "com.huawei.rtcore.vkhybridrt/.VulkanActivity"
```
## 例子
### [光线追踪画三角形](examples/triangle)
本例子展示光线追踪内核最基本的使用,利用光线追踪对主光线与三角形求交来替代原有的光栅化的过程。整体流程如下图所示。
1\. 通过相机坐标与屏幕上像素点的坐标计算世界坐标系的主光线(RaytracingTriangle.cpp 中 `generatePrimary`函数);
2\. 将光线从CPU侧拷贝到GPU侧(tiangle.cpp中`updateRayBuffers`函数);
3\. 光线构建求交(上图中红框部分),主要包含**求交构建初始化**,**加速结构构建**,**光线求交**这三部分,我们着重介绍这三个部分。在现有的例子中,我们在`VulkanTraceRay`类中对光追内核进行了调用:
* `prepare`函数获取compute queue并调用光追内核的`Setup`函数进行初始化;
* `buildBVH(vertices, indices, modelMatrix)` 首先将顶点转换到世界坐标系,再调用`CreateBLAS`与`CreateTLAS`函数进行底层与顶层加速结构的构建;
* `trayRay` 函数调用光追内核的TraceRays接口进行求交,然后求交结果, 效果如下图所示:
4\. 利用图形管线可视化交点结果,`triangle/VulkanTrianglePipeline`类对整个屏幕逐像素处理获取求交结果并输出颜色。
### [用混合渲染管线实现局部反射](examples/hybridRayTracing)
本例子搭建了一套基于光线追踪的混合渲染管线,实现了光追局部反射的后 处理效果,具体流程如下图。
1\. 通过传统光栅化的方法,实现了PBR的渲染管线(图中黄色虚线部分),具体参考代码:
* `examples/hybridreRayTracing/HybridRayTracing`
* `base/VulkanScenePipeline`
* `base/VulkanImageBasedLighting`
* `base/VulkanSkyboxPipeline`
2\. 用于生成反射贴图的光追渲染管线,调用光追内核接口搭建管线所需的资源,在着色器代码中生成反射光线,与场景求交,获取颜色,得到反射贴图:
* `examples/hybridreRayTracing/RayTracingPass`
* `data/shaders/glsl/hybridRayTracing/raytracing_color.frag`
3\. 最后利用一个一条融合管线,将反射贴图与原始管线显示的图像进行融合:
* `examples/hybridreRayTracing/VulkanOnscreenPipeline`
最终得到反射的效果图如下:
## 参考项目
[1] https://github.com/SaschaWillems/Vulkan
[2] [learnOpenGL/PBR](https://learnopengl-cn.github.io/07%20PBR/02%20Lighting/#pbr)
[3] https://raytracing.github.io/books/RayTracingInOneWeekend.html
## 技术支持
如果您对HMS Core还处于评估阶段,可在[Reddit社区](https://www.reddit.com/r/HuaweiDevelopers/)获取关于HMS Core的最新讯息,并与其他开发者交流见解。
如果您对使用HMS示例代码有疑问,请尝试:
- 开发过程遇到问题上[Stack Overflow](https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Votes),在`huawei-mobile-services`标签下提问,有华为研发专家在线一对一解决您的问题。
- 到[华为开发者论坛](https://developer.huawei.com/consumer/cn/forum/blockdisplay?fid=18) HMS Core板块与其他开发者进行交流。
如果您在尝试示例代码中遇到问题,请向仓库提交[issue](https://github.com/HMS-Core/hms-scene-fine-grained-demo/issues),也欢迎您提交[Pull Request](https://github.com/HMS-Core/hms-scene-fine-grained-demo/pulls)。
## 许可证
光追内核示例代码采用的许可证为Apache License, version 2.0,参考 [LICENSE.md](LICENSE.md) 获取更多许可证信息;