我刚刚写完纹理和采样器对象的代码,但现在我对如何在 GLSL 中实现分离的描述符感到困惑。
访问描述符集 0 中的组合图像采样器,绑定 0 将使用以下方法完成:
layout(set = 0, binding = 0) uniform sampler2D texSampler;
片段着色器然后将使用
sampler2D
和 texture
函数对图像进行采样:
layout(location = 0) in vec2 fragTexCoord;
layout(location = 0) out vec4 outColor;
void main() {
outColor = texture(texSampler, fragTexCoord);
}
据我了解,使用
VK_DESCRIPTOR_TYPE_SAMPLER
为采样器创建描述符集(或绑定),并为类型为 VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
的采样图像创建另一个描述符集(或绑定)。但是,我不知道将使用什么语法来访问单独的描述符。
layout(set = 0, binding = 0) uniform /* idk what type it is */ sampler
layout(set = 0, binding = 1) uniform /* idk */ sampledImage
// alternatively...
layout(set = 0, binding = 0) uniform /* idk */ sampler
layout(set = 1, binding = 0) uniform /* idk */ sampledImage
采样器和图像是否按照创建描述符集时指定的那样存储在不同的集/绑定中?
如果
sampler2D
用于描述符类型为 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
的组合图像采样器,那么每种分离类型使用的语法是什么?
VK_DESCRIPTOR_TYPE_SAMPLER
、VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
、VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
、VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
和VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
?
如何在
main
中调用这些分离的对象来设置outColor
值?
GLSL 类型
sampler*
(其中 *
是纹理类型,例如 1D
、Cube
等)表示 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
形式的描述符。
如 GL_KHR_vulkan_glsl 扩展中所指定,GLSL 类型
sampler
(无 *
)表示 VK_DESCRIPTOR_TYPE_SAMPLER
形式的描述符。对于 VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
形式的描述符,适当的 GLSL 类型是 texture*
(其中 *
又是纹理的类型)。
要将采样图像与采样器结合起来,您可以使用构造函数语法从两者创建一个
sampler*
对象: texture(sampler2D(t, s), ...);