Upload
meriel
View
15
Download
1
Embed Size (px)
DESCRIPTION
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) - PowerPoint PPT Presentation
Citation preview
TérfogatvizualizációTérfogatvizualizáció
Szirmay-Kalos László
Térfogati modellekTérfogati modellek
v(x,y,z)
hőmérsékletsűrűséglégnyomáspotenciálanyagfeszültség...
v(x,y,z)
tárolás: 3D tömb
Térfogati modell megjelenítéseTé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Á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
C(s)(s)
Fényemittáló, fényelnyelő anyagFényemittáló, fényelnyelő anyag
Számítás fénysugárkövetésselSzámítás fénysugárkövetéssel
L = 0for(s = 0; s < T; s += s) {
L = (1- (s)) · L + C(s)}
L(s)
L(s + s) = (1- (s)) · L(s) + C(s)
s=0
Számítás láthatóság Számítás láthatóság sugárkövetésselsugárkövetéssel
L* = 0for( s = T; s >0 ; s -= s ) {
L* += (1- ) · C(s) (1- ) · ((s))if (break
}
L*(s)
(s) L*(s-s)=L*(s)+(1- (s)) · C(s)(s-s)=((s)) · ((s))
Térfogat vetítésTérfogat vetítés
L(s)
L(s + s) = (1- (s)) · L(s) + C(s) OpenGL blending
Voxel szín és opacitás: Voxel szín és opacitás: Transfer functions: (Transfer functions: (C,C,)=T()=T(vv függv) 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)
((C,C,) = T() = T(vv((x,y,zx,y,z))))
Maximum intenzitás vetítésMaximum intenzitás vetítés
PhongPhong
Illusztratív vizualizációIllusztratív vizualizáció
Illusztratív vizualizációIllusztratív vizualizáció
Transzlucens megjelenítésTranszlucens megjelenítés
Felező vektor
Transzlucens megjelenítésTranszlucens megjelenítés
SzintvonalSzintvonal
SzintfelületSzintfelület
Marching cubesMarching cubes
v(x,y,z) < szint
v(x,y,z) > szint
Masírozó kockákMasírozó kockák
Szintérték = 110 Szintérték = 60
Isosurface ray castingIsosurface ray casting
v(x,y,z) > isovalue
normal = grad v
GPU ray-castingGPU ray-casting
Unit cube with 3D texture
eyelookat
rightup
p = lookat + right + up
, are in [-1,1]
pqentry
exit
Isosurface ray-castingIsosurface ray-casting
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}
Full screen quadInterpolation from the corners
central differences
Clipping
GPU GPU Isosurface ray-castingIsosurface ray-casting
CPU program
Vertex shader
Pixelshader
Verticesof thewindow quad
hpos=fullscreentextcoords
volumeeye, isolevel, material/light properties
RasterizationInterpolation
Volume
ray/window
Ray casting
CPU program - OpenGL displayCPU 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 castingRay casting: vertex: vertex shadershader
void VertexShader( in float4 hPosIn : POSITION, in float3 wPosIn : TEXCOORD0,
out float4 hPosOut : POSITION, out float3 wPosOut : TEXCOORD0 ) {
hPosOut = hPosIn; wPosOut = wPosIn;}
Ray castingRay casting: : fragment shaderfragment shadervoid FragmentShader( in float3 p : TEXCOORD0,
uniform float3 eye, uniform sampler3D volume, uniform float isolevel, uniform float3 lightdir, lightint, kd out float3 color : 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 castingRay casting fragment shader cont’dfragment 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)); }}
VideoVideo