Vulkan 开发(十):Vulkan 窗口表面(Surface)

闭关之 Vulkan 应用开发指南笔记(一):概述、内存和资源 《Vulkan应用开发指南》笔记 阅读详情

图片

 

Vulkan 系列文章:

1. 开篇,Vulkan 概述

2. Vulkan 实例

3. Vulkan 物理设备

4. Vulkan 设备队列

5. Vulkan 逻辑设备

6. Vulkan 内存管理

7. Vulkan 缓存

8. Vulkan 图像

9. Vulkan 图像视图


窗口表面

Vulkan 是一个平台无关的图形 API ,这意味着它不能直接与特定的窗口系统(如 Windows、Linux 或 macOS 的窗口系统)交互。

为了解决这个问题,Vulkan 引入了窗口系统集成(Window System Integration,WSI)机制,使得 Vulkan 应用程序可以与不同操作系统的窗口系统(如 Windows 的 Win32、Linux 的 X11 或 Wayland、Android 的 ANativeWindow 等)进行交互。

这些机制允许 Vulkan 应用程序在窗口系统中创建和管理表面(Surface),并与图形硬件交换图像(Swapchain)。

VK_KHR_surface是 WSI 的核心扩展(instance 扩展),是 Vulkan 中用于表示渲染表面的对象,它是一个平台无关的抽象类型,用于封装与窗口系统相关的表面信息,通过这个对象,Vulkan 可以将渲染结果输出到窗口上。

创建窗口表面

VkSurfaceKHR对象是平台无关的,但是创建 VkSurfaceKHR对象时,不同的操作系统(窗口系统)需要使用不同的 API 。

图片

 

如 Android 系统使用 vkCreateAndroidSurfaceKHR, Windows 系统使用 vkCreateWin32SurfaceKHR 。

另外,在创建 Vulkan 实例的时候需要提前设置好相应的扩展:

1std::vector<const char*> instance_extensions;
2instance_extensions.push_back("VK_KHR_surface");
3instance_extensions.push_back("VK_KHR_android_surface");//Android
4//如果是 WIndow 平台使用 VK_KHR_win32_surface

本文主要涉及 Vulkan 移动开发在 Android 端的应用(其他平台流程相似),Android 系统创建窗口表面 VkSurfaceKHR流程:

  1. 确定支持VK_KHR_android_surface扩展:检查物理设备是否支持该扩展。

  2. 定义ANativeWindow:获取Android的ANativeWindow对象,这是Vulkan在Android上创建表面的必要条件。

  3. 创建VkSurfaceKHR:使用vkCreateAndroidSurfaceKHR函数创建Vulkan表面。

在Android平台上创建Vulkan窗口表面的代码示例:

 1#include <vulkan/vulkan.h>
 2#include <vulkan/vulkan_android.h>
 3#include <android/native_window.h>
 4#include <android/native_window_jni.h>
 5
 6// 需要在 Android 应用程序的某处获取到 ANativeWindow 对象,通常在 Activity 或 SurfaceView 中
 7extern ANativeWindow* window; // 这个 window 对象应该是从 Java 层传递过来的
 8
 9// 检查物理设备是否支持 VK_KHR_android_surface 扩展
10bool isExtensionSupported(const char* extensionName, const std::vector<VkExtensionProperties>& availableExtensions) {
11    for (const auto& extension : availableExtensions) {
12        if (strcmp(extension.extensionName, extensionName) == 0) {
13            return true;
14        }
15    }
16    return false;
17}
18
19// 获取物理设备支持的扩展
20uint32_t extensionCount = 0;
21vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, nullptr);
22std::vector<VkExtensionProperties> availableExtensions(extensionCount);
23vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, availableExtensions.data());
24
25if (!isExtensionSupported(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, availableExtensions)) {
26    throw std::runtime_error("VK_KHR_android_surface extension not supported");
27}
28
29// 创建 VkAndroidSurfaceCreateInfoKHR 结构体并初始化
30VkAndroidSurfaceCreateInfoKHR createInfo = {};
31createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
32createInfo.pNext = nullptr;
33createInfo.flags = 0;
34createInfo.window = window; // 指向 ANativeWindow 对象的指针
35
36VkSurfaceKHR surface;
37VkResult result = vkCreateAndroidSurfaceKHR(instance, &createInfo, nullptr, &surface);
38
39if (result != VK_SUCCESS) {
40    throw std::runtime_error("failed to create Vulkan surface");
41}
42
43// 现在 surface 对象可以在 Vulkan 渲染管线中使用

