Какова функция TransferFunc в объемном рендеринге с использованием GLSL?
У меня проблема с объемным рендерингом с использованием GLSL. Исходный код можно найти по следующей ссылке https://github.com/toolchainX/Volume_Rendering_Using_GLSL. Во фрагменте шейдер имени raycasting.frag
, sampler1D TransferFunc
появляется, но я не знаю фактическую функцию (использование или значение) TransferFunc
, Ниже приведены подробные сведения о raycasting.frag.
И конкретный код: colorSample = текстура (TransferFunc, интенсивность);
#version 400
in vec3 EntryPoint;
in vec4 ExitPointCoord;
uniform sampler2D ExitPoints;
uniform sampler3D VolumeTex;
uniform sampler1D TransferFunc;
uniform float StepSize;
uniform vec2 ScreenSize;
layout (location = 0) out vec4 FragColor;
void main()
{
// ExitPointCoord 的坐标是设备规范化坐标
// 出现了和纹理坐标有关的问题。
vec3 exitPoint = texture(ExitPoints, gl_FragCoord.st/ScreenSize).xyz;
// that will actually give you clip-space coordinates rather than
// normalised device coordinates, since you're not performing the perspective
// division which happens during the rasterisation process (between the vertex
// shader and fragment shader
// vec2 exitFragCoord = (ExitPointCoord.xy / ExitPointCoord.w + 1.0)/2.0;
// vec3 exitPoint = texture(ExitPoints, exitFragCoord).xyz;
if (EntryPoint == exitPoint)
//background need no raycasting
discard;
vec3 dir = exitPoint - EntryPoint;
float len = length(dir); // the length from front to back is calculated and used to terminate the ray
vec3 deltaDir = normalize(dir) * StepSize;
float deltaDirLen = length(deltaDir);
vec3 voxelCoord = EntryPoint;
vec4 colorAcum = vec4(0.0); // The dest color
float alphaAcum = 0.0; // The dest alpha for blending
/* 定义颜色查找的坐标 */
float intensity;
float lengthAcum = 0.0;
vec4 colorSample; // The src color
float alphaSample; // The src alpha
// backgroundColor
vec4 bgColor = vec4(1.0, 1.0, 1.0, 0.0);
for(int i = 0; i < 1600; i++){
// 获得体数据中的标量值scaler value
intensity = texture(VolumeTex, voxelCoord).x;
// 查找传输函数中映射后的值
// 依赖性纹理读取
colorSample = texture(TransferFunc, intensity);
// modulate the value of colorSample.a
// front-to-back integration
if (colorSample.a > 0.0) {
// accomodate for variable sampling rates (base interval defined by mod_compositing.frag)
colorSample.a = 1.0 - pow(1.0 - colorSample.a, StepSize*200.0f);
colorAcum.rgb += (1.0 - colorAcum.a) * colorSample.rgb * colorSample.a;
colorAcum.a += (1.0 - colorAcum.a) * colorSample.a;
}
voxelCoord += deltaDir;
lengthAcum += deltaDirLen;
if (lengthAcum >= len ){
colorAcum.rgb = colorAcum.rgb*colorAcum.a + (1 - colorAcum.a)*bgColor.rgb;
break; // terminate if opacity > 1 or the ray is outside the volume
}else if (colorAcum.a > 1.0){
colorAcum.a = 1.0;
break;
}
}
FragColor = colorAcum;
// for test
// FragColor = vec4(EntryPoint, 1.0);
// FragColor = vec4(exitPoint, 1.0);
}
Я надеюсь, что вы можете помочь мне решить проблему. Спасибо!
1 ответ
Передаточная функция определяет, как интенсивность из трехмерного набора данных объема сопоставляется с цветом.
Многие 3D-наборы данных, например, из медицинских изображений, содержат одно значение на воксел. Например, для компьютерной томографии это будет величина поглощения рентгеновского излучения (по крайней мере, я так думаю...).
Когда вы визуализируете 3D-набор данных, вы хотите закодировать разные интенсивности в разные цвета. Это то, что делает передаточная функция. Если вы используете 1D текстуру для кодирования передаточной функции, эта текстура будет содержать цвет RGBA для каждого возможного значения интенсивности.
Эти функции передачи могут быть чем угодно, чтобы полученное изображение выглядело хорошо / полезно. Очень типичные передаточные функции имеют вид:
- Полностью прозрачный (альфа = 0,0) ниже определенного значения интенсивности.
- Линейное линейное изменение с увеличением альфа от 0,0 до 1,0 для диапазона значений выше этого. Для лучших визуальных результатов это часто включает использование 3 различных цветов. Например, черный при альфа = 0.0, красный при альфа = 0.5 и белый при альфа = 1.0 с цветами, интерполированными между этими значениями.
- Полностью непрозрачный (альфа = 1,0) выше этого.
Если данные вашего изображения считываются из файла DICOM, они могут содержать теги, указывающие диапазон значений, которые следует использовать для этих различных частей функции передачи.