如果我理解正确,我应该创建一个空VkPipelineCache
对象,将其传入vkCreateGraphicsPipelines
并写入数据。然后我可以将它与我正在创建的其他管道重用或将其保存到文件中并在下次运行时使用它。
我试过按照 LunarG 示例来额外的信息:
uint32_t headerLength = pData[0];
uint32_t cacheHeaderVersion = pData[1];
uint32_t vendorID = pData[2];
uint32_t deviceID = pData[3];
Run Code Online (Sandbox Code Playgroud)
但我总是得到headerLength
32,其余的 0。查看规范(https://vulkan.lunarg.com/doc/view/1.0.26.0/linux/vkspec.chunked/ch09s06.html表 9.1),cacheHeaderVersion 应该始终为 1,因为唯一可用的缓存头版本是VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1
.
而且 pData 的大小通常只有 32 个字节,即使我用它创建了 10 个管道。我究竟做错了什么?
在我在OpenGL中使用的几何着色器中,在开头设置一个变量,然后在不重置它的情况下发出顶点,但是在vulkan中,如果我不写入每个EmitVertex()
代码之间的变量将无法正常工作.
我在glsl规范中找不到任何相关内容,是否有规则,第一种情况恰好起作用?有什么变化转移到spirv?
我正在尝试将 spirv 与OpenGL一起使用。之前在我的着色器中,我必须gl_VertexID
计算矩形的 uv,现在我将其替换为gl_VertexIndex
.
如果我使用gl_VertexID
的代码工作,如果我用gl_VertexIndex
在spirv
与vulkan
代码的作品,但如果我用gl_VertexIndex
用的OpenGL的gl_VertexIndex
始终0
。
这是我正在使用的测试绘制命令:
glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 6, 1, 2);
Run Code Online (Sandbox Code Playgroud)
不应该gl_VertexIndex
从0
到5
吗?
我一直在关注不同的教程,但我不明白为什么我需要每个交换链图像而不是飞行中的每帧资源。
本教程:https : //vulkan-tutorial.com/Uniform_buffers
每个交换链图像都有一个统一的缓冲区。如果不同的图像不在同一时间飞行,为什么我需要它?如果前一帧已经完成,我可以不开始重写吗?
另外关于深度缓冲区的 lunarg 教程说:
并且您只需要一个来渲染每一帧,即使交换链有多个图像。这是因为您可以在使用交换链中的每个图像时重用相同的深度缓冲区。
这不能解释任何事情,它基本上说你可以,因为你可以。那么为什么我可以重用深度缓冲区而不是其他资源呢?