-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Vulkan 断言条件修正 #438
Vulkan 断言条件修正 #438
Conversation
This reverts commit 481b7d2.
我认为 Vertex Count 的最大值应该和 index buffer type 一致。vertex count 的最大值不应该超过 index buffer 数据类型能指向的最大值。所以这个 assert 是正确的。 根据上面一行 mesh_data.m_index_buffer = std::make_shared<BufferData>(mesh_vertices.size() * sizeof(uint16_t)); 这里 index buffer 是 uint_16, 所以用 FYI: Vulkan 支持 8-bit, 16-bit 和 32-bit 的 VkIndexType |
@v3c70r 谢谢指出这个问题, 不过该“修正”是为了支持更大的顶点数和索引数, 并不是指原本的断言是错误的. 所以选择将原有的 |
@kwbm 请审核一下该 PR, 谢谢 :D |
本地测试了一下,会有validation layer的报错,可以再看一下能不能修改解决 |
个人认为不应该将 unit16 的 index buffer 替换为 uint32 的 index buffer. 至少应该提供能使用 unit16 index buffer 的选项。 理想状况应该是根据加载的模型来选择使用相应的 index buffer data type. 或者在模型处理阶段将模型拆分成较小的 submesh 以适应 unit16 index buffer. index buffer 增大会导致内存使用量增大。同时会导致缓存使用率低和寄存器占用率高的问题。根据硬件的不同和 shader 的复杂度,可能会对性能有不同程度的影响。 |
@v3c70r 请问 "导致寄存器占用率高" 是什么意思呢? 如果先阶段还不能为单独的模型的索引缓冲区指定索引类型, 我觉得还是应该先改为 uint32_t, 作为一个临时解决方案. 否则会部分顶点数较多的模型无法加载.
|
抱歉我查了一下,可能并不会导致寄存器使用率增加。因为 index buffer 在 vertex fetch 阶段之后就没有用了。在 vertex shader 里面应该用不上 index buffer 的数据 🤔 。 |
@ShenMian 测试你的最新改动,本地环境debug版本仍然会报validation layer的问题,我的vulkan SDK版本是1.2.198.1 |
@kwbm 我在本地环境下运行确实没有出现 validation layer 的报错. 我会根据你的报错信息再分析一下. |
Vulkan 的顶点缓冲区至少支持
std::numeric_limits<uint32_t>::max()
个顶点1, 为确保顶点数较多的模型能够成功加载, 对断言进行了修正.Footnotes
https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDraw.html ↩