2015-12-15 2 views
3

Я знаю, что использование imageStore и последующий imageRead в рамках другого вызова в рамках одной и той же отправки требует правильного чтения когерентного ключевого слова.glsl imageStore, за которым следует imageLoad, является ли оно связным?

Однако могу ли я прочитать значение в пределах той же отправки без использования coherent?

Или, другими словами, когда у меня есть это:

layout(r8ui) uniform uimage2D input_texture; 
void main(){ 
    ivec2 coords = ivec2(gl_GlobalInvocationID.xy); 
    imageStore(input_texture, coords, ivec4(128)); 
    int value = imageLoad(input_texture, coords).r; 
} 

Гарантируется value быть 128, даже без согласованного ключевого слова?

ответ

2

Вы всегда можете прочитать значения, записанные с помощью экземпляра шейдера без coherent классификатором пока:

  1. Ни один другой экземпляр шейдера пишет в конкретном месте в изображении/буфера ,

  2. Вы читаете значение обратно через то же изображение/буферную переменную, как вы ее написали. Две отдельные переменные изображения/буфера могут ссылаться на один и тот же адрес памяти (привязка одного и того же изображения/буфера к различным переменным). Но реализациям не требуется кэшировать обращения к одной и той же памяти с помощью разных переменных.

    Квалификатор restrict может использоваться для переменной изображения, чтобы сделать его явным, что это так. Действительно, люди должны использовать restrict по умолчанию, если они явно не намерены обращаться к одной и той же памяти через несколько объектов.

 Смежные вопросы

  • Нет связанных вопросов^_^