// ================================================================================================ // // 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 // 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 // ==================== 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 }