From 34b2e6346f4c89c3d272502a1cb11cb45b71b387 Mon Sep 17 00:00:00 2001 From: Forrest Date: Wed, 13 Sep 2023 15:23:05 -0400 Subject: [PATCH 1/3] fix(OpenGLTexture): use 32 bit format when needed Scalars that cannot be represented accurately with half-float should be rendered with a full float format. useHalfFloat tells use whether the scalars can be accurately represented in half-float. OES_texture_float_linear is needed to filter 32 bit internal formats. --- Sources/Rendering/OpenGL/RenderWindow/index.js | 14 ++++++++++---- Sources/Rendering/OpenGL/Texture/index.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Sources/Rendering/OpenGL/RenderWindow/index.js b/Sources/Rendering/OpenGL/RenderWindow/index.js index 13c5b3dc13a..a0af331fc8c 100644 --- a/Sources/Rendering/OpenGL/RenderWindow/index.js +++ b/Sources/Rendering/OpenGL/RenderWindow/index.js @@ -381,18 +381,24 @@ function vtkOpenGLRenderWindow(publicAPI, model) { default: return oglNorm16Ext.RGBA16_SNORM_EXT; } + case VtkDataTypes.UNSIGNED_SHORT: + case VtkDataTypes.SHORT: case VtkDataTypes.FLOAT: default: + // useHalfFloat tells us if the texture can be accurately + // rendered with 16 bits or not. switch (numComps) { case 1: - return model.context.R16F; + return useHalfFloat ? model.context.R16F : model.context.R32F; case 2: - return model.context.RG16F; + return useHalfFloat ? model.context.RG16F : model.context.RG32F; case 3: - return model.context.RGB16F; + return useHalfFloat ? model.context.RGB16F : model.context.RGB32F; case 4: default: - return model.context.RGBA16F; + return useHalfFloat + ? model.context.RGBA16F + : model.context.RGBA32F; } } } diff --git a/Sources/Rendering/OpenGL/Texture/index.js b/Sources/Rendering/OpenGL/Texture/index.js index e6e4a06b716..cf1b0db2e5d 100644 --- a/Sources/Rendering/OpenGL/Texture/index.js +++ b/Sources/Rendering/OpenGL/Texture/index.js @@ -365,6 +365,20 @@ function vtkOpenGLTexture(publicAPI, model) { ); } + if ( + [ + model.context.R32F, + model.context.RG32F, + model.context.RGB32F, + model.context.RGBA32F, + ].includes(model.internalFormat) && + !model.context.getExtension('OES_texture_float_linear') + ) { + vtkWarningMacro( + 'Failed to load OES_texture_float_linear. Texture filtering is not available for *32F internal formats.' + ); + } + return model.internalFormat; }; From 091d616daf5cace127b311b09d3030c8bbf8c1d4 Mon Sep 17 00:00:00 2001 From: Forrest Date: Wed, 13 Sep 2023 15:29:58 -0400 Subject: [PATCH 2/3] test: add large scalar test for images Co-authored-by: Scott Wittenburg --- .../ImageMapper/test/testLargeScalarImage.js | 116 +++++++++++++++ .../ImageMapper/test/testLargeScalarImage.png | Bin 0 -> 10919 bytes .../test/testLargeScalarVolume.js | 136 ++++++++++++++++++ .../VolumeMapper/test/testLargeScalars.png | Bin 0 -> 74668 bytes 4 files changed, 252 insertions(+) create mode 100644 Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js create mode 100644 Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.png create mode 100644 Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js create mode 100644 Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalars.png diff --git a/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js b/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js new file mode 100644 index 00000000000..5489de64cfc --- /dev/null +++ b/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.js @@ -0,0 +1,116 @@ +import test from 'tape'; +import testUtils from 'vtk.js/Sources/Testing/testUtils'; + +import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransferFunction'; +import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray'; +import vtkImageData from 'vtk.js/Sources/Common/DataModel/ImageData'; +import vtkOpenGLRenderWindow from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow'; +import vtkPiecewiseFunction from 'vtk.js/Sources/Common/DataModel/PiecewiseFunction'; +import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow'; +import vtkRenderWindowInteractor from 'vtk.js/Sources/Rendering/Core/RenderWindowInteractor'; +import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer'; +import vtkImageMapper from 'vtk.js/Sources/Rendering/Core/ImageMapper'; +import vtkImageSlice from 'vtk.js/Sources/Rendering/Core/ImageSlice'; +import Constants from 'vtk.js/Sources/Rendering/Core/ImageMapper/Constants'; + +import baseline1 from './testLargeScalarImage.png'; + +const { SlicingMode } = Constants; + +test.onlyIfWebGL('Test Volume Rendering of Large Scalar Values', (t) => { + const gc = testUtils.createGarbageCollector(t); + t.ok('rendering', 'vtkOpenGLVolumeMapper LargeScalars'); + + // DOM elements + const container = document.querySelector('body'); + const renderWindowContainer = gc.registerDOMElement( + document.createElement('div') + ); + container.appendChild(renderWindowContainer); + + // create what we will view + const renderWindow = gc.registerResource(vtkRenderWindow.newInstance()); + const renderer = gc.registerResource(vtkRenderer.newInstance()); + renderWindow.addRenderer(renderer); + renderer.setBackground(0.32, 0.34, 0.43); + + const actor = gc.registerResource(vtkImageSlice.newInstance()); + + const mapper = gc.registerResource(vtkImageMapper.newInstance()); + actor.setMapper(mapper); + + // create a synthetic slice + const id = vtkImageData.newInstance(); + id.setExtent(0, 9, 0, 9, 0, 0); + + // some (u)int16 values that exceed half float precision + const largeScalarData = new Uint16Array(10 * 10); + let max = -Infinity; + let min = Infinity; + for ( + let i = 0, value = 2 ** 16 - 1; + i < largeScalarData.length; + i++, value-- + ) { + largeScalarData[i] = value; + max = Math.max(max, value); + min = Math.min(min, value); + } + + const da = vtkDataArray.newInstance({ + numberOfComponents: 1, + values: largeScalarData, + }); + da.setName('scalars'); + + const cpd = id.getPointData(); + cpd.setScalars(da); + + mapper.setInputData(id); + mapper.setSliceAtFocalPoint(true); + mapper.setSlicingMode(SlicingMode.Z); + + // create transfer function, and piecewise function + const rgb = vtkColorTransferFunction.newInstance(); + rgb.addRGBPoint(min, 0, 0, 0); + rgb.addRGBPoint(max, 1, 1, 1); + + const ofun = vtkPiecewiseFunction.newInstance(); + ofun.addPoint(0, 1); + ofun.addPoint(max, 1); + + actor.getProperty().setRGBTransferFunction(rgb); + actor.getProperty().setPiecewiseFunction(ofun); + actor.getProperty().setUseLookupTableScalarRange(true); + actor.setMapper(mapper); + + // create renderwindow + const glwindow = gc.registerResource(vtkOpenGLRenderWindow.newInstance()); + glwindow.setContainer(renderWindowContainer); + renderWindow.addView(glwindow); + glwindow.setSize(400, 400); + + // Interactor + const interactor = vtkRenderWindowInteractor.newInstance(); + interactor.setStillUpdateRate(0.01); + interactor.setView(glwindow); + interactor.initialize(); + interactor.bindEvents(renderWindowContainer); + + renderer.addActor(actor); + renderer.resetCamera(); + renderer.resetCameraClippingRange(); + renderer.getActiveCamera().setParallelProjection(true); + + glwindow.captureNextImage().then((image) => { + testUtils.compareImages( + image, + [baseline1], + 'Rendering/OpenGL/ImageMapper/testLargeScalarsImage', + t, + 1.5, + gc.releaseResources + ); + }); + renderWindow.render(); +}); diff --git a/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.png b/Sources/Rendering/OpenGL/ImageMapper/test/testLargeScalarImage.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd19bde954928cb05a36f9d2cc85cc79f588c84 GIT binary patch literal 10919 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 literal 0 HcmV?d00001 diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js b/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js new file mode 100644 index 00000000000..0a729ca02fa --- /dev/null +++ b/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalarVolume.js @@ -0,0 +1,136 @@ +import test from 'tape'; +import testUtils from 'vtk.js/Sources/Testing/testUtils'; + +import vtkColorTransferFunction from 'vtk.js/Sources/Rendering/Core/ColorTransferFunction'; +import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray'; +import vtkImageData from 'vtk.js/Sources/Common/DataModel/ImageData'; +import vtkOpenGLRenderWindow from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow'; +import vtkPiecewiseFunction from 'vtk.js/Sources/Common/DataModel/PiecewiseFunction'; +import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow'; +import vtkRenderWindowInteractor from 'vtk.js/Sources/Rendering/Core/RenderWindowInteractor'; +import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer'; +import vtkVolume from 'vtk.js/Sources/Rendering/Core/Volume'; +import vtkVolumeMapper from 'vtk.js/Sources/Rendering/Core/VolumeMapper'; + +import baseline1 from './testLargeScalars.png'; + +test.onlyIfWebGL('Test Volume Rendering of Large Scalar Values', (t) => { + const gc = testUtils.createGarbageCollector(t); + t.ok('rendering', 'vtkOpenGLVolumeMapper LargeScalars'); + // testUtils.keepDOM(); + + // Create some control UI + const container = document.querySelector('body'); + const renderWindowContainer = gc.registerDOMElement( + document.createElement('div') + ); + container.appendChild(renderWindowContainer); + + // create what we will view + const renderWindow = gc.registerResource(vtkRenderWindow.newInstance()); + const renderer = gc.registerResource(vtkRenderer.newInstance()); + renderWindow.addRenderer(renderer); + renderer.setBackground(0.32, 0.34, 0.43); + + const actor = gc.registerResource(vtkVolume.newInstance()); + + const mapper = gc.registerResource(vtkVolumeMapper.newInstance()); + mapper.setSampleDistance(0.7); + actor.setMapper(mapper); + + // create a synthetic volume + const id = vtkImageData.newInstance(); + id.setExtent(0, 99, 0, 99, 0, 99); + + const floatData = new Float32Array(100 * 100 * 100); + + actor.getProperty().setComponentWeight(0, 1.0); + actor.getProperty().setIndependentComponents(true); + + const scaleFactor = 10000.0; + + const baseValue = 40.0 * scaleFactor; + const xOffset = 3.0; + const xDiv = 20.0; + const yDiv = 10.0; + const zDiv = 5.0; + + const radius = 45; + + let i = 0; + for (let z = 0; z <= 99; z++) { + for (let y = 0; y <= 99; y++) { + for (let x = 0; x <= 99; x++) { + const dist = Math.sqrt((x - 50) ** 2 + (y - 50) ** 2 + (z - 50) ** 2); + if (dist < radius) { + floatData[i] = + baseValue * + (xOffset + + Math.cos(x / xDiv) + + Math.cos(y / yDiv) + + Math.cos(z / zDiv)); + } else { + floatData[i] = 0.0; + } + i += 1; + } + } + } + + const da = vtkDataArray.newInstance({ + numberOfComponents: 1, + values: floatData, + }); + da.setName('scalars'); + + const dataRange = da.getRange(0); + console.log(`Scalar data range: ${dataRange}`); + + const cpd = id.getPointData(); + cpd.setScalars(da); + + mapper.setInputData(id); + + // create color and opacity transfer functions + const ctfun = vtkColorTransferFunction.newInstance(); + ctfun.addRGBPoint(0, 0.0, 0.5, 1.0); + ctfun.addRGBPoint(255.0 * scaleFactor, 1.0, 1.0, 0.0); + const ofun = vtkPiecewiseFunction.newInstance(); + ofun.addPoint(0.0, 0.0); + ofun.addPoint(250.0 * scaleFactor, 0.2); + actor.getProperty().setRGBTransferFunction(0, ctfun); + actor.getProperty().setScalarOpacity(0, ofun); + actor.getProperty().setScalarOpacityUnitDistance(0, 3.0); + actor.getProperty().setComponentWeight(0, 1.0); + + // now create something to view it, in this case webgl + const glwindow = gc.registerResource(vtkOpenGLRenderWindow.newInstance()); + glwindow.setContainer(renderWindowContainer); + renderWindow.addView(glwindow); + glwindow.setSize(400, 400); + + // Interactor + const interactor = vtkRenderWindowInteractor.newInstance(); + interactor.setStillUpdateRate(0.01); + interactor.setView(glwindow); + interactor.initialize(); + interactor.bindEvents(renderWindowContainer); + + renderer.addVolume(actor); + renderer.resetCamera(); + renderer.getActiveCamera().zoom(1.5); + renderer.getActiveCamera().elevation(70); + renderer.resetCameraClippingRange(); + + glwindow.captureNextImage().then((image) => { + testUtils.compareImages( + image, + [baseline1], + 'Rendering/OpenGL/VolumeMapper/testLargeScalarsVolume', + t, + 1.5, + gc.releaseResources + ); + }); + renderWindow.render(); +}); diff --git a/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalars.png b/Sources/Rendering/OpenGL/VolumeMapper/test/testLargeScalars.png new file mode 100644 index 0000000000000000000000000000000000000000..197c9b5d05d76927257adb7bafc6c78f407c78ec GIT binary patch literal 74668 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

