小编Deb*_*aug的帖子

M1 mac 上的设备扩展验证错误

因此,我尝试在配备 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)

macos vulkan moltenvk

5
推荐指数
1
解决办法
2276
查看次数

GLSL 点积的问题

所以我尝试使用 OpenGL 来实现基本的漫反射照明。我编写了一个简单的着色器,它将采用法线向量和光向量,并使用所述向量的点积来计算像素的亮度。这是我的输出:

  • 来自左侧的光([1, 0, 0] 作为光矢量) 1 0 0
  • 光线照射下来([0, -1, 0] 作为光矢量) 0 -1 0
  • 来自后面的光([0, 0, 1] 作为光矢量) 0 0 1

正如您所看到的,它对于前两种情况工作得很好,但对于第三种情况就完全崩溃了。顺便说一句,[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)

c++ opengl glsl

2
推荐指数
1
解决办法
4040
查看次数

强制一个结构比另一个结构寿命更长

我有两个结构。第一个“父”结构包含需要显式清理的资源,我通过派生Drop特征来处理该资源。第二个“子”结构是从父结构中检索的,并且需要该资源尚未被释放才能有效。

\n

换句话说,任何父实例的寿命都必须比其子实例的寿命长。

\n

我的解决方案使用引用来使借用检查器强制执行此规则。

\n
struct 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)

lifetime rust

1
推荐指数
1
解决办法
162
查看次数

标签 统计

c++ ×1

glsl ×1

lifetime ×1

macos ×1

moltenvk ×1

opengl ×1

rust ×1

vulkan ×1