ELF>@@ATL%UH-HHH=LHH-HH=LHH]A\//VTK::System::Dec //========================================================================= // // Program: Visualization Toolkit // Module: vtkLineIntegralConvolution2D_fs1.glsl // // Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // All rights reserved. // See Copyright.txt or http://www.kitware.com/Copyright.htm for details. // // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. // //========================================================================= // the output of this shader //VTK::Output::Dec uniform sampler2D texVectors; uniform sampler2D texNoise; uniform sampler2D texLIC; uniform sampler2D texSeedPts; uniform int uPassNo; // in pass 1 hpf of pass 0 is convolved. uniform float uStepSize; // step size in parametric space uniform vec2 uNoiseBoundsPt1; // tc of upper right pt of noise texture in vec2 tcoordVC; //VTK::LICVectorLookup::Impl // convert from vector coordinate space to noise coordinate space. // the noise texture is tiled across the whole domain vec2 VectorTCToNoiseTC(vec2 vectc) { return vectc/uNoiseBoundsPt1; } // get the texture coordidnate to lookup noise value. // in pass 1 repeatedly tile the noise texture across // the computational domain. vec2 getNoiseTC(vec2 tc) { if (uPassNo == 0) { return VectorTCToNoiseTC(tc); } else { return tc; } } // look up noise value at the given location. The location // is supplied in vector texture coordinates, hence the need // to convert to either noise or lic texture coordinates in // pass 1 and 2 respectively. float getNoise(vec2 vectc) { return texture2D(texNoise, getNoiseTC(vectc)).r; } // fourth-order Runge-Kutta streamline integration // no bounds checks are made, therefore it's essential // to have the entire texture initialized to 0 // and set clamp to border and have border color 0 // an integer is set if the step was taken, keeping // an accurate step count is necessary to prevent // boundary artifacts. Don't count the step if // all vector lookups are identically 0. This is // a proxy for "stepped outside valid domain" vec2 rk4(vec2 pt0, float dt, out bool count) { count=true; float dtHalf = dt * 0.5; vec2 pt1; vec2 v0 = getVector(pt0); pt1 = pt0 + v0 * dtHalf; vec2 v1 = getVector(pt1); pt1 = pt0 + v1 * dtHalf; vec2 v2 = getVector(pt1); pt1 = pt0 + v2 * dt; vec2 v3 = getVector(pt1); vec2 vSum = v0 + v1 + v1 + v2 + v2 + v3; if (vSum == vec2(0.0,0.0)) { count = false; } pt1 = pt0 + (vSum) * (dt * (1.0/6.0)); return pt1; } void main(void) { vec2 lictc = tcoordVC.st; vec4 lic = texture2D(texLIC, lictc); vec2 pt0 = texture2D(texSeedPts, lictc).st; bool count; vec2 pt1 = rk4(pt0, uStepSize, count); if (count) { // accumulate lic step // (lic, mask, 0, step count) float noise = getNoise(pt1); gl_FragData[0] = vec4(lic.r + noise, lic.g, 0.0, lic.a + 1.0); gl_FragData[1] = vec4(pt1, 0.0, 1.0); } else { // keep existing values gl_FragData[0] = lic; gl_FragData[1] = vec4(pt0, 0.0, 1.0); } } GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0GNUzRx $`FHN |AB`6Egt/ _GLOBAL__sub_I_vtkLineIntegralConvolution2D_LICI.cxx_ZStL8__ioinit_ZL28vtkDebugLeaksManagerInstance__dso_handle_ZNSt8ios_base4InitC1Ev_GLOBAL_OFFSET_TABLE__ZNSt8ios_base4InitD1Ev__cxa_atexit_ZN20vtkDebugLeaksManagerC1Ev_ZN20vtkDebugLeaksManagerD1Ev_Z38vtkRenderingOpenGL2_AutoInit_ConstructvvtkLineIntegralConvolution2D_LICI  $* 16 > E*P \ .symtab.strtab.shstrtab.text.data.bss.rela.text.startup.rela.init_array.rodata.str1.8.rela.data.rel.local.comment.note.GNU-stack.note.gnu.property.rela.eh_frame@!@'@1@`,@D?@P2 dp _@ t0x ,}   @@ Q0