使用sampler2D作为函数参数编译Vulkan GLSL着色器时如何解决“语法错误,意外的SAMPLER,期待RIGHT_PAREN”?

问题描述 投票:0回答:1

我正在使用 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 并调用上面的代码两者都有辅助功能,所以我想我错过了一些明显的东西。

glsl shader vulkan spir-v qrhi
1个回答
0
投票

在 Vulkan 中,

sampler
是内置类型,就像
sampler2D
vec4
一样,并且您不能将变量命名为内置类型。所以
sampler2D sampler
是一个错误,但
sampler2D vec4
sampler2D while
也会是错误。例如,如果您将变量重命名为
smp
,它将起作用。

您可以在 OpenGL 和 WebGL 类型 GLSL 中命名变量

sampler
,因为
sampler
只是 Vulkan 类型 GLSL 中的内置类型。

© www.soinside.com 2019 - 2024. All rights reserved.