Я хочу использовать безбиндовые текстуры, но spirv не поддерживает это. Я нашел здесь: https://www.khronos.org/opengl/wiki/Bindless_Texture что uint64_t
можно преобразовать в сэмплер 2D.
Значения 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_t
в sampler2D
? Как это сделать?
Как и в случае со всеми расширениями GLSL, вы должны явно включить их. Однако у вас есть более интересная проблема: текстурирование без привязки нельзя использовать со SPIR-V. То, что вы хотите сделать, возможно только в том случае, если вы передаете GLSL напрямую OpenGL без посредника SPIR-V.
Vulkan не поддерживает текстуры без привязки; вам нужно использовать массивы сэмплеров, чтобы получить эквивалентный эффект. И OpenGL не поддерживает GL_EXT_scalar_block_layout
. Таким образом, код, который вы пишете, не может использоваться ни одной графической системой.
Я использовал GL_EXT_scalar_block_layout
, потому что компилятор spirv выдал мне ошибку, когда я пытался использовать uin64_t
внутри блока юниформ-буфера.
@ BrodaJarek3: AZDO — это набор методов, характерных для OpenGL. Эти методы существуют для преодоления ограничений API OpenGL. Они не применяются к другим API.
Итак, AZDO говорит «использовать текстуры без привязки», но когда я хочу написать код для разных графических API, я не могу использовать текстуры без привязки XDDD. Думаю, мне нужно придумать что-то еще.