医学图像体渲染照明6 体照明之光传输和照明模型2

       文章翻译总结自Advanced illumination techniques for GPU volume raycasting       

3.2梯度计算

       如我们所见,梯度对漫反射和镜面反射都很重要。

       计算的渐变的质量对于渲染的视觉质量至关重要。特别是在处理高镜面反射时,梯度沿表面平滑变化是很重要的。一般有三种梯度计算方法:正向差分、中值差分和Sobel梯度[95]。正如所料,在这些Sobel梯度导致最光滑的表面。当对镜面反射使用渐变时,这将直接可见。虽然在绘制人工数据集时,视觉差异很大,但在平滑强度变化的真实数据集可视化时,视觉差异并不明显。但是,可以应用梯度滤波器(见图3.2)来进一步提高渲染质量。

医学图像体渲染照明6 体照明之光传输和照明模型2

       从左到右依次为 正向/前向差分中心差分sobel差分

医学图像体渲染照明6 体照明之光传输和照明模型2

       中心差分梯度滤波矫正后的中心差分

       由于其计算成本相对较高(需要26个附加体素查找),Sobel运算符通常用于预处理阶段。这有一个缺点,即当前的set transfer函数对计算的渐变没有任何影响。因此,当渲染性能很重要时,通常使用正向和中间值差分。如代码所示,计算前向差异梯度只需要三个额外的体素查找。

vec3 calcGradient(sampler3D volume, vec3 voxPos, float t, vec3 dir) {
    vec3 gradient;
    float v = texture1D(transferFunc , textureLookup3D(volume, volumeParameters,
        voxPos).a);
    float v0 = texture1D(transferFunc , textureLookup3D(volume, volumeParameters,
        voxPos + vec3(offset.x, 0.0, 0.0)).a);
    float v1 = texture1D(transferFunc , textureLookup3D(volume, volumeParameters,
        voxPos + vec3(0, offset.y, 0)).a);
    float v2 = texture1D(transferFunc , textureLookup3D(volume, volumeParameters,
        voxPos + vec3(0, 0, offset.z)).a);
    gradient = vec3(v - v0, v - v1, v - v2);
    return gradient;
}