(KK*F z9;l9fgQH&T5f!X z7bG?*#@u#oI+e96W<(r}Hg@)ci@lKACx<;bojF4dvD|Jh0!@Y=Dk}8KihrIO{87|A zHgKn*Z8tFqF-VEJ&F()Mzxne z3N_W`rG4e6W)n|hL1+yu1|PwV-LpZL{F5{qKL6}{lX$w1&bQlVhkmCGL|3B5%{>eh zk3h2XUa@=?DyFVHT@w*G;GeOde0|=V+74x}007wd8c;<8oP=eUGssej{5#`ynxd`$(A})t# z9PiA|5zy5_v?`f4B&~K)unYwN-W~dO!4>RSwUbRSZI_qJDioD=nBVg zAKah1v34kgGgpM$G4e3Q-aX@|?hqt4An#;VX^%cW3pRXP`Zv&3vdX*ep}ot}8NhV_ zn!%{%zdfLTOFk>2{0hY5SXulEfCU#Nf&b$AF1i2EcE?GjYn-ANZ|3?)whXHCA!Yuwva|jMJdq87>+m=)R zqb@v*b%bN{zgU6z@6-bdJdi%j{2z7X;S+WdW1)UX1De_7J)pnuSN-PxM|Eig0PX4s xoBvB2$NE?Qfb#y0wtoE|_5Z)(|C=h_kVWmjArCA`-2gm18Y;TbN+p|+{{yh`XkGvS literal 0 HcmV?d00001 From ce2b9bf9bf7dabd7fe46b85663bf93ab82d942ef Mon Sep 17 00:00:00 2001 From: Forrest Date: Wed, 13 Sep 2023 15:31:19 -0400 Subject: [PATCH 3/3] fix(ImageMapper): use norm16 ext This keeps the ImageMapper in-line with the VolumeMapper. --- Sources/Rendering/OpenGL/ImageMapper/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/Rendering/OpenGL/ImageMapper/index.js b/Sources/Rendering/OpenGL/ImageMapper/index.js index f4210a0a200..4469ec7d704 100644 --- a/Sources/Rendering/OpenGL/ImageMapper/index.js +++ b/Sources/Rendering/OpenGL/ImageMapper/index.js @@ -1143,6 +1143,10 @@ function vtkOpenGLImageMapper(publicAPI, model) { }); model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow); } + // Use norm16 for scalar texture if the extension is available + model.openGLTexture.setOglNorm16Ext( + model.context.getExtension('EXT_texture_norm16') + ); if (iType === InterpolationType.NEAREST) { if ( new Set([1, 3, 4]).has(numComp) &&