Как сделать смешивание в Volume Rendering с использованием GLSL?

это представляет метод Volume Rendering с использованием устаревшего API OpenGL. Но теперь я хочу завершить объемный рендеринг с использованием GLSL, и я закончил некоторые его части. Мой вопрос, как сделать смешивание. В приведенной выше ссылке смешивание завершается следующими кодами:

glEnable(GL_BLEND);
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

Но как я могу закончить смешивание, используя GLSL?

Я попытался использовать следующее уравнение:

C = Cs*As + Cd(1 - As)

Cs — цвет исходного объекта. Cd — цвет целевого объекта. Как и альфа исходного объекта. И мой код во фрагментном шейдере выглядит следующим образом:

......
vec3 dir = backPoint - frontPoint;
float len = length(dir);
float stepSize = 0.01;
vec3 deltaDir = normalize(dir)*stepSize;
float deltaLen = length(deltaDir);
float accLen = 0;
float accAlpha = 0;
float sampleAlpha = 0;
vec4 accColor = vec4(0.0);

vec3 samplePoint = frontPoint;
vec4 sampleColor;
while(accLen < len && accColor.a <= 1.0){
sampleColor = texture(texture3D, samplePoint);

accColor = sampleColor*sampleColor.a + accColor*(1-sampleColor.a);

accLen += deltaLen;
samplePoint += deltaDir;
}
color = accColor;
......

В моем проекте я позволил значению r, g, b, a 3D-текстуры быть одинаковым. Но я не могу получить результат по одной из приведенных выше ссылок. Можете ли вы помочь мне решить проблему смешивания с помощью GLSL?

2

Решение

Естественно делать вычисления в предварительно умноженном альфа-цветовом пространстве. Это лучше подходит для поглощения-поглощения у объемных явлений. Соответствующие уравнения:

C = Cs + (1 - As)*Cd
A = 1 - (1 - As)*(1 - Ad) = As + (1 - As)*Ad

Хотя можно выполнять вычисления в не предварительно умноженном альфа-цветовом пространстве, это потребует деления на альфа-значения и, как правило, будет более сложным. (Ваш код работает без предварительного умножения и не учитывает его …)

Итак, для настройки смешивания OpenGL вы используете:

glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );

и вы используете эту формулу в шейдере:

accColor = sampleColor + accColor*(1-sampleColor.a);

Вы также должны принять это во внимание при создании ваших 3D текстур. Например текстура где для всех пикселей R = G = B = A соответствует белому туманному веществу, поэтому вы должны смотреть на него на темном фоне.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector