Reikastingアルゴリズムを使用した等値面レンダリング

この記事では、等値面レンダリングまたは等値面レンダリングについて説明します。



作業中は、常に英語またはドイツ語のドキュメントのみを使用しています。 したがって、テキストでは、用語の英語版をよく使用します。



それで、 等値面とは何ですか -ウィキペディアが言うように、これは等高線の3次元バージョンです。 言葉で言えば、これは完全に明確ではないかもしれません-写真をよく見てみましょう。



画像画像



これらの画像は、さまざまな値の「測定量」である密度を示しています。 最初の値は2番目の値よりも小さいです。



簡単な理論から始めます。



私は医療画像の処理に携わっています。 医療機器から取得したデータには、主に8ビット(256階調)から16ビット(65,536階調の灰色)のいわゆる生またはグレースケール画像が含まれています。 実際には16ビットが多いため、省略バージョンがよく使用されます。12ビット、つまり上位バイトの一部が使用されると、4096階調のグレーが得られます。

さらに、グレー画像を色に変換するには、いわゆるLUT-ルックアップテーブルを使用できます。 このテーブルは行のコレクションであり、各行にはRGBA値が含まれています。 12ビットの場合、このテーブルには4096行が含まれます。 また、たとえば542の値を持つボクセルに出会うと、このテーブルの542行からそれぞれそこに示されているRGBA値を取得します。

これらの表は、密度値をRGBAと相関させる方法を知っている資格のある医師/エンジニアによって編集されています。 アルファチャネル、つまり透明度を使用すると、テーブルを作成できます。テーブルを使用すると、ボーンのみ、または静脈のみ、または動脈のみを表示でき、残りは透明になります。 つまり、同じオブジェクトの新しい表示を取得するたびに、LUTをオンザフライで変更します。



画像データをレンダリングする主な方法は、 ボリュームレイキャスティング (ロシア語- ボリュームレンダリングに似たもの)です。 ここではあまり詳しく説明しません。 しかし、アイソサーフェスをレンダリングするプロセスを理解するには、彼の仕事を理解することが重要です。



レイキャスティングアルゴリズムは、オブジェクトに光線を浸透させることです。 光線は目(カメラ)から出て、画面のすべてのポイント(ピクセルごと)を通過し、特定のボクセルでオブジェクトと交差します(交差がある場合)。 ビームはこれで停止しませんが、さらにボクセルを横切り、特定の方法で各ポイントからの情報を蓄積し続けます。 ビームを停止する基準はいくつかありますが、最も一般的なのは、累積値のアルファが1に近い場合(実際には値a> 0.95が使用される場合)、または、たとえば、画像の境界を超える場合です。 つまり、本質的に、トレース中に、透明なボクセルを破棄し、特定の方法で半透明の値を累積します。不透明なためビームが通過しない固体オブジェクトに到達します。 結果の値は、画面でのレンダリングに使用されます。



メイントピックに戻って、アイソサーフェスのレンダリングは主にブレークポイントが異なると言いたいです。 この場合、最初に設定された密度値以上の値を持つボクセルを見つけるとすぐに、現在のレイのレイキャスティングを停止し、次のレイに進みます。 値はすべてのポイントで等しくなければならないため、通常、すべての等値面は同じ色でペイントされます。 1つの値-それぞれ1つの色。



このアルゴリズムはCPUに実装できます(原則として、最初の実装はそれだけでした)が、動作は非常に遅くなります。 フラグメントシェーダーGLSL )を使用すると、GPU上のすべてがはるかに高速に処理されます。 境界値、色、通過速度など、必要なパラメーターが外部に送信されます。 以下は、等値面をレンダリングする最も単純なフラグメントシェーダーのコードです。 前または後のすべてのボクセルは等値面にとって重要ではないため、これは値の累積ではなく、1つの色境界値isoColorのみが使用されます。



  1. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  2. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  3. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  4. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  5. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  6. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  7. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  8. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  9. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  10. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  11. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  12. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  13. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  14. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  15. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  16. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  17. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  18. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  19. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  20. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  21. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  22. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  23. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  24. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  25. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  26. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  27. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  28. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  29. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  30. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  31. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  32. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  33. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  34. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  35. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  36. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  37. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  38. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  39. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }



  40. uniform sampler3D volume ; uniform float sampleRate ; uniform float isoValue ; uniform vec4 isoColor ; varying vec4 texCoord0 ; void main ( ) { floast steps = 1.0 / sampleRate ; vec4 outputColor = vec4 ( 0 ., 0 ., 0 ., 0 . ) ; float isoThr ; // get ray position and ray direction vec4 vPosition = gl_ModelViewMatrixInverse [ 3 ] ; vec3 rayPosition = texCoord0 . xyz ; vec3 vecDif = rayPosition - vPosition . xyz ; vec3 rayDirection = sampleRate * normalize ( vecDif ) ; // for all samples along the ray while ( steps ) { steps --; // get trilinear interpolated value from 3d texture float value = texture3D ( volume , rayPosition ) ; isoThr = value - isoValue ; // check if we get isosurface line if ( isoThr < 0 ) { // march to the next sample rayPosition = rayPosition + rayDirection ; // get next density continue ; } // else we do color transformation outputColor = isoColor ; outputColor . rgb = outputColor . rgb * outputColor . a ; #ifdef SHADER // do shading #endif break ; } gl_FragColor . rgba = outputColor ; }





______________________

テキストは©SoftCoder.ruによってブログエディターで作成されます。


レイキャスティングの主なパラメーターの1つはトレースステップです。これは、ビームがオブジェクトを通過する速度です。 次元X * Y * Zの立方体をレンダリングする場合、理想的な速度は1 / MAX(X、Y、Z)です。 つまり、何も見逃さないように、成長は1ボクセル以下でなければなりません。 ただし、一方で、パフォーマンスに影響を与えるような詳細レベルは、多くの場合必要ありません。



画像画像



提示された画像には、異なるsampleRateでレンダリングされた画像があります。 最初のケースでは、同じ完全な1 / MAX(X、Y、Z)が使用されました-単一のボクセルを逃しなかったため、画像は目に見える遷移なしで滑らかであることが判明しました! FPSは1秒あたりわずか13フレームです。

2番目のオプションでは、sampleRateを2倍使用しました-つまり、2番目のボクセルごとに処理し、同時に、等値面の最初のボクセルの位置の計算エラーにより形成された円がすでに表示されています。 しかし、同時にFPSは37フレームに増加しました。

アルゴリズムの通過速度を上げ、同時に品質を失わないようにする方法については、次の記事で検討してみます。



All Articles