一文详解Mac搭建Vulkan开发环境

news2024/10/7 15:27:06

本文为Vukan系列的第二篇文章上一篇文章对Vulkan进行了简单介绍,并对其与OpenGL的优劣势进行了比较,为应用开发人员在选择图形API方面提供了建议。下边开始本文的主要内容,详细介绍在Mac操作系统中,如何搭建Vulkan开发环境

Vulkan是一种基于命令缓冲区的底层图形API接口,能够更好地利用现代GPU的强大计算能力,从而获得更高的渲染性能和更低的CPU开销。与OpenGL相比,Vulkan提供了更详细的硬件控制更高效的内存管理更灵活的管线状态管理多线程支持等优势。
同时,Vulkan也存在一些挑战,包括学习曲线较陡峭编程难度较大等。在应用开发时,开发人员需要根据实际需求和平台支持情况来选择合适的图形API接口。

一、下载Vulkan SDK

到 Vulkan 官方下载对应平台的 Vulkan SDK:

// Vulkan官网下载对应平台的sdk  
https://vulkan.lunarg.com/sdk/home

Vulkan SDK下载

安装Vulkan SDK后,可以跑一下VulkanSDK/1.3.250.0/Applications目录下的vkcube,如果显示如下运行界面,说明你的电脑是支持Vulkan的。
Vulkan SDK安装完成验证

二、安装GLFW与GLM

Vulkan是平台无关的应用程序图形API接口,创建本地窗口的能力依赖GLFW与GLM的支持。

  • GLFW (Graphics Library Framework):
    最初用于创建OpenGL窗口和上下文的开源库,它提供了一套跨平台的API,能够方便地创建OpenGL窗口、处理输入事件、处理窗口事件等。
    GLFW为Vulkan提供了一组扩展,使得开发人员能够更轻松地创建Vulkan窗口和上下文,并处理窗口和输入事件等。
  • GLM (OpenGL Mathematics):
    GLM是一个用于数学计算的开源库,它提供了一组类和函数,用于实现矩阵变换、向量计算、投影等数学操作。
    GLM与Vulkan密切相关,在进行Vulkan开发时时,GLM为开发人员提供矩阵变换、向量计算等数学操作来控制渲染管线使得开发人员能够更方便地进行三维图形编程。
// 通过homebrew进行glfw与glm
brew install glfw3
brew install glm

三、配置 Xcode

现在依赖项已经安装完毕,下边可以开始配置一个基本的 Xcode Vulkan 项目。

3.1 新建Xcode项目

启动 Xcode 并新建项目,选择 Application > Command Line Tool 项目类型:
新建一个Xcode项目,选择Application>Command Line Tool项目
选择 C++ 作为项目使用的语言:
选择 C++ 作为项目使用的语言

3.2 配置头文件与库文件

打开 Build Settings 标签页,配置Vulkan、glfw和glm的头文件lib文件search path

  • /usr/local/include加入 Header Search Paths,这是 Homebrew 安装头文件的路径,我们安装的 glm 和 glfw3 的头文件都在该文件夹下。
  • vulkansdk/macOS/include加入 Header Search Paths,这是Vulkan SDK安装目录头文件路径。

头文件的search path

  • /usr/local/lib加入 Library Search Paths,这是 Homebrew 安装库文件的路径,我们安装的 glm 和 glfw3 的库文件都在该文件夹下。
  • vulkansdk/macOS/lib加入 Library Search Paths,这是 Vulkan SDK安装目录库文件路径。lib文件的search path

3.3 添加动态库

点击 Build Phases 标签页,添加 glfw3 和 vulkan 框架动态库。

  • 对于 glfw,打开/usr/local/lib目录,可以找到类似 libglfw.3.x.dylib形式的文件。将这个文件拖拽Linked Frameworks and Libraries 标签下;
  • 对于 Vulkan,打开vulkansdk/macOS/lib 目录,拖拽 libvulkan.1.dyliblibvulkan.1.x.xx.dylib到 Linked Frameworks and Libraries 标签下;

完成上面的操作后,更改Copy Files标签:

  • 将Destination 设置为 Frameworks;
  • 清空 Subpath 文本框;
  • 不要勾选 Copy only when installing;
  • 然后点击 + 号,将所有三个动态库添加进去。

