uniform sampler3D solidTex; varying float dist; vec4 main(void) { //number of zoom cycles float z = log2(dist); float s = z-floor(z); //scale factor according to fragment distance to the camera float frag_scale = pow(2.0,floor(z)); //octave weight according to the interpolation factor float alpha1 = s/2.0; float alpha2 = 1.0/2.0-s/6.0; float alpha3 = 1.0/3.0-s/6.0; float alpha4 = 1.0/6.0-s/6.0; //texture lookup vec4 oct1 = alpha1*texture3D(solidTex, gl_TexCoord[0].xyz/frag_scale); vec4 oct2 = alpha2*texture3D(solidTex, 2.0*gl_TexCoord[0].xyz/frag_scale); vec4 oct3 = alpha3*texture3D(solidTex, 4.0*gl_TexCoord[0].xyz/frag_scale); vec4 oct4 = alpha4*texture3D(solidTex, 8.0*gl_TexCoord[0].xyz/frag_scale); //blending vec4 n = oct1+oct2+oct3+oct4; gl_FragColor = n; }