鸿蒙(API 12 Beta6版)GPU加速引擎服务【自适应VRS】
XEngine Kit提供自适应VRS功能,其通过合理分配画面的计算资源,视觉无损降低渲染频次,使不同的渲染图像使用不同的渲染速率,能够有效提高渲染性能。
接口说明
以下接口为自适应VRS设置接口,如要使用更丰富的设置和查询接口。
接口名 | 描述 |
---|---|
const GLubyte * HMS_XEG_GetString (GLenum name) | XEngine GLES扩展特性查询接口。 |
GL_APICALL void GL_APIENTRY HMS_XEG_AdaptiveVRSParameter (GLenum pname, GLvoid * param ) | 设置自适应VRS的参数。 |
GL_APICALL void GL_APIENTRY HMS_XEG_DispatchAdaptiveVRS (GLfloat * reprojectionMatrix, GLuint inputColorImage, GLuint inputDepthImage, GLuint shadingRateImage) | 计算着色率图像。 |
GL_APICALL void GL_APIENTRY HMS_XEG_ApplyAdaptiveVRS (GLuint shadingRateImage) | 将着色率图像应用到渲染目标中。 |
VKAPI_ATTR VkResult VKAPI_CALL HMS_XEG_EnumerateDeviceExtensionProperties (VkPhysicalDevice physicalDevice, uint32_t * pPropertyCount, XEG_ExtensionProperties * pProperties ) | XEngine Vulkan扩展特性查询接口。 |
VKAPI_ATTR VkResult VKAPI_CALL HMS_XEG_CreateAdaptiveVRS (VkDevice device, XEG_AdaptiveVRSCreateInfo * pXegAdaptiveVRSCreateInfo, XEG_AdaptiveVRS * pXegAdaptiveVRS ) | 创建XEG_AdaptiveVRS对象。 |
VKAPI_ATTR void VKAPI_CALL HMS_XEG_CmdDispatchAdaptiveVRS (VkCommandBuffer cmdBuffer, XEG_AdaptiveVRS xegAdaptiveVRS, XEG_AdaptiveVRSDescription * pXegAdaptiveVRSDescription ) | 执行计算自适应可变着色率命令。 |
VKAPI_ATTR void VKAPI_CALL HMS_XEG_DestroyAdaptiveVRS (XEG_AdaptiveVRS xegAdaptiveVRS) | 销毁XEG_AdaptiveVRS对象。 |
开发步骤
本章以GLES/Vulkan图像API集成为例,说明XEngine集成操作过程。
配置项目
编译HAP时,Native层so编译需要依赖NDK中的libxengine.so。
- 头文件引用
按需引用XEngine的头文件,如使用GLES自适应VRS功能。
#include <cstring>
#include <cstdlib>
#include <xengine/xeg_gles_extension.h>
#include <xengine/xeg_gles_adaptive_vrs.h>
按需引用XEngine的头文件,如使用Vulkan自适应VRS功能。
#include <string>
#include <vector>
#include <algorithm>
#include <xengine/xeg_vulkan_extension.h>
#include <xengine/xeg_vulkan_adaptive_vrs.h>
- 编写CMakeLists.txt
按需引用XEngine的CMakeLists,如使用GLES自适应VRS功能,CMakeLists.txt部分示例代码如下。
find_library(
# Sets the name of the path variable.
xengine-lib
# Specifies the name of the NDK library that you want CMake to locate.
xengine
)
find_library(
# Sets the name of the path variable.
EGL-lib
# Specifies the name of the NDK library that you want CMake to locate.
EGL
)
find_library(
# Sets the name of the path variable.
GLES-lib
# Specifies the name of the NDK library that you want CMake to locate.
GLESv3
)
target_link_libraries(nativerender PUBLIC
${EGL-lib} ${GLES-lib} ${xengine-lib})
按需引用XEngine的CMakeLists,如使用Vulkan自适应VRS功能,CMakeLists.txt部分示例代码如下。
find_library(
# Sets the name of the path variable.
xengine-lib
# Specifies the name of the NDK library that you want CMake to locate.
xengine
)
find_library(
# Sets the name of the path variable.
EGL-lib
# Specifies the name of the NDK library that you want CMake to locate.
EGL
)
find_library(
# Sets the name of the path variable.
Vulkan-lib
# Specifies the name of the NDK library that you want CMake to locate.
vulkan
)
target_link_libraries(nativerender PUBLIC
${EGL-lib} ${Vulkan-lib} ${xengine-lib})
集成自适应VRS功能(GLES)
自适应VRS功能GLES版本的着色率纹理创建和绑定由特性提供的接口实现。
- 调用[HMS_XEG_GetString]接口,查询XEngine支持的GLES扩展信息,如果支持则表示该特性相关接口可以使用。
// 查询XEngine支持的GLES扩展信息
const char* extensions = (const char*)HMS_XEG_GetString(XEG_EXTENSIONS);
// 查询是否支持自适应VRS
if (!strstr(extensions, XEG_ADAPTIVE_VRS_EXTENSION_NAME)) {
exit(1); // return error
}
- 调用[HMS_XEG_AdaptiveVRSParameter]接口,对自适应VRS的参数赋值。
// renderWidth与renderHeight分别为用户自定义的渲染宽度与渲染高度,此处以800*600分辨率为例
uint32_t renderWidth = 800;
uint32_t renderHeight = 600;
// inputSize为上一帧渲染管线最终渲染的图像尺寸,用户可自定义
GLsizei inputSize[2] = {static_cast<GLsizei>(renderWidth), static_cast<GLsizei>(renderHeight)};
HMS_XEG_AdaptiveVRSParameter(XEG_ADAPTIVE_VRS_INPUT_SIZE, inputSize);
// inputRegion为上一帧渲染管线最终渲染的图像区域,用户可自定义
GLuint inputRegion[4] = {0, 0, renderWidth, renderHeight};
HMS_XEG_AdaptiveVRSParameter(XEG_ADAPTIVE_VRS_INPUT_REGION, inputRegion);
// texelSizes为渲染的分片大小,用户可自定义,当前支持[8, 8]和[16, 16]两种规格
GLsizei texelSizes[2] = {8, 8};
HMS_XEG_AdaptiveVRSParameter(XEG_ADAPTIVE_VRS_TEXEL_SIZE, texelSizes);
// sensitivity为控制生成着色率图像的阈值,用户可自定义,建议取值范围为[0, 1]
GLfloat sensitivity = 0.15;
HMS_XEG_AdaptiveVRSParameter(XEG_ADAPTIVE_VRS_ERROR_SENSITIVITY, &sensitivity);
// flip为判断是否执行图像上下翻转,为true表示不进行图像上下翻转,false则表示进行图像上下翻转,此处以false为例
GLboolean flip = false;
HMS_XEG_AdaptiveVRSParameter(XEG_ADAPTIVE_VRS_FLIP, &flip);
- 调用[HMS_XEG_DispatchAdaptiveVRS]接口计算着色率图像。
// inputColorImage为用户自定义上一帧渲染管线最终渲染结果颜色附件纹理
GLuint inputColorImage;
// inputDepthImage为用户自定义当前帧渲染管线最终渲染结果深度附件纹理
GLuint inputDepthImage;
// outputShadingRateImage为用户可自定义生成着色率图像信息的纹理
GLuint outputShadingRateImage;
// reprojectionMatrix为用户根据投影矩阵和观察矩阵计算得来的重投影矩阵
float *reprojectionMatrix = nullptr;
HMS_XEG_DispatchAdaptiveVRS(reprojectionMatrix, inputColorImage, inputDepthImage, outputShadingRateImage);
-
调用[HMS_XEG_ApplyAdaptiveVRS]接口,将着色率图像应用到渲染目标中。
HMS_XEG_ApplyAdaptiveVRS(outputShadingRateImage );
集成自适应VRS功能(Vulkan)
- 调用[HMS_XEG_EnumerateDeviceExtensionProperties]接口,查询XEngine支持的Vulkan扩展列表。
// physicalDevice为vulkan物理设备,用户需进行初始化
VkPhysicalDevice physicalDevice;
// 查询XEngine支持的Vulkan扩展列表
std::vector<std::string> supportedExtensions;
uint32_t pPropertyCount;
HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice, &pPropertyCount, nullptr);
if (pPropertyCount > 0) {
std::vector<XEG_ExtensionProperties> pProperties(pPropertyCount);
if (HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice, &pPropertyCount, &pProperties.front()) == VK_SUCCESS) {
for (auto ext : pProperties) {
supportedExtensions.push_back(ext.extensionName);
}
}
}
// 查询是否支持自适应VRS
if (std::find(supportedExtensions.begin(), supportedExtensions.end(), XEG_ADAPTIVE_VRS_EXTENSION_NAME) == supportedExtensions.end()) {
exit(1); // return error
}
-
声明实例句柄。
XEG_AdaptiveVRS xeg_adaptiveVRS;
-
调用[HMS_XEG_CreateAdaptiveVRS]接口,定义并创建实例。
// m_renderWidth与m_renderHeight分别为纹理采样宽高
int m_renderWidth;
int m_renderHeight;
// VRS_TILE_SIZE为自适应VRS的渲染的分片大小
int VRS_TILE_SIZE;
// vulkan逻辑设备,用户需进行初始化
VkDevice device;
// XEG_AdaptiveVRSCreateInfo为自适应VRS实例句柄对象的参数信息
XEG_AdaptiveVRSCreateInfo xeg_createInfo;
// XEG_AdaptiveVRSDescription为下发绘制着色率纹理命令所需参数信息
XEG_AdaptiveVRSDescription xeg_description;
// VkExtent2D inputSize为上一帧渲染管线最终渲染的图像尺寸,用户可自定义
VkExtent2D inputSize;
inputSize.width = m_renderWidth;
inputSize.height = m_renderHeight;
// VkRect2D为vulkan指定的二维区域结构
// inputRegion为自适应VRS输入纹理区域,用户可自定义
VkRect2D inputRegion {};
// inputRegion.extent.width与inputRegion.extent.height分别为纹理采样宽高
inputRegion.extent.width = m_renderWidth;
inputRegion.extent.height = m_renderHeight;
// inputRegion.offset.x和inputRegion.offset.y为原点偏移量
inputRegion.offset.x = 0;
inputRegion.offset.y = 0;
// xeg_createInfo.inputSize为上一帧渲染管线最终渲染的图像尺寸
xeg_createInfo.inputSize = inputSize;
// xeg_createInfo.inputRegion为上一帧渲染管线最终渲染的图像区域
xeg_createInfo.inputRegion = inputRegion;
// xeg_createInfo.adaptiveTileSize为自适应VRS的渲染的分片大小
xeg_createInfo.adaptiveTileSize = VRS_TILE_SIZE;
// xeg_createInfo.errorSensitivity为控制最终生成着色率纹理结果的阈值,此处以阈值为0.5为例
xeg_createInfo.errorSensitivity = 0.5;
// xeg_createInfo.flip为判断是否执行图像上下翻转,为true表示进行图像上下翻转,false则表示不进行图像上下翻转,此处以false为例
xeg_createInfo.flip = false;
HMS_XEG_CreateAdaptiveVRS(device, &xeg_createInfo, &xeg_adaptiveVRS);
- 调用[HMS_XEG_CmdDispatchAdaptiveVRS]接口,下发自适应VRS命令,生成perImage着色率纹理。
// inputColorImageView为用户自定义的上一帧渲染管线最终渲染结果颜色附件纹理
VkImageView inputColorImageView = VK_NULL_HANDLE;
// inputColorImageView为用户自定义的前帧渲染管线最终渲染结果深度附件纹理
VkImageView inputDepthImageView = VK_NULL_HANDLE;
// outputShadingRateImage为用户自定义的生成着色率图信息的纹理
VkImageView outputShadingRateImage = VK_NULL_HANDLE;
// cmdBuff为命令缓冲区,用户需进行初始化
VkCommandBuffer commandBuffer = VK_NULL_HANDLE ;
xeg_description.inputColorImage = inputColorImageView;
xeg_description.inputDepthImage = inputDepthImageView;
xeg_description.outputShadingRateImage = outputShadingRateImage;
// xeg_description.reprojectionMatrix为使用投影矩阵和观察矩阵计算而来的重投影矩阵
xeg_description.reprojectionMatrix = nullptr;
HMS_XEG_CmdDispatchAdaptiveVRS(commandBuffer, xeg_adaptiveVRS, &xeg_description);
-
调用[HMS_XEG_DestroyAdaptiveVRS]接口,卸载VRS实例,清理VRS相关资源。
HMS_XEG_DestroyAdaptiveVRS(xeg_adaptiveVRS);
最后呢
很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。
而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点
如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。
针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。
- 《鸿蒙 (OpenHarmony)开发学习视频》
- 《鸿蒙生态应用开发V2.0白皮书》
- 《鸿蒙 (OpenHarmony)开发基础到实战手册》
- OpenHarmony北向、南向开发环境搭建
- 《鸿蒙开发基础》
- 《鸿蒙开发进阶》
- 《鸿蒙开发实战》
总结
鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。
并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