添加 glfw3 和 vulkan 框架动态库

3.4 配置环境变量

在 Xcode 的工具栏上通过 Product>Scheme>Edit Scheme... 打开 Arguments 标签页,添加下面的环境变量:

VK_LAYER_PATH = /Users/xiaxl/VulkanSDK/1.3.250.0/macOS/share/vulkan/explicit_layer.d
VK_ICD_FILENAMES = /Users/xiaxl/VulkanSDK/1.3.250.0/macOS/share/vulkan/icd.d/MoltenVK_icd.json

配置环境变量

四、测试

至此为止,已经完成了全部配置。可以通过运行如下代码测试环境配置是否正常。

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
 
int main() {
    // 初始化GLFW库
    glfwInit();
    // GLFW最早是为OpenGL设计
    // 所以此处需要显式的设置GLFW阻止自动创建OpenGL上下文
    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
    // 查询本机支持的扩展属性
    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
    std::cout << extensionCount << " extensions supportedn";
 
    // 测试glm
    glm::mat4 matrix;
    glm::vec4 vec;
    auto test = matrix * vec;
    // 未主动close时持续消费点击event
    while(!glfwWindowShouldClose(window)) {
        glfwPollEvents();
    }
    // 销毁window
    glfwDestroyWindow(window);
    glfwTerminate();
    
    return 0;
}

运行效果如下:
运行效果

参考

Vulkan SDK下载:
https://vulkan.lunarg.com/sdk/home

vulkan官方:
https://registry.khronos.org/vulkan/

vulkan官方文档:
https://registry.khronos.org/vulkan/specs/1.3-extensions/pdf/vkspec.pdf

= THE END =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 98. 验证二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/validate-binary-search-tree/description/ C题解1&#xff1a;中序遍历&#xff0c;递归法。获取数组&#xff0c;如果是递增则返回true&#xff0c;否则返回false。 class Solution { public:void zhongxu(TreeNode* node…

用vue3+elementplus做的一个滚动菜单栏的组件

目录 起因概览设计及解决思路1.滚动条竖起来2.绑定菜单3.吸附优化 组件全部代码 起因 在elementplus中看到了滚动条绑定了slider&#xff0c;但是这个感觉很不实用&#xff0c;在底部&#xff0c;而且横向滚动&#xff0c;最常见的应该是那种固定在左上角的带着菜单的滚动条&a…

MySQL总结(索引,Explain,MVCC和隔离级别,锁)

文章目录 一、索引1.索引构成2.如何查找3.最左匹配原则4.覆盖索引5.减少冗余索引和重复索引1.冗余索引2.重复索引 6.索引适用情况和注意事项1.适用情况2.注意事项 二、Explain执行计划1.Explain语句 三、隔离级别与MVCC1.事前准备2.四个事务并发的问题1.脏写2.脏读3.不可重复读…

