因此,我尝试在配备 M1 处理器的 Mac 上遵循 Vulkan 教程,但遇到了设备创建问题。
因此,根据教程,我设置设备启用的扩展,如下所示:
const std::vector<const char*> deviceExtensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
};
VkDeviceCreateInfo createInfo = {};
createInfo.enabledExtensionCount = static_cast<uint32_t>(deviceExtensions.size());
createInfo.ppEnabledExtensionNames = deviceExtensions.data();
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下验证错误:
验证层:验证错误:[VUID-VkDeviceCreateInfo-pProperties-04451]对象0:句柄= 0x11bd84d40,类型= VK_OBJECT_TYPE_PHYSICAL_DEVICE;| 消息 ID = 0x3a3b6ca0 | vkCreateDevice:必须启用 VK_KHR_portability_subset,因为物理设备 VkPhysicalDevice 0x11bd84d40[] 支持它 Vulkan 规范规定:如果 VK_KHR_portability_subset 扩展包含在 vkEnumerateDeviceExtensionProperties 的 pProperties 中,则 ppEnabledExtensionNames 必须包含“VK_KHR_portability_subset”( https://vulkan.lunarg.com/doc/查看/1.3.211.0/mac/1.3-extensions/vkspec.html#VUID-VkDeviceCreateInfo-pProperties-04451)
验证层: vkCreateDevice:尝试从 VkPhysicalDevice 创建 VkDevice,该 VkPhysicalDevice 来自可移植性驱动程序,但未设置 VkInstanceCreateInfo 标志中的 VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 位并启用 VK_KHR_portability_enumeration 扩展。在加载程序的未来版本中,将不会枚举此 VkPhysicalDevice。
所以我尝试添加VK_KHR_portability_subset第一个错误中提到的扩展名:
const std::vector<const char*> deviceExtensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
"VK_KHR_portability_subset",
}; …Run Code Online (Sandbox Code Playgroud) 所以我尝试使用 OpenGL 来实现基本的漫反射照明。我编写了一个简单的着色器,它将采用法线向量和光向量,并使用所述向量的点积来计算像素的亮度。这是我的输出:
正如您所看到的,它对于前两种情况工作得很好,但对于第三种情况就完全崩溃了。顺便说一句,[0, 0, -1] 也不起作用,[0, 1, 1] 给出的输出与光线升起时的输出相同([0, 1, 0])。这是我的着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform vec3 lightDirection;
out vec3 normal;
out vec3 lightDir;
void main()
{
normal = normalize(aNormal);
lightDir = normalize(lightDirection);
gl_Position = projection * view * model * vec4(aPos, 1.0f);
} …Run Code Online (Sandbox Code Playgroud) 我有两个结构。第一个“父”结构包含需要显式清理的资源,我通过派生Drop特征来处理该资源。第二个“子”结构是从父结构中检索的,并且需要该资源尚未被释放才能有效。
换句话说,任何父实例的寿命都必须比其子实例的寿命长。
\n我的解决方案使用引用来使借用检查器强制执行此规则。
\nstruct Parent {\n // Private resource data.\n}\n\nimpl Parent {\n fn new() -> Self {\n Parent {}\n }\n\n fn new_child(&self) -> Child {\n return Child { _parent: self };\n }\n}\n\nimpl Drop for Parent {\n fn drop(&mut self) {\n // Do some cleanup after which no instance of Child will be valid.\n }\n}\n\nstruct Child<\'a> {\n _parent: &\'a Parent,\n // Private data.\n}\n\nimpl<\'a> Child<\'a> {\n fn hello(&self) {\n println!("Hello Child!");\n }\n}\n\nfn main() {\n let parent = …Run Code Online (Sandbox Code Playgroud)