это представляет метод 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?
Естественно делать вычисления в предварительно умноженном альфа-цветовом пространстве. Это лучше подходит для поглощения-поглощения у объемных явлений. Соответствующие уравнения:
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
соответствует белому туманному веществу, поэтому вы должны смотреть на него на темном фоне.
Других решений пока нет …