Вычислить шейдер: набрав аргумент функции с Image2D
Я пишу каркас, который должен предлагать несколько функций, определенных для типа image2D.
Но, кажется, немного трудно понять это правильно, и я не могу найти документацию по прохождению image2D
к функции.
Вот минимальный пример моей проблемы:
#version 440
layout (local_size_x = 16, local_size_y = 16) in;
struct Test
{
bool empty;
};
// Version 1:
// fails with 0:11: '' : imageLoad function cannot access the image defined
// without layout format qualifier or with writeonly memory qualifier
float kernel1(image2D x, Test arg1){
return imageLoad(x, ivec2(1, 1)).x;
}
// Version 2:
// fails with ERROR: 0:16: 'Test' : syntax error syntax error
// doesn't fail without the Test struct at second argument
float kernel2(layout (r32f) image2D x, Test arg2){
return imageLoad(x, ivec2(1, 1)).x;
}
layout (binding=0, r32f) readonly uniform image2D globalvar_A;
const Test globalvar_f = Test(false);
void main(){
// works when other function are commented out
imageLoad(globalvar_A, ivec2(1, 1)).x;
//kernel1(globalvar_A, globalvar_f);
//kernel2(globalvar_A, globalvar_f);
}
Это терпит неудачу на моем Intel на борту (hd4400) Windows 10.
Более сложная версия генерирует no overloaded function found
ошибка при вызове функции.
На оборудовании nvidia я обошел это, набрав img
с image2D1x32_bindless
, Но это, кажется, без документов NVIDIA конкретного имени пререканий.
Кто-нибудь может указать мне правильное направление с этой, казалось бы, простой задачей?
Обновить:
Я взял пример непосредственно из спецификации GLSL 4.3, раздел 4.10:
#version 430
layout (local_size_x = 16, local_size_y = 16) in;
// this works fine without the imageLoad
vec4 funcA(restrict image2D a){ return imageLoad(a, ivec2(1, 1));}
layout(rgba32f) coherent uniform image2D img2;
void main(){
funcA(img1); // OK, adding "restrict" is allowed
}
и получить функцию imageLoad не может получить доступ к изображению, определенному без спецификатора формата макета. От которого я могу избавиться, добавив: layout(rgba32f)
, Но тогда я не могу передать дополнительные структуры этой функции, потому что это приводит к синтаксической ошибке. Итак, я могу сделать вывод:
за imageLoad
у вас должно быть изображение с квалификатором макета, но объявление его для аргумента функции нарушено / плохо определено. Ошибка синтаксического анализатора очень вероятна, так как встроенные типы работают, что указывает на более надежную поддержку синтаксического анализатора для них.