我刚刚完成了纹理和采样器对象的代码编写,但现在我对如何在 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
(no*
) 表示以下形式的描述符VK_DESCRIPTOR_TYPE_SAMPLER
。对于 形式的描述符VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,适当的 GLSL 类型是texture*
(其中*
又是纹理的类型)。要将采样图像与采样器结合起来,您
sampler*
可以使用构造函数语法从两者创建一个对象:texture(sampler2D(t, s), ...);