其中,在Android应用程序中添加ANativeWindow对象,你需要获取ANativeWindow对象,通常是在 Activity 或 SurfaceView 中通过 JNI 从 Java 层传递过来。例如:

1// 在 Java 代码中
2public native void setNativeWindow(Surface surface);
3
4// 在 C++ 代码中
5extern "C" JNIEXPORT void JNICALL Java_com_example_app_NativeLib_setNativeWindow(JNIEnv* env, jobject obj, jobject surface) {
6    ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
7    // 将 window 存储在一个全局变量中,以便稍后使用
8}
技术交流

进技术交流群/获取源码,添加我的微信:Byte-Flow

 

Vulkan实战之Window surface 之后,可以使用vkCreateWin32SurfaceKHR创建surface,其中包括实例的参数,surface创建细节,自定义分配器和surface句柄要存储的变量。从技术上讲,这是一个WSI扩展函数,但它是如此常用,以至于标准的Vulkan加载程序包含它,因此与其他扩展不同,您不需要显式加载它。由于演示是一个特定于队列的特性,因此问题实际上是找到一个支持向我们创建的surface演示的队列族。注意,很有可能这些队列最终是相同的队列族,但在整个程序中,我们将把它们视为统一方法的单独队列。 阅读详情

相关推荐

Vulkan填坑学习Day07—Window Surface

Vulkan Window Surface 注:本章大部分代码在前一章节交换链源代码前中已经实现。 Vulkan Window Surface,到目前为止,我们了解到Vulkan是一个与平台特性无关联的API集合。它不能直接与窗口系统进行交互。为了将渲染结果呈现到屏幕,需要建立Vulkan与窗体系统之间的连接,我们需要使用WSI(窗体系统集成)扩展。在本小节中,我们将讨论第一个,即VK_KHR_s...

qq_35312463的博客 1428

闭关之 Vulkan 应用开发指南笔记(四):绘制、几何体&片段处理、同步和回读数据

《Vulkan应用开发指南》笔记

jiamada的博客 1699

Vulkan 图形引擎开发教程(八):高级渲染技术

本文系统介绍了基于Vulkan的高级渲染技术实现方案,重点解析了延迟渲染和PBR的核心原理与实现细节。延迟渲染通过分离几何处理和光照计算,使用G缓冲存储几何信息,有效解决了多光源场景的性能瓶颈。PBR技术则通过能量守恒、微表面理论和菲涅尔效应等物理模型实现真实感渲染。文章还详细讲解了阴影映射和SSAO的实现方法,并提供了Vulkan API的具体配置示例和性能优化策略。这些技术的合理运用能够显著提升游戏画面质量,同时充分利用Vulkan的并行计算特性确保渲染效率。

分享知识,拥抱变化 180

Vulkan 简介

Vulkan在很大程度上汲取了AMD Mantle的灵感,但是进行了大幅度的扩展和增强,构成了一个完善的开发体系,功能和性能都十分丰富,拥有最新图形技术、通用目的计算、预编译着色器、多核心多线程高效率、底层驱动过载、横跨桌面/移动/主机/嵌入式、底层GPU硬件控制、精炼API。在高分辨率、高画质、需要GPU发挥的时候,Vulkan、OpenGL的速度基本差不多,但是随着分辨率的降低,CPU越来越重要,Vulkan逐渐体现了出来,尤其是看看GTX 980 Ti,最多可以领先OpenGL 33%之多!

ghjk014的专栏 2759

Sentaurus TCAD 修改字体

如题

努力学习的IC小白 5759

LTM4644 四通道并联 16A 输出配置:PCB 布局 3 要点与热仿真验证

