1

我想使用无绑定纹理,但 spirv 不支持它。我在这里找到:https : uint64_t//www.khronos.org/opengl/wiki/Bindless_Texture 可以转换为sampler2D。

uint64_t 值可以使用构造函数转换为任何采样器或图像类型:sampler2DArray(some_uint64)。它们也可以转换回 64 位整数。

我认为我可以上传一个无绑定句柄作为 uint64_t,然后将其转换为 sampler2D。

spir-v 编译器给了我错误:

error: 'sampler/image' : cannot construct this type
error: 'sampler2D' : sampler-constructor requires two arguments
error: 'constructor' : too many arguments
error: 'assign' :  cannot convert from ' const float' to 'layout( location=0) out highp 4-component vector of float'

着色器代码

#version 460 core
#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require
#extension GL_EXT_scalar_block_layout : require

layout(location = 0) out vec4 f_color;

layout(location = 0) in vec2 v_uv;

layout(std430, binding = 5) uniform Textures
{
    uint64_t albedo;
};

void main()
{
    f_color = texture(sampler2D(albedo), v_uv);
}

是否可以转换uint64_tsampler2D?怎么做?

4

1 回答 1

4

与所有 GLSL 扩展一样,您必须明确启用它们。但是,您有一个更有趣的问题:无绑定纹理不能与 SPIR-V 一起使用。只有将 GLSL 直接提供给 OpenGL,而不需要 SPIR-V 中介,才能实现您想要做的事情。

Vulkan 不支持无绑定纹理;您需要使用采样器数组来获得等效的效果。并且 OpenGL 不支持GL_EXT_scalar_block_layout. 所以你写的代码不能被任何图形系统使用。

于 2020-12-10T00:06:16.583 回答