Как преобразовать uint64_t в sampler2D?

Я хочу использовать безбиндовые текстуры, но 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? Как это сделать?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
873
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как и в случае со всеми расширениями GLSL, вы должны явно включить их. Однако у вас есть более интересная проблема: текстурирование без привязки нельзя использовать со SPIR-V. То, что вы хотите сделать, возможно только в том случае, если вы передаете GLSL напрямую OpenGL без посредника SPIR-V.

Vulkan не поддерживает текстуры без привязки; вам нужно использовать массивы сэмплеров, чтобы получить эквивалентный эффект. И OpenGL не поддерживает GL_EXT_scalar_block_layout. Таким образом, код, который вы пишете, не может использоваться ни одной графической системой.

Итак, AZDO говорит «использовать текстуры без привязки», но когда я хочу написать код для разных графических API, я не могу использовать текстуры без привязки XDDD. Думаю, мне нужно придумать что-то еще.

BrodaJarek3 10.12.2020 01:30

Я использовал GL_EXT_scalar_block_layout, потому что компилятор spirv выдал мне ошибку, когда я пытался использовать uin64_t внутри блока юниформ-буфера.

BrodaJarek3 10.12.2020 01:32

@ BrodaJarek3: AZDO — это набор методов, характерных для OpenGL. Эти методы существуют для преодоления ограничений API OpenGL. Они не применяются к другим API.

Nicol Bolas 10.12.2020 02:48

Другие вопросы по теме