本文详细解析了LTM4644四通道并联实现16A输出的PCB布局与热管理要点,包括电流路径对称性设计、热优化布局技巧和接地系统优化。通过实际工程案例,展示了如何确保电流均流、热分布均衡及长期可靠性,为FPGA、ASIC和服务器主板供电设计提供高效解决方案。

weixin_33314040的博客 397

Vulkan Window 窗口 Surface

大家好,接下来将为大家介绍Vulkan Window Surface。 Vulkan是一个与平台特性无关联的API集合。它不能直接与窗口系统进行交互。为了将渲染结果呈现到屏幕,需要建立Vulkan与窗体系统之间的连接,我们需要使用WSI(窗体系统集成)扩展。在本小节中,我们将讨论第一个,即VK_KHR_surface。它暴露了VkSurfaceKHR,它代表surface的一个抽象类型,用以呈现渲染图像使用。我们程序中将要使用到的surface是由我们已经引入的GLFW扩展及其打开的相关窗体支持的。简单来

sy_liao的专栏 2115

山石网科Hillstone防火墙基础上网配置_CLI命令行(最新版)

山石网科Hillstone防火墙安全网关基础上网基础网络配置_CLI命令行(最新版)

路与肥的博客 1万+

[Vulkan教程]绘制一个三角形/呈现/窗口表面(Window surface)

窗口表面

楚栋浩的博客 1540

使用 Python 实现无人机避障的人工势场算法

人工势场算法是一种基于力的控制方法,通过将目标位置视为一个吸引力源,而将障碍物视为排斥力源,来引导移动体朝着目标前进,同时避开障碍物。接下来,我们将定义几个类来实现人工势场算法,包括无人机类、障碍物类和势场类。

闲人编程的博客 2585

