2012-04-11 2 views
1

Используя загрузку изображения и магазин, я хотел бы сделать следующее в GLSL 4.2:GLSL нагрузки 4.2 Изображение и магазин & MemoryBarrier

vec3 someColor = ...; 
vec4 currentPixel = imageLoad(myImage, uv); 
float a = currentPixel.a/(currentPixel.a+1.0f); 
vec4 newPixel = vec4(currentPixel.rgb*a+someColor*(1.0f-a),currentPixel.a+1.0f); 
imageStore(myImage, uv, newPixel); 

значение для «уф» может быть одинаковым для нескольких растровых точек. Чтобы получить правильный результат, я, конечно, не хочу, чтобы никакие другие shaderexecution не записывали в мой пиксель между вызовами imageLoad() и imageStore();

Возможно ли это как-то с памятью Barrier? если да, то как это должно быть использовано в этом коде?

ответ

2

Значение для «uv» может быть одинаковым для нескольких растрированных пикселей.

Тогда вы не можете этого сделать.

memoryBarrier не является способом создания атомной операции. Он только гарантирует заказ для работы одного шейдера. Поэтому, если конкретный вызов шейдера считывает изображение, записывает его, а затем читает его снова, вам нужно memoryBarrier, чтобы убедиться, что прочитанное - это то, что было написано ранее. Если какой-то другой вызов shader написал ему, то вам не повезло (если только это не было зависимым вызовом. Правила для этого материала сложны).

Если вы пытаетесь выполнить программное смешение, вам нужно убедиться, что каждый вызов шейдера фрагмента считывает/записывает значение уникальное значение. В противном случае это не сработает.

Вы не говорите, что именно вы пытаетесь достичь, поэтому невозможно обеспечить лучший способ получить то, что вы хотите. Все, что я могу сказать, это то, что этот путь не сработает.

+0

хорошо - уже thoght так. Большое спасибо за разъяснения. да, я пытаюсь сделать смешение. Я мог бы использовать ImageAtomicAdd (.., vec4 (someColor, 1.0f)) и при чтении пикселов, делящихся на их значение .a, но проблема в том, что пиксели изначально уже имеют цвет, а также вес, и этот вес где-то между 0 и 1 – user1282931

+0

@ user1282931: Если вы пытаетесь сделать смешение, почему у вас есть несколько фрагментов, записывающих одно значение? –

+0

Это своего рода обратный просвет на карте отражения. представленное отражение присутствует, а также перпендикуляр объектных номенклатур, и из этого следует обратить внимание на карту отражения - так что множественные фрагменты могут отображаться на один и тот же отражающий тексель и во избежание шума, я хочу использовать смешение – user1282931

0

Вам понадобится реализовать систему блокировки (блокировка/мьютекс). Для этой цели полезно использовать imageAtomicCompSwap или использовать буфер, atomicCompSwap. Конечно, вам нужно будет использовать глобальную переменную (скажем, текстуру), а не локальную.

Для целей реализации, я думаю, что этот вопрос находится в большой части ответа на ваш вопрос: Is my spin lock implementation correct and optimal?

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