(有10个维度为(256,128,130)的tensor,计算10个tensor两两之间的相似性以及差异性,并将相似性和差异性可视化。

有10个维度为&#xff08;256,128,130&#xff09;的tensor&#xff0c;计算10个tensor两两之间的相似性以及差异性&#xff0c;并将相似性和差异性可视化。 问题描述解决办法 问题描述 有10个维度为&#xff08;256,128,130&#xff09;的tensor&#xff0c;计算10个tensor两…

Java基础复习第二天

目录 一、字符串 二、不可变的好处 三、String&#xff0c; StringBuffer and StringBuilder的区别 四、字符串池 五、新字符串&#xff08;“abc”&#xff09; 一、字符串 String 被声明为 final&#xff0c;因此它不可被继承。&#xff08;Integer 等包装类也不能被继承…

前端-基础选择器

从今天开始学习下前端的知识-查漏补缺&#xff0c;仅为自己学习记录使用 基础选择器 标签选择器类选择器id 选择器通配符选择器 标签选择器 标签名 {属性名&#xff1a;属性值; }<style>p {color: red;} </style><p>你好&#xff0c;世界</p>类选择…

Unity URP 获取Camera Stack

URP 获取Camera Stack 1.using UnityEngine.Rendering.Universal; 2.Camera.main.GetUniversalAdditionalCameraData().cameraStack

【日志加载 log4j】

日志 笔记记录 1. 日志介绍2. 日志体系结构3.Log4j开发流程4.Log4j组成4.1 Loggers 记录器4.2 Appenders 输出源4.3 Layouts 布局5. 配置文件 log4j.properties 1. 日志介绍 2. 日志体系结构 3.Log4j开发流程 1.引入依赖<dependency><groupId>log4j</groupId>…

爬虫正常用哪种代理比较好?

在进行网络爬虫时&#xff0c;使用代理可以带来许多好处&#xff0c;包括提高请求的可靠性、防止IP封锁、实现匿名浏览等。以下是一些常见的代理类型&#xff0c;你可以根据需要选择最适合的&#xff1a; 免费代理&#xff1a;免费代理可能数量众多&#xff0c;但质量和稳定性参…

Python获取某品牌加盟数据采集实现可视化数据分析

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境 : python 3.8 运行代码 pycharm 2022.3 辅助敲代码 jupyter 数据分析使用软件 模块使用 &#xff1a; requests 数据请求模块 需要安装 parsel 数据解析模块 csv pandas pyecharts 第三方模块安装&#xf…

基于Java开发的企业人力资源管理系统(ehr系统)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理…

BOLD信号的生理建模及其对有效连接的影响

导读 本文提供了BOLD信号生理过程的总体概述(即生成生物物理模型)&#xff0c;包括它们在生理信息动态因果模型(P-DCM)框架下的时间过程特征。BOLD信号主要由顺磁性脱氧血红蛋白的变化决定&#xff0c;而顺磁性脱氧血红蛋白的变化是氧代谢、脑血流量和脑血容量变化共同作用的结…

测试工程师首chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

【IP地址与子网掩码】网络杂谈(19)之IP地址分类与子网掩码的概念

涉及知识点 什么是子网掩码&#xff0c;IP地址的分类&#xff0c;子网掩码的概念&#xff0c;深入了解子网掩码与IP地址,A类&#xff0c;B类&#xff0c;C类&#xff0c;D类&#xff0c;E类ip地址范围。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可…

Linux调试笔记

gdb调试----------------------------------------------------------------------------------------- CMakeFile.txt加入set(CMAKE_BUILD_TYPE Debug) gdb ./rknn_MNIST 打断点 b 110/main(行号/函数名) 单步调试 s&#xff08;step&#xff09; 单步跳过 n&#xff08;n…

计算机组成原理(2)_计算机基本组成

计算机组成系列文章目录 第一章 计算机的基本组成 1. 大致简介 2. 计算机基本组成 第二章 计算机的指令和运算 第三章 处理器设计 第四章 存储器和IO系统 文章目录 计算机组成系列文章目录前言参考资料一、组成架构&#xff08;冯/图&#xff09;1. 组成架构2. 冯诺依曼3. 图灵…

力扣 530. 二叉搜索树的最小绝对差 / 783. 二叉搜索树节点最小距离

题目来源 530&#xff1a;https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 783&#xff1a; https://leetcode.cn/problems/minimum-distance-between-bst-nodes/ C题解1&#xff1a;递归法&#xff0c;中序遍历。通过中序遍历将二叉搜索树转…

【Android】Android类加载机制

ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成&#xff0c;在程序运行时&#xff0c;需要将 class 文件加载到 JVM 中才可以使用&#xff0c;负责加载这些 class 文件的就是 Java 的类加载机制。ClassLoader 的作用简单来说就是加载 class 文件&#xf…

echarts图表-实现中国地图的绘制

第一步&#xff1a;引入中国地图的json数据&#xff0c;初始化echarts的dom结构&#xff0c;使用registerMap方法加载地图数据&#xff08;注&#xff1a;echarts5.X版本后删除了中国地图的JSON&#xff0c;需自行下载JSON或降低echarts版本&#xff09; 第二步&#xff1a;传输…

React通过props的children实现插槽功能

可能会比较遗憾的说 React中并没有vue中的 slot 插槽概念 不过 可以通过props.children 实现类似功能 我们先创建一个React项目 在src下创建目录components 在下面创建一个dom.jsx组件 参考代码如下 import React from "react" export default class dom extends R…