STM32MP157+AD7606BSTZ四通道IEPE传感器控制器实战(附电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器控制器设计实战,涵盖硬件架构、数据采集芯片对比、关键电路设计及信号处理算法。通过双核协同工作和优化算法,实现高精度振动监测与故障诊断,适用于工业机械状态监测等场景。

weixin_29171129的博客 363

逻辑设备与窗口表面:Vulkan图形渲染的基础架构解析

Vulkan作为新一代高性能图形API,其核心架构中的逻辑设备与窗口表面是实现高效渲染的基础组件。本文将通过通俗易懂的方式,带您深入了解这两个关键概念的工作原理、配置方法以及它们在Vulkan渲染管线中的重要作用,帮助新手快速掌握Vulkan图形开发的核心知识。 ## Vulkan逻辑设备:图形硬件的控制中心 逻辑设备(Logical Device)是Vulkan应用程序与物理GPU之间的桥梁

gitblog_00778的博客 737

SAE J1850协议:从波形解析到汽车诊断实战

本文深入解析SAE J1850协议在汽车诊断中的应用,重点对比其PWM和VPW两种实现方式的波形特征、帧结构及诊断要点。通过实测案例,详细介绍了如何通过波形分析精准定位通用和福特等美系车型的通信故障,提升汽车电子诊断实战能力。

hill8的博客 965

Vulkan教程(九):窗口表面,Vulkan与窗口系统的交互桥梁

本文介绍了Vulkan与窗口系统集成的实现方法,重点讲解了WSI(窗口系统集成)扩展的使用。主要内容包括: 窗口表面创建:通过VK_KHR_surface扩展创建抽象渲染表面,对比演示了Windows原生方式和GLFW跨平台方式。 呈现支持性查询:使用vkGetPhysicalDeviceSurfaceSupportKHR检查设备是否支持呈现功能,并处理可能存在的独立呈现队列情况。 呈现队列创建:修改逻辑设备创建流程,添加呈现队列支持,确保渲染结果能正确显示到窗口表面。 文章强调Vulkan的平台无关性设计

分享知识,拥抱变化 299

避坑指南:Qt5.14.2 ARM交叉编译中那些你可能遇到的‘坑’及解决方案

本文深度解析了Qt 5.14.2在ARM架构上进行交叉编译的完整流程与常见难题。重点阐述了如何精准匹配交叉编译器与目标板环境、正确配置sysroot以及使用configure参数的艺术,并针对编译过程中的头文件缺失、链接错误等典型“坑”提供了经过验证的解决方案,旨在帮助开发者成功构建适用于嵌入式设备的Qt运行时库。

weixin_29279101的博客 352

基于LSTM的股票价格预测系统,Django框架,Web的股票预测系统,训练+数据集+源码(无需安装环境版)

股票价格预测是投资领域的一个重点关注课题。由于股票价格受到诸多非线性因素的影响,得到精确的预测结果较为困难。使用 PyCharm 作为代码开发工具,通过下载好的股票金融数据,进行数据预处理,构建 LSTM 网络模型,训练模型并训练出最优模型,输出股票未来收盘价波动的走势,最后在训练好的模型上,设计股票模型应用系统,运行效率较高,对股票预测具有一定的积极意义。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 954

linux 窗口句柄_Vulkan编程指南(章节9-窗口表面)

章节9窗口表面Vulkan是一个平台无关的API,它不能直接和窗口系统交互。为了将Vulkan渲染的图像显示在窗口上,我们需要使用WSI(Window System Integration)扩展。在本章节,我们首先介绍VK_KHR_surface扩展,它通过VkSurfaceKHR对象抽象出可供Vulkan渲染的表面。在本教程,我们使用GLFW来获取VkSurfaceKHR对象。VK_KHR_su...

weixin_28958485的博客 565

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[译]Vulkan教程(09)窗口表面

BIT祝威博客汇总(Blog Index) - BIT祝威 - 博客园 [译]Vulkan教程(09)窗口表面 - BIT祝威 - 博客园

android开发笔记 683

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[Vulkan 学习之路] 06 - 第一次亲密接触:Window Surface (窗口表面)

本文介绍了如何在Vulkan中创建窗口表面(WindowSurface),实现图形渲染与显示系统的集成。

wang的博客 619

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Vulkan学习笔记【三】 渲染表面配置

由于Vulkan是一个平台无关的API,因此它不能自己直接与窗口系统接口。为了在Vulkan和窗口系统之间建立连接并将结果显示到屏幕上,我们需要使用WSI(窗口系统集成)扩展。在本章中,我们将讨论第一个,即VK_KHR_surface。它是一个VkSurfaceKHR对象,该对象表示要呈现渲染图像的抽象表面类型。我们程序中的surface将由我们已经用GLFW打开的窗口支持。

weixin_43469171的博客 1433

初始Vulkun(6):窗口表面

创建窗口,并关联窗口表面

weixin_44200074的博客 422

Vulkan入门(四)-Surface和交换链.md

文章目录参考资料简述一. Window Surface1.1 创建窗口Surface二. Swap Chain-交换链2.1 检查GPU是否支持交换链2.2 使能设备扩展2.3 获取关于swap chain更多支持细节2.4 为swap chain-交换链选择合适的设置2.4.1 Surface格式2.4.2 呈现模式(Presentation Mode)2.4.3 交换范围(Swap exten...

SwallowJoe的博客 2557

vulkan从小白到专家——VulkanDevice

vulkan device的概念和创建过程

dizuo的专栏 1506

Vulkan教程 - 05 逻辑设备与窗口表面

逻辑设备 选择了物理设备后,我们需要建立逻辑设备来交互了。逻辑设备创建过程和实例创建过程类似,且描述了我们想要的特性。向类中添加一个新的成员变量存储逻辑设备句柄: VkDevice device; 接着,添加函数createLogicalDevice以便在initVulkan中调用。创建逻辑设备涉及到在结构体中明确许多信息的操作,首先是设置VkDeviceQueueCreateInfo。该...

捉不住的鼬鼠的足迹 1721

ZenML Model Registry 实战指南:统一管理、版本化与部署机器学习模型

模型注册表(Model Registry)是 ZenML 中负责集中管理、追踪与部署机器学习模型的核心 Stack 组件。本文围绕 [docs/book/component-guide/model-registries/README.md](https://link.gitcode.com/i/234dcece9a530287d63a9224c1f7f8c0) 展开,系统讲解 ZenML 模型注册

gitblog_00680的博客 719
上一篇: OpenGL ES 文字渲染进阶--渲染中文字体
下一篇: Vulkan 开发(十一):Vulkan 交换链
字节流动
字节流动 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄11年 1912粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节流动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值