错误日志
这个错误是在Vulkan项目出现的,由Vulkan的Validation Layer报出:
Validation Error: [ UNASSIGNED-CoreValidation-Shader-InconsistentSpirv ] Object 0: handle = 0x1c89eff0fd8, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x6bbb14 | SPIR-V module not valid: Interfaces passed to OpEntryPoint must be of type OpTypeVariable. Found OpFunctionParameter.
%texture = OpFunctionParameter %_ptr_UniformConstant_71
错误排查
看起来是shader的问题,根据调用堆栈找到对应的shader,搜索关键字texture,找到这样一段代码:
IBL = EvaluateIBL(texture, ....)
其中,texture是一个采样器sampler:
layout(binding = 4) uniform sampler2D texture;
在这里我把一个sampler作为函数的参数传入了,难道Vulkan不支持将sampler作为函数的参数吗?
一番搜索后,在glslang的git repo找到这样一个commit:Fix #2264: OpEntryPoint incorrectly including function parameters.
看起来是shader编译器的一个问题,应该是在最新版的SDK修复掉了。既然如此,解决方案就比较容易了:更新SDK
解决
首先下载最新版本的Vulkan的SDK,然后安装。
由于这个项目是采用了cmake自动化编译流程,所以得删除掉cmake的cache文件:CMakeCache.txt,然后检查环境变量里面Vulkan SDK路径已经指向了最新版的SDK,最后编译,问题解决!