После моей первой успешной попытки 3D-движка с использованием Java и OpenGL (LWJGL3) я решил попробовать свои силы в Vulkan, используя C ++.У меня почти нет опыта работы с C / C ++, и я знаю о крутой кривой обучения Vulkan.Это, однако, не проблема.
Я решил следовать этому руководству: https://vulkan -tutorial.com / Введение
Он показал мне, как создать новыйпроект с Vulkan с использованием XCode (как я на Mac OS Mojave).Однако я хотел бы продолжить оставшуюся часть учебника, используя CLion, так как я переключаюсь между несколькими операционными системами.
Я попробовал свои силы в создании проекта CLion и преуспел в создании моего первого файла CMakeLists, однакокажется, что-то не так.Файл в настоящее время состоит из следующего:
cmake_minimum_required(VERSION 3.12)
project(VulkanTesting)
set(CMAKE_CXX_STANDARD 14)
add_executable(VulkanTesting main.cpp)
include_directories(/usr/local/include)
include_directories(/Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/include)
target_link_libraries(VulkanTesting /usr/local/lib/libglfw.3.3.dylib)
target_link_libraries(VulkanTesting /Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/lib/libvulkan.1.dylib)
target_link_libraries(VulkanTesting /Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/lib/libvulkan.1.1.92.dylib)
# Don't know if I need the next two lines
link_directories(/usr/local/lib)
link_directories(/Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/lib)
Причина, по которой я показал вышеупомянутый файл, станет очевидной в вопросе.
До сих пор «Программа» выглядит следующим образом:
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdexcept>
#include <functional>
#include <cstdlib>
#include <vector>
const int WIDTH = 800;
const int HEIGHT = 600;
class HelloTriangleApplication {
public:
void run() {
initWindow();
initVulkan();
mainLoop();
cleanup();
}
private:
GLFWwindow* window;
VkInstance instance;
void initWindow(){
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
window = glfwCreateWindow(WIDTH, HEIGHT, "My first Vulkan window", nullptr, nullptr);
}
void initVulkan() {
createInstance();
}
void createInstance(){
// Instantiate Application Info
VkApplicationInfo applicationInfo = {};
applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
applicationInfo.pApplicationName = "Hello Triangle";
applicationInfo.applicationVersion = VK_MAKE_VERSION(1,0,0);
applicationInfo.pEngineName = "No Engine";
applicationInfo.engineVersion = VK_MAKE_VERSION(1,0,0);
applicationInfo.apiVersion = VK_API_VERSION_1_0;
// Instantiate Instance Creation Info
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &applicationInfo;
// Get GLFW platform specific extensions
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions;
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
// Fill in required extensions in Instance Creation Info
createInfo.enabledExtensionCount = glfwExtensionCount;
createInfo.ppEnabledExtensionNames = glfwExtensions;
// For validation layers, this is a later step in the tutorial.
createInfo.enabledLayerCount = 0;
// Create the Vulkan instance, and check if it was successful.
VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);
if(result != VK_SUCCESS){
std::cout << "glfwExtensionCount: " << glfwExtensionCount << "\n";
std::cout << "glfwExtensionNames: " << &glfwExtensions << "\n";
std::cout << "result: " << result << "\n";
throw std::runtime_error("Failed to create Vulkan Instance");
}
}
void mainLoop() {
while(!glfwWindowShouldClose(window)){
glfwPollEvents();
}
}
void cleanup() {
glfwDestroyWindow(window);
glfwTerminate();
}
};
int main() {
HelloTriangleApplication app;
try {
app.run();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Проблема, с которой я столкнулся, заключается в том, что при попытке запустить программу она не создает VkInstance.Функция возвращает VK_ERROR_INCOMPATIBLE_DRIVER.Теперь я сомневаюсь, что драйвер на самом деле несовместим, поскольку я запустил демонстрационные приложения, которые поставлялись с Vulkan SDK для одного, а для другого я смог запустить точно такую же «программу» в XCode.Когда я исследовал проблему немного дальше, я заметил, что функция glfwGetRequiredInstanceExtensions
не возвращает никаких расширений, когда программа запускается в CLion, как это, но возвращает одно в эквиваленте XCode.
Все это приводит меня кПолагаю, что я неправильно сделал, связав библиотеки / фреймворки в файле Cmake, потому что мне известно о том, что Vulkan не поддерживается напрямую в Mac OS, а вместо этого (каким-то образом?) проходит через слой для связи с Metal.
Нужно ли указывать способ, с помощью которого программа пропускает свои функциональные возможности Vulkan через слой Metal, и это выполняется автоматически в XCode, или есть другая проблема с моим подходом?
Любая помощь будет принята с благодарностью!