[HarmonyOS Next示例代码]Subpass Shading的使用(VULKAN)

XEngine-samplecode-SubpassShadingDemo-cpp: 本示例通过使用Subpass Shading特性,实现降低DDR带宽的功能

HarmonyOS next 示例代码全集

Subpass Shading的使用(VULKAN)

简介

本篇Codelab主要介绍如何使用Subpass Shading。示例代码通过XComponent组件调用NAPI创建Vulkan环境,实现绘制SPONZA场景,并展示Subpass Shading特性的使用。本篇CodeLab使用Native C++模板创建。

效果预览

如图所示,XComponent组件绘制SPONZA场景。

Subpass_Shading_VULKAN_Example.jpg

相关概念

  • XComponent:可用于EGL/OpenGLES和媒体数据写入,并显示在XComponent组件。

使用说明

  1. 运行示例代码。

工程目录

├── entry/src/main	             // 代码区
│  ├── cpp
│  │  ├── types
│  │  │  ├── libnativerender
             └── index.d.ts      // native层接口注册文件 
│  │  │── napi_init.cpp          // native api层接口的具体实现函数
│  │  │── CMakeLists.txt         // native层编译配置
│  │  │── 3rdParty               // 三方件
│  │  │── commom                 // 通用接口  
│  │  │── file                   // 文件管理
│  │  │── libs                   // 三方动态库
│  │  │── manager                // native&arkts交互
│  │  │── render                 // 渲染
│  ├── ets
│  │  ├── common
             └── CommonConstants.ets // 通用常量
│  │  ├── entryability 
             └── EntryAbility.ts // 程序入口类
│  │  ├── pages 
             └── index.ets       // 主界面展示类
│  ├── resources                 // 资源文件目录
│  │  ├── base
│  │  │  ├── media
             └── icon.png        // 图片资源
│  │  ├── rawfile
│  │  │  ├── forward_plus        // forward plus shader文件
│  │  │  ├── sponza_full         // 模型文件
│  │  │  ├── subpass_shading     // subpass shading shader文件

具体实现

本示例展示的功能使用了Vulkan扩展接口VK_HUAWEI_subpass_shading提供的Subpass Shading API:

  • VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(VkDevice device, VkRenderPass renderpass, VkExtent2D* pMaxWorkgroupSize);
  • VKAPI_ATTR void VKAPI_CALL vkCmdSubpassShadingHUAWEI(VkCommandBuffer commandBuffer); 通过调用展示的API实现Subpass Shading特性。

相关权限

不涉及。

依赖

  • 本示例依赖assimp三方件,请按系统版本编译对应版本三方件。
  • 3D模型资源:"Crytek Sponza" by Frank Meinl, Crytek is licensed under CC BY 3.0/replace "\" with "/" in file sponza.mtl

约束与限制

  1. 本示例仅支持标准系统上运行,支持设备:支持马良910 GPU及以上的华为手机。
  2. 本示例为Stage模型,支持API version 12。
  3. HarmonyOS系统:HarmonyOS NEXT Developer Beta1及以上。
  4. DevEco Studio版本:DevEco Studio NEXT Developer Beta1及以上。
  5. HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta1 SDK及以上。
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 MeshVS_Mesh 类创建一个简单的三角形网格并显示的示例代码: ```cpp #include <OpenGl_GraphicDriver.hxx> #include <V3d_View.hxx> #include <MeshVS_Mesh.hxx> #include <MeshVS_Drawer.hxx> int main(int argc, char* argv[]) { // 创建 OpenGl_GraphicDriver 对象 Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver(); // 创建 V3d_View 对象 Handle(V3d_Viewer) aViewer = new V3d_Viewer(aGraphicDriver, "My Viewer"); Handle(V3d_View) aView = new V3d_View(aViewer); // 创建 MeshVS_Mesh 对象 Handle(Poly_Triangulation) aPoly = new Poly_Triangulation(); aPoly->AddNode(gp_Pnt(0, 0, 0)); aPoly->AddNode(gp_Pnt(1, 0, 0)); aPoly->AddNode(gp_Pnt(0, 1, 0)); aPoly->AddTriangle(1, 2, 3); Handle(MeshVS_Mesh) aMesh = new MeshVS_Mesh(); aMesh->SetDisplayMode(MeshVS_DMF_Shading); aMesh->SetPoly(aPoly); // 创建 MeshVS_Drawer 对象 Handle(MeshVS_Drawer) aDrawer = new MeshVS_Drawer(); aDrawer->SetMesh(aMesh); aDrawer->SetDisplayMode(MeshVS_DMF_Shading); // 添加 MeshVS_Drawer 对象到 V3d_View 对象中 aView->SetBackground(Quantity_NOC_BLACK); aView->SetWindow(0, 0, 500, 500); aView->MustBeResized(); aView->SetProj(V3d_XposYnegZpos); aViewer->SetDefaultLights(); aViewer->SetLightOn(); aView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.1, V3d_ZBUFFER); aView->ZFitAll(); aView->Update(); aView->Redraw(); return 0; } ``` 在上面的示例代码中,我们首先创建了一个 OpenGl_GraphicDriver 对象和一个 V3d_View 对象,然后创建了一个 Poly_Triangulation 对象来表示一个三角形网格,并将其传递给 MeshVS_Mesh 对象。接着,我们创建了一个 MeshVS_Drawer 对象,并将其添加到 V3d_View 对象中进行显示。最后,我们对 V3d_View 进行了一些设置,并使其显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值