我正在使用 Qt 的 QRhi,更具体地说是它的 QtShaderTools 和
qsb
着色器编译器工具。
基本上,它采用 Vulkan-GLSL 着色器源,并将其转换为 SPIR-V 以及 QRhi 支持的任何其他着色器源/字节码。
然后有一些 C++ 端 API 可以帮助加载生成的文件并在实际后端 API(无论是 OpenGL、Vulkan、DX、Metal 等等)上运行着色器。
我正在尝试让一小部分渲染代码在一个广泛使用 OpenGL 3.3 Core(通过 QOpenGL)的更大项目中工作。我正在设置着色器编译并将我们的
#version 330
GLSL 着色器代码转换为 Vulkan GLSL #version 460
。
相关着色器定义了一个辅助函数,以
sampler2D
作为参数:
vec4 sampleFt( in sampler2D sampler, vec2 coordSource )
{ ... }
使用 Qt 的
qsb
工具编译此着色器会引发指向此行的错误:
QSpirvCompiler: Failed to parse shader
Shader baking failed: ERROR: <file>:<line>: '' : syntax error, unexpected SAMPLER, expecting RIGHT_PAREN
我在网上找到了很多 Vulkan GLSL 着色器将
sampler2D
作为函数参数传递的示例,但似乎找不到我需要如何更改它才能使其工作。
顺便说一句:我们的着色器基本上是 glsl 的串联片段,其中此辅助函数位于一个单独的(并重用的)源文件中,与在各种其他源文件中定义的
void main()
中定义的实际调用代码不同。有问题的采样器作为 uniform
“传递给”着色器,因此删除参数并使用统一名称可以正常工作,但这似乎排除了任何类型的代码具有多个 Sampler2D 并调用上面的代码两者都有辅助功能,所以我想我错过了一些明显的东西。
在 Vulkan 中,
sampler
是内置类型,就像 sampler2D
或 vec4
一样,并且您不能将变量命名为内置类型。所以 sampler2D sampler
是一个错误,但 sampler2D vec4
或 sampler2D while
也会是错误。例如,如果您将变量重命名为 smp
,它将起作用。
您可以在 OpenGL 和 WebGL 类型 GLSL 中命名变量
sampler
,因为 sampler
只是 Vulkan 类型 GLSL 中的内置类型。