290 likes | 393 Views
Térfogatvizualizáció. Szirmay-Kalos László. Térfogati modellek. hőmérséklet sűrűség légnyomás potenciál anyagfeszültség. v(x,y,z). v(x,y,z). tárolás: 3D tömb. Térfogati modell megjelenítése. Megjelenítés átlátszó anyagként (belsejébe belelátunk)
E N D
Térfogatvizualizáció Szirmay-Kalos László
Térfogati modellek hőmérséklet sűrűség légnyomás potenciál anyagfeszültség ... v(x,y,z) v(x,y,z) tárolás: 3D tömb
Térfogati modell megjelenítése • Megjelenítés átlátszó anyagként (belsejébe belelátunk) • Adott szintfelület kiemelése (külsôt lehámozzuk)
Átlátszó anyagok L(s + ds) L(s) dL(s)/ds = - kt · L(s) + ka · Le + f(‘,) Li(‘)d‘ L(s + s) L(s) L(s + s) = L(s) - kt s · L(s) + Li(s) s (s) C(s)
Számítás fénysugárkövetéssel L(s + s) = (1- (s)) · L(s) + C(s) L(s) s=0 L = 0 for(s = 0; s < T; s += s) { L = (1- (s)) · L + C(s) }
Számítás láthatóság sugárkövetéssel L*(s) (s) L*(s-s)=L*(s)+(1- (s)) · C(s) (s-s)=((s)) · ((s)) L* = 0 for( s = T; s >0 ; s -= s ) { L* += (1- ) · C(s) (1- ) · ((s)) if (break }
Térfogat vetítés L(s) L(s + s) = (1- (s)) · L(s) + C(s) OpenGL blending
Voxel szín és opacitás: Transfer functions: (C,)=T(v függv) • Röntgen: (C,)=T(v(x,y,z)) • opacitás = v(x,y,z) • C(0) = 1, egyébként 0 • Klasszikus árnyalási modellek • opacitás: v osztályozása • C = árnyalási modell (diffúz + Phong) • normál = grad v • opacitás *= | grad v | • Magasabb rendű derivált (görbület) • Transzlucens anyagok (subsurface scattering)
Transzlucens megjelenítés Felező vektor
Marching cubes v(x,y,z) > szint v(x,y,z) < szint
Masírozó kockák Szintérték = 110 Szintérték = 60
Isosurface ray casting normal = grad v v(x,y,z) > isovalue
GPU ray-casting right up lookat eye p q entry p = lookat + right + up , are in [-1,1] exit Unit cube with 3D texture
Isosurface ray-casting Full screen quad For each pixel Find pixel center p raydir = normalize(p – eye); Find exit and entry for(t = entry; t < exit; t+=dt) { q = eye + raydir * t; if (volume[q] > isovalue) break; } normal vector estimation; illumination } Interpolation from the corners Clipping central differences
GPU Isosurface ray-casting volume eye, isolevel, material/light properties Ray casting Pixel shader CPU program Vertex shader Rasterization Interpolation Vertices of the window quad ray/window hpos=fullscreen textcoords Volume
CPU program - OpenGL display void Display( ) { // PASS: non uniform parameters glBegin( GL_QUADS ); Vector p = lookat - Right + Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(-1, 1, 0); p = lookat - Right - Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(-1, -1, 0); p = lookat + Right - Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(1, -1, 0); p = lookat + Right + Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(1, 1, 0); glEnd(); }
Ray casting: vertexshader voidVertexShader( in float4 hPosIn : POSITION, in float3 wPosIn : TEXCOORD0, out float4 hPosOut : POSITION, out float3 wPosOut : TEXCOORD0 ) { hPosOut =hPosIn; wPosOut = wPosIn; }
Ray casting: fragment shader void FragmentShader( in float3 p : TEXCOORD0, uniform float3 eye, uniform sampler3D volume, uniform float isolevel, uniform float3 lightdir, lightint, kd out float3color : COLOR ) { float3 raydir = normalize(p – eye); float2 inUnitCube = Intersect(eye, raydir); float entry = inUnitCube.x, exit = inUnitCube.y; float dt = (exit – entry) / STEPS; bool found = false; float3 q; for(t= entry; t < exit; t += dt) { if ( !found ) { q = eye + raydir * t; if (tex3D(volume, q).r > isolevel) found = true; } }
Ray castingfragment shader cont’d color = float3(0, 0, 0); // background color if ( found ) { float3 normal; normal.x = tex3d(volume, q + float3(1/RES,0,0)) – tex3d(volume, q - float3(1/RES,0,0)); normal.y = tex3d(volume, q + float3(0,1/RES,0)) – tex3d(volume, q - float3(0,1/RES,0)); normal.z = tex3d(volume, q + float3(0,0,1/RES)) – tex3d(volume, q - float3(0,0,1/RES)); normal = normalize( normal ); color = lightint * kd * saturate(dot(lightdir, normal)); } }