24.09., 9:00 - 11:00: Due to updates GitLab will be unavailable for some minutes between 09:00 and 11:00.

ambientvolumegenerator.comp 3.42 KB
Newer Older
Jakob Weiss's avatar
Jakob Weiss committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
// ================================================================================================
// 
// This file is part of the CAMPVis Software Framework.
// 
// If not explicitly stated otherwise: Copyright (C) 2012-2015, all rights reserved,
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
//      Chair for Computer Aided Medical Procedures
//      Technische Universitaet Muenchen
//      Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
// 
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 
// except in compliance with the License. You may obtain a copy of the License at
// 
// http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software distributed under the 
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
// either express or implied. See the License for the specific language governing permissions 
// and limitations under the License.
// 
// ================================================================================================

// (c) 2017 Jakob Weiss <jakob.weiss@tum.de>

// ==================== Shader for median filtering. ====================
// Expects the following dynamic defines:
//
// #define OUTPUT_TEXTURE_FORMAT
//          The texture format of the output texture. Preferrably specified through Texture::calcMatchingWriteFormat()
//
// uniform _outputImage
//          dynamically defined (i|u)image(1|2|3)D uniform to allow imageStore operation of the output
// #define TEXTURE_DIMENSIONALITY
//          The dimensionality of the texture [1,2,3]

// The work group size can be overridden by dynamic defines
#ifndef WORK_GROUP_SIZE_X
#define WORK_GROUP_SIZE_X 1
#endif
#ifndef WORK_GROUP_SIZE_Y
#define WORK_GROUP_SIZE_Y 1
#endif
#ifndef WORK_GROUP_SIZE_Z
#define WORK_GROUP_SIZE_Z 1
#endif

#include "tools/transferfunction.frag"


// volume
uniform sampler3D _volume;
uniform TextureParameters3D _volumeTextureParams;

// Transfer function
uniform sampler1D _transferFunction;
uniform TFParameters1D _transferFunctionParams;

// Transfer function
uniform sampler1D _aoEmissiveTF;
uniform TFParameters1D _aoEmissiveTFParams;

layout(local_size_x = WORK_GROUP_SIZE_X, local_size_y = WORK_GROUP_SIZE_Y, local_size_z = WORK_GROUP_SIZE_Z) in;


void main() {
    // get index in global work group i.e x,y position
    ivec3 pixel_coords = ivec3(gl_GlobalInvocationID.xyz);
    vec3 samplePosition = vec3(pixel_coords)*_volumeTextureParams._sizeRCP;

    float sampleIntensity = texture(_volume, samplePosition).r;
    vec4 sampleTFColor = lookupTF(_transferFunction, _transferFunctionParams, sampleIntensity);
    
    // precompute the LAO ray directions
    vec4 aoRayDirs[NUM_AO_RAYS];
    initLAODirs(aoRayDirs, _aoSphereRadius, _volumeTextureParams);

    vec3 ambientOcclusion = computeLAO(samplePosition, aoRayDirs, _volume, _transferFunction, _transferFunctionParams, _aoEmissiveTF, _aoEmissiveTFParams);

    vec4 result = vec4(ambientOcclusion, sampleTFColor.a);

    // output to a specific pixel in the image
    #if TEXTURE_DIMENSIONALITY == 1
    imageStore(_outputImage, pixel_coords.x, vec4(result));
    #elif TEXTURE_DIMENSIONALITY == 2
    imageStore(_outputImage, pixel_coords.xy, vec4(result));
    #else
    imageStore(_outputImage, pixel_coords, vec4(result));
    #endif

}