鸿蒙(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 
#include 
#include 
#include 

按需引用XEngine的头文件,如使用Vulkan自适应VRS功能。

#include 
#include 
#include 
#include 
#include 
  • 编写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版本的着色率纹理创建和绑定由特性提供的接口实现。

  1. 调用[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
}
  1. 调用[HMS_XEG_AdaptiveVRSParameter]接口,对自适应VRS的参数赋值。
// renderWidth与renderHeight分别为用户自定义的渲染宽度与渲染高度,此处以800*600分辨率为例
uint32_t renderWidth = 800;
uint32_t renderHeight = 600;
// inputSize为上一帧渲染管线最终渲染的图像尺寸,用户可自定义
GLsizei inputSize[2] = {static_cast(renderWidth), static_cast(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);
  1. 调用[HMS_XEG_DispatchAdaptiveVRS]接口计算着色率图像。
// inputColorImage为用户自定义上一帧渲染管线最终渲染结果颜色附件纹理 
GLuint inputColorImage; 
// inputDepthImage为用户自定义当前帧渲染管线最终渲染结果深度附件纹理
GLuint inputDepthImage;
// outputShadingRateImage为用户可自定义生成着色率图像信息的纹理
GLuint outputShadingRateImage;
// reprojectionMatrix为用户根据投影矩阵和观察矩阵计算得来的重投影矩阵
float *reprojectionMatrix = nullptr; 
HMS_XEG_DispatchAdaptiveVRS(reprojectionMatrix, inputColorImage, inputDepthImage, outputShadingRateImage);
  1. 调用[HMS_XEG_ApplyAdaptiveVRS]接口,将着色率图像应用到渲染目标中。

    HMS_XEG_ApplyAdaptiveVRS(outputShadingRateImage );
    

集成自适应VRS功能(Vulkan)

  1. 调用[HMS_XEG_EnumerateDeviceExtensionProperties]接口,查询XEngine支持的Vulkan扩展列表。
// physicalDevice为vulkan物理设备,用户需进行初始化
VkPhysicalDevice physicalDevice;
// 查询XEngine支持的Vulkan扩展列表
std::vector supportedExtensions;
uint32_t pPropertyCount;
HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice, &pPropertyCount, nullptr);
if (pPropertyCount > 0) {
    std::vector 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
}
  1. 声明实例句柄。

    XEG_AdaptiveVRS xeg_adaptiveVRS;
    
  2. 调用[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);
  1. 调用[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);
  1. 调用[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 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

你可能感兴趣的:(鸿蒙开发,harmonyos,华为,openharmony,鸿蒙,鸿蒙系统,VRS,引擎)