大概有一年时间了吧,拖拖拉拉的终于把之前写的vulkan渲染器在mac上跑起来了。
教程里是用的XCode 我这边用的VSCode + CMake
正好熟悉下CMake
刚开始时候对于这些设置这个头痛啊
毕竟在Win上已经跑通很久了 这换个平台又要这么麻烦
感觉什么都是很模糊 毕竟之前接触不多
感觉一切都是蒙着眼睛在往前摸索 遇到问题 很痛苦
所以暂且搁置了很多次 也是拖拉了很长时间
这次能把这个弄完成真的很开心
对于CMakelist的学习 里面的各种配置 头文件目录的引用 库包的链接
在配置完成头文件后 make操作会报错。“Undefined symbols for architecture arm64”
CMakeLists里添加。set(CMAKE_OSX_ARCHITECTURES arm64) 未解决问题
但是在终端里 去file 相关文件 都是支持arm64的
困惑了一段时间 后来对相关的插件重新reinstall 解决
make无异常后 进入程序
glfw的lib 加载异常 感觉是M1芯片 brew install 都是安装在/opt/homebrew 下 不知道有没有关系
所以在CMakelists里加了 set(CMAKE_OSX_CODESIGN_IDENTITY “”) 后 又重新reisntall glfw。解决问题
在进入程序逻辑后 vkCreateInstance 失败 错误码 VK_ERROR_INCOMPATIBLE_DRIVER = -9
后在tutorial里发现解决方法 修改实例的flags
Encountered VK_ERROR_INCOMPATIBLE_DRIVER:
If using MacOS with the latest MoltenVK sdk, you may get VK_ERROR_INCOMPATIBLE_DRIVER
returned from vkCreateInstance
. According to the Getting Start Notes. Beginning with the 1.3.216 Vulkan SDK, the VK_KHR_PORTABILITY_subset
extension is mandatory.
To get over this error, first add the VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR
bit to VkInstanceCreateInfo
struct’s flags, then add VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME
to instance enabled extension list.
Typically the code could be like this:
...
std::vector<const char*> requiredExtensions;
for(uint32_t i = 0; i < glfwExtensionCount; i++) {
requiredExtensions.emplace_back(glfwExtensions[i]);
}
requiredExtensions.emplace_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
createInfo.enabledExtensionCount = (uint32_t) requiredExtensions.size();
createInfo.ppEnabledExtensionNames = requiredExtensions.data();
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
throw std::runtime_error("failed to create instance!");
}
继续对Shader做Mac上的编译
编译完成后 重新CMake操作
完成 注意导出程序需要依赖的目录关系 比如我导入Shader的文件目录是和build 同级别 所以在make后 重新对文件做了移动操作
完美运行