From 7c224cc5582d2a615882b8b6360f5229be8c37ba Mon Sep 17 00:00:00 2001 From: Eugene Katrukha Date: Sat, 10 May 2025 12:54:34 +0200 Subject: [PATCH] half pixel multires shift --- .../bvv/core/render/sample_volume_blocks.frag | 10 ++-- .../bvv/core/render/sample_volume_simple.frag | 2 +- src/test/java/bvv/debug/DebugHalfPixel.java | 43 ++++++++++++++++++ .../resources/halfpixeltest/cliptest1ch.h5 | Bin 0 -> 17760 bytes .../resources/halfpixeltest/cliptest1ch.tif | Bin 0 -> 4979 bytes .../resources/halfpixeltest/cliptest1ch.xml | 40 ++++++++++++++++ 6 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 src/test/java/bvv/debug/DebugHalfPixel.java create mode 100644 src/test/resources/halfpixeltest/cliptest1ch.h5 create mode 100644 src/test/resources/halfpixeltest/cliptest1ch.tif create mode 100644 src/test/resources/halfpixeltest/cliptest1ch.xml diff --git a/src/main/resources/bvv/core/render/sample_volume_blocks.frag b/src/main/resources/bvv/core/render/sample_volume_blocks.frag index 1348a386..8bc10262 100644 --- a/src/main/resources/bvv/core/render/sample_volume_blocks.frag +++ b/src/main/resources/bvv/core/render/sample_volume_blocks.frag @@ -8,7 +8,7 @@ void intersectBoundingBox( vec4 wfront, vec4 wback, out float tnear, out float t { vec4 mfront = im * wfront; vec4 mback = im * wback; - intersectBox( mfront.xyz, (mback - mfront).xyz, sourcemin, sourcemax, tnear, tfar ); + intersectBox( mfront.xyz, (mback - mfront).xyz, sourcemin-0.5, sourcemax+0.5, tnear, tfar ); } uniform usampler3D lutSampler; @@ -18,7 +18,11 @@ uniform vec3 lutOffset; float sampleVolume( vec4 wpos, sampler3D volumeCache, vec3 cacheSize, vec3 blockSize, vec3 paddedBlockSize, vec3 padOffset ) { - vec3 pos = (im * wpos).xyz + 0.5; + vec3 pos = (im * wpos).xyz ; + vec3 over = pos * step(0.0,pos) - pos; + float zerofade = 1.0; + pos = over + pos; + zerofade = (1.0-over.x)*(1.0-over.y)*(1-over.z); vec3 q = floor( pos / blockSize ) - lutOffset + 0.5; uvec4 lutv = texture( lutSampler, q / lutSize ); @@ -28,5 +32,5 @@ float sampleVolume( vec4 wpos, sampler3D volumeCache, vec3 cacheSize, vec3 block vec3 c0 = B0 + mod( pos * sj, blockSize ) + 0.5 * sj; // + 0.5 ( sj - 1 ) + 0.5 for tex coord offset - return texture( volumeCache, c0 / cacheSize ).r; + return zerofade*texture( volumeCache, c0 / cacheSize ).r; } diff --git a/src/main/resources/bvv/core/render/sample_volume_simple.frag b/src/main/resources/bvv/core/render/sample_volume_simple.frag index e277363e..1dadca3f 100644 --- a/src/main/resources/bvv/core/render/sample_volume_simple.frag +++ b/src/main/resources/bvv/core/render/sample_volume_simple.frag @@ -5,7 +5,7 @@ void intersectBoundingBox( vec4 wfront, vec4 wback, out float tnear, out float t { vec4 mfront = im * wfront; vec4 mback = im * wback; - intersectBox( mfront.xyz, (mback - mfront).xyz, vec3( 0, 0, 0 ), sourcemax, tnear, tfar ); + intersectBox( mfront.xyz, (mback - mfront).xyz, vec3( -0.5, -0.5, -0.5 ), sourcemax+0.5, tnear, tfar ); } uniform sampler3D volume; diff --git a/src/test/java/bvv/debug/DebugHalfPixel.java b/src/test/java/bvv/debug/DebugHalfPixel.java new file mode 100644 index 00000000..c9ffffb2 --- /dev/null +++ b/src/test/java/bvv/debug/DebugHalfPixel.java @@ -0,0 +1,43 @@ +package bvv.debug; + +import java.util.List; + +import net.imglib2.img.Img; +import net.imglib2.img.display.imagej.ImageJFunctions; +import net.imglib2.type.numeric.ARGBType; +import net.imglib2.type.numeric.integer.UnsignedShortType; + +import bdv.spimdata.SpimDataMinimal; +import bdv.spimdata.XmlIoSpimDataMinimal; +import bvv.vistools.Bvv; +import bvv.vistools.BvvFunctions; +import bvv.vistools.BvvHandle; +import bvv.vistools.BvvStackSource; + +import ij.IJ; +import ij.ImagePlus; +import mpicbg.spim.data.SpimDataException; + +public class DebugHalfPixel +{ + public static void main( final String[] args ) + { + //load multires + final String xmlFilename = "src/test/resources/halfpixeltest/cliptest1ch.xml"; + SpimDataMinimal spimData = null; + try { + spimData = new XmlIoSpimDataMinimal().load( xmlFilename ); + } catch (SpimDataException e) { + e.printStackTrace(); + } + List< BvvStackSource< ? > > sources = BvvFunctions.show( spimData ); + sources.get( 0 ).setColor( new ARGBType(0x0000FF00) ); + BvvHandle handle = sources.get( 0 ).getBvvHandle(); + + //load simple stack + final ImagePlus imp = IJ.openImage( "src/test/resources/halfpixeltest/cliptest1ch.tif" ); + final Img< UnsignedShortType > img = ImageJFunctions.wrapShort( imp ); + final BvvStackSource< UnsignedShortType > source = BvvFunctions.show( img, "SimpleStack", Bvv.options().addTo( handle ) ); + source.setColor( new ARGBType(0x00FF0000) ); + } +} diff --git a/src/test/resources/halfpixeltest/cliptest1ch.h5 b/src/test/resources/halfpixeltest/cliptest1ch.h5 new file mode 100644 index 0000000000000000000000000000000000000000..62b5240771df57b1650ae06eb141fdab102fce95 GIT binary patch literal 17760 zcmeHO&1(}u6rau38f}$SJ*XE~C>RkWE%l=y)M_Ishz)K0I>l(WZ7?RaNkuPGJXJ4# zTvQM&c=0F-B6!e)NN?&vC|>Lzprt225UKO#z1PwyYibp>&6~9Qc4pq2+4=2n-)`Q% zTu!tdShaHFN(ChxR#hruc6l>J9gT16r8?t! z21oJuEXhobFT*{L8$?zV0*QEQ5*B=nRvjfdN<5>gN~haeQ?2RL@npO!omQ$Civ8oR4Nlz#z3_;Z@Q)ZEaENEdTg$iw8-1&NORn*|VUi*E(JEDPO+z+%K?27BQROew3rUSSS{mknKJ%5}h zo+gbV*!=wY<3TMd@;GEBqCya`{dbhsogjb6Fbw#`LT<2>E#!-)sW^DDJ9{o$mltRo7qx~)0h>?toBEW}e}A#CUo{7#=N+-|w-1G{*O+JbRCXQw9r#xM zp2d>!3PLAlDcJnu^Acn)?Sg78Xr|e3{ z#LfEl8!yf}SMFVXtcR2$2nYg#fFK|U2m=2Qf!~iuMohdB;`UW$9iG|#Bo4WEGp-jx zO%R7PW^?0^{iyYqw?T0I~CG{h#*Tsi~+K|l}?1Ox#=KoAfF78wGZ2W#h5 z)lz1FqgLoQ?P1lODP>X@`h8yBTKyDUtt(6-VpcvM=hZR~6R5V}Z4iGS(7dlHVWu2^lRNMbgue?u6^q(1h`*D> zA6^_+{}g{QFUg_oD5Zvpw>-YhV?GX%vk?gL15X-JZ>$MrIX^JA3-!bg%*MA;YC(SB z3-O0>IOXSZkg3Vn>F?ghY(H>~c+2D4Jm%vNIU50vGsg%xN9{HWj*AWWgEf5T3>_RV z+hK-&>zbmRXcI#B}R3_&adU}d}$=Fdh4yaqE z>w2HhwNaes2JRf-`?~#}T&CokXM8XXE6 zmZHc{!|qn9X~$FyU2ZteoUXdfWYv4f9zu*c_b6Y~NTct-M>TpVXROhVm>O@|adi$o zUU_vY21wwakKN z)k>zL7tKP&E@_r+m-V&0RW-DtS<}AaGC&z{y{iJ_(ovg zJuP;yGR({oDj%GhKD%AZ*B7>`SN!GpVZcD?P_IWctFYEJWecqhUyW#WZeO?A> z&(GO42R}I5F}{`wbqiS7rV!}T7O*%#!+rknaSer+UW>b=-qAi&_fJw^zI2!8sb4n+KboD|X1p;2 z!fxvbc6Z6rAm1tylns}$gKOlOz$9`gaz56XaT80hVNoisz2VMNi4n`~`+yONUnX;h zR)SJyv_#9{xCV8SWBB_e*}BP^B|KsNCf}*}f}+4*FJ^I6jnza;P6E%VYt&V@uT#(U zsumb4va-#n$;wh!+C1b5#%$Iy+!3X!pcAx$G>=v08JJ?b$^H#rM)2cKh5UYxzj|de zYkl>~|5cbDUfBn$ce>;3WIJ!2o$Nos?6MtaCx=+;>|{R;W;fSyc5+m<&Q8vUV0QBz zXV=>nJ2~%y*kwXLHIBcloM?-koZrFhI=`#*wZ%^EBf;!CzpKaz-}?Vf?pML=I=`#P zeX3P<-fc0MT}Zpi{@(tc+{E_xYH3gZUp~JNqWzfK3F~8upE6yMqx~8p+V_#8{TUwG z;m47q{S_YC_+Zp%2YW(9`zdm?qv4?)F(XGi5gyu8 + + . + + + cliptest1ch.h5 + + + + 0 + channel 1 + 4 2 10 + + micron + 1.0 1.0 1.0 + + + 1 + + + + + 1 + 1 + + + + + 0 + 0 + + + + + + 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 + + + +