Upload
andre-fiorot
View
218
Download
0
Embed Size (px)
Citation preview
7/25/2019 Minicurso Jai13 II
1/53
Uma Introduo Visualizao
Volumtrica para Diagnstico de LesesCerebrais
Mdulo II
Wu Shin [email protected]
FEEC - Unicamp
Clarissa Lin [email protected]
FCM - Unicamp
7/25/2019 Minicurso Jai13 II
2/53
2
Organizao do Minicurso
Protocolo de diagnstico de displasia cortical focal
Modelo matemtico de neuroimagens e tcnicas de
renderizao Tecnologia de renderizao: GPUs
Estado-de-arte de visualizao de neuroimagens Implementao de ferramentas de interao
7/25/2019 Minicurso Jai13 II
3/53
3
Tcnicas de Renderizao: MPR
Reformatao Multiplanar
7/25/2019 Minicurso Jai13 II
4/53
4
Tcnicas de Renderizao: Texturizao 3D
Proxy Geometry
Espao do objeto
Volume adquirido
Espao de textura
Imagem Final
7/25/2019 Minicurso Jai13 II
5/53
5
Renderizao Indireta
Fonte: Google imagel
Tcnicas de Renderizao: ISR
7/25/2019 Minicurso Jai13 II
6/53
6
Renderizao Direta
Direct Surface Rendering(DSR)
Direct Volume Rendering(DVR)
Tcnicas de Renderizao: DR
7/25/2019 Minicurso Jai13 II
7/53
7/25/2019 Minicurso Jai13 II
8/53
8
Composio das intensidades
intensidades cor e opacidade
Raycasting: DVR
7/25/2019 Minicurso Jai13 II
9/53
9
Organizao do Minicurso
Protocolo de diagnstico de displasia cortical focal
Modelo matemtico de neuroimagens e tcnicas de
renderizao Tecnologia de renderizao: GPUs
Estado-de-arte de visualizao de neuromagens Implementao de ferramentas de interao
7/25/2019 Minicurso Jai13 II
10/53
10
Unidades de Processamento Grfico(GPUs)
Processador dedicado para
renderizao em temporeal.
Onboard ou offboard. Trs maiores fabricantes:
nVidia, ATI e Intel
Fonte: http://www.tecmundo.com.br/hardware/1127-o-que-e-gpu-.htm
7/25/2019 Minicurso Jai13 II
11/53
11
CPU x GPU
CPU: arquitetura MISD ouMIMD
Paralelismo em tarefas
Prefetchde instrues
GPU: arquitetura SIMD
Paralelismo em dados
Prefetchde dados
Fonte:http://selkie.macalester.edu/csinparallel/modules/GPUProg
ramming/build/html/Introduction/Introduction.html
7/25/2019 Minicurso Jai13 II
12/53
12
CPU x GPU
http://www.flixxy.com/gpu-vs-cpu.htm
7/25/2019 Minicurso Jai13 II
13/53
13
Cooperao entre CPU e GPU
7/25/2019 Minicurso Jai13 II
14/53
14
GPUs Programveis
Arquitetura GeForce 3
Processadores de
vrtice e de fragmentodedicados
7/25/2019 Minicurso Jai13 II
15/53
15
GPUs: Unidades de Memria de Textura
Interpolaes, Filtragem dos objetos de textura
Barramento de 128 bits
7/25/2019 Minicurso Jai13 II
16/53
16
GPUs: Unidades de Sada (ROPs)
7/25/2019 Minicurso Jai13 II
17/53
17
GPUs Programveis Unificadas
Arquitetura Unificada: GeForce 8 Tesla e Fermi Kepler
Fonte: http://www.pgroup.com/lit/articles/insider/v2n1a5.htm
7/25/2019 Minicurso Jai13 II
18/53
18
Fluxos de Execuo
Streaming Multiprocessor (Grid) SIMT processors(Warps)Threads
Gridwarp
thread
http://www.cs.cmu.edu/afs/cs/academic/class/15869-f11/www/readings/lindholm08_tesla.pdf
7/25/2019 Minicurso Jai13 II
19/53
19
Hierarquia de Memria
7/25/2019 Minicurso Jai13 II
20/53
20
Espaos de Endereamento
DISTINTOS!
7/25/2019 Minicurso Jai13 II
21/53
21
GPUs Programveis: Sntese
Radeon HD 2900XT
Fonte: http://ixbtlabs.com/articles2/video/r600-part1.html
7/25/2019 Minicurso Jai13 II
22/53
22
Relembrando: Fluxo de Renderizao
7/25/2019 Minicurso Jai13 II
23/53
23
OpenGL API
Abstrao em um fluxo de renderizao
7/25/2019 Minicurso Jai13 II
24/53
24
Diretrizes
1. Deve-se minimizar e simplificar a sequncia deinstrues em um shader.
2. Deve-se maximizar a localidade espacial dos dados namemria de textura.
3. Deve-se evitar estruturas de dados complexas.
4. Deve-se instruir apropriadamente as GPUs paraotimizar o balano enre os processamentos e os
acessos s memrias.
7/25/2019 Minicurso Jai13 II
25/53
25
Linguagem de Programao Grfica
CPUs: OpenGL, Direct3D
Linguagem nativa: C
Interfaces com outras linguagens: Java, Python, Pascal, etc GPUs: shading language para renderizao em tempo real
ARB Assembly Language
GLSL: OpenGL Shader Language
HSLS: DirectX High-Level Shader Language
Cg: Cg Programming Language
7/25/2019 Minicurso Jai13 II
26/53
26
API OpenGL
Uma mquina de estados
Tipos de dados similares a linguagem C
Programabilidade Vertex shaders: a partir de OpenGL 1.5/2.0, transformaes
geomtricas, iluminao, coordenadas de textura
Fragment shaders: a partir de OpenGL 1.5/2.0, mapeamentode textura, fog
Geometry shaders: a partir de OpenGL 3.2
Tesselation shaders: a partir de OpenGL 4. Operao no modo imediato ou no modo retido
No gerencia recursos de janela
7/25/2019 Minicurso Jai13 II
27/53
27
Interface Grfica do Usurio (GUI)
glut
FLTKwxWidgetsQt
7/25/2019 Minicurso Jai13 II
28/53
28
Fluxo de Visualizao
7/25/2019 Minicurso Jai13 II
29/53
29
Ilustrando com um exemplo
Renderizar um volume de dados no formato DICOM?
7/25/2019 Minicurso Jai13 II
30/53
30
Renderizao: Verso de OpenGL >= 2.0
C++
std::cout
7/25/2019 Minicurso Jai13 II
31/53
31
Compilador de C e C++ livre: MinGW
http://www.mingw.org
Funcionalidades de OpenGL superior a 1.0: GLEW
http://glew.sourceforge.net/
em Windows
7/25/2019 Minicurso Jai13 II
32/53
32
Tcnica baseada em textura
Texturizar um cubo (proxy geometry) com o volume de dadosde interesse
Proxy Geometryem dimensesreais do paciente
Imagem Final
(0,0,0)
(1,0,0)(0,1,0)
(1,1,1)
Alinhamento dos doisespaos pelascoordenadas de textura
e coordenadasespaciais dos vrtices
Espao do objeto
Espao de textura
7/25/2019 Minicurso Jai13 II
33/53
33
Soluo 1: OpenGL 1.2
Normalize os valores das amostras:
data.buffer[mnimo,mximo] texbuffer[0,255]
Carregue o volume de dados na memria de texturaglBindTexture(GL_TEXTURE_3D, texID[0]);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, data.dims[0],
data.dims[1], data.dims[2], 0, GL_LUMINANCE,GL_UNSIGNED_BYTE, texbuffer);
Associe a cada vrtice coordenadas de textura
glTexCoord3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
f
7/25/2019 Minicurso Jai13 II
34/53
34
Interfaceamento com WM
Funes de glutglutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_SINGLE);
win = glutCreateWindow("Volume de Dados");
init();
glutPositionWindow(10, 10);
glutReshapeWindow(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
glutReshapeFunc(reshape);
glutDisplayFunc(desenheProxyGeometry);
glutKeyboardFunc(keyboard);
glutMainLoop();
I t K b d
7/25/2019 Minicurso Jai13 II
35/53
35
Interaes com Keyboard
void keyboard(unsigned char key, int x, int y) {switch (key) {
:
case '+':
if (nVolSideZ + 0.05 < 1.0) nVolSideZ += 0.05;
else nVolSideZ = 1.0;
break;
case '-':if (nVolSideZ - 0.05 > 0.0) nVolSideZ -= 0.05;
else nVolSideZ = 0.0; break;
case 27:
:
exit(0);
return;
} }
E t t I t
7/25/2019 Minicurso Jai13 II
36/53
36
Estrutura Interna
glTexCoord3f(0.0, 1.0, 0.0);
glVertex3f(0.0, nVolSides[1], 0.0);
:
glTexCoord3f(0.0, 1.0, nVolSideZ);
glVertex3f(0.0, nVolSides[1],nVolSideZ*nVolSides[2]);
:
glTexCoord3f(1.0, 1.0, nVolSideZ);glVertex3f(nVolSides[0],
nVolSides[1],nVolSideZ*nVolSides[2]);
(0.1.0)
(0.1.1)
(1.1.0)
(1.1.1)
(1.0.1)
(1.0.0)
(0.0.1)
(1.0.0.5)
(1.1.0.5)
(0.1.0.5)
Fl d Vi li I t ti
7/25/2019 Minicurso Jai13 II
37/53
37
Fluxo de Visualizao Interativa
7/25/2019 Minicurso Jai13 II
38/53
38
Demo jai13_basic
7/25/2019 Minicurso Jai13 II
39/53
7/25/2019 Minicurso Jai13 II
40/53
7/25/2019 Minicurso Jai13 II
41/53
41
Demo jai13_basic_cor
Soluo 3: Funo de Transferncia
7/25/2019 Minicurso Jai13 II
42/53
42
Soluo 3: Funo de Transferncia
Como tornar mais modulvel o mapeamento?
Funo de Transferncia 1D
Funes de Transferncia
7/25/2019 Minicurso Jai13 II
43/53
43
Funes de Transferncia
Soluo 3: OpenGL 1 2
7/25/2019 Minicurso Jai13 II
44/53
44
Soluo 3: OpenGL 1.2
tfunc.GetGrayScaleTF (1, data.umin, data.umax, &dim, &tf);
intensidade = (int)((reinterpret_cast(data.buffer))[iz*data.dims[0]*data.dims[1]+iy*data.dims[0]+ix]);
texbuffer[di++] = (unsigned char)(tf[intensidade-data.umin+1]*2);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, data.dims[0],
data.dims[1], data.dims[2], 0, GL_LUMINANCE,
GL_UNSIGNED_BYTE, texbuffer);
7/25/2019 Minicurso Jai13 II
45/53
45
Demo jai13_basic_ft
Problema
7/25/2019 Minicurso Jai13 II
46/53
46
Problema
Quantidade de instrues a serem transferidas
para a GPU no momento de renderizao crescecom a quantidade de primitivas grficas.
Soluo 4: OpenGL 1.2
7/25/2019 Minicurso Jai13 II
47/53
47
Soluo 4: OpenGL 1.2
Compacte um conjunto dos dados de vrtices emarranjos em CPU
glEnableClientState (GL_VERTEX_ARRAY);
glVertexPointer (3, GL_FLOAT, 0, vertices); // coord.compactadamente armazenadas
glEnableClientState (GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer (3, GL_FLOAT, 0, texCoords0); // coord.compactamente armazenadas
Desreferenci-los no momento de transferncia paraGPU (renderizao)glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE,
quadIndices);
7/25/2019 Minicurso Jai13 II
48/53
48
Demo jai13_varray
Problema
7/25/2019 Minicurso Jai13 II
49/53
49
Quantidade de dados a serem transferidos para a
GPU no momento de renderizao continuagrande.
Problema
Soluo 5: OpenGL 1.4
7/25/2019 Minicurso Jai13 II
50/53
50
Soluo 5: OpenGL 1.4
Aloque dados em GPUs: vertex buffer objectsglBindBuffer(GL_ARRAY_BUFFER, vbo[0]);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords0), texCoords0,GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quadIndices), quadIndices,
GL_STATIC_DRAW); Especifique o local dos dados em GPUs
glVertexPointer (3, GL_FLOAT, 0, (const GLvoid *)0);
glTexCoordPointer (3, GL_FLOAT, 0, (const GLvoid *)0);
RenderizeglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[2]);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, (const GLvoid *)0);
7/25/2019 Minicurso Jai13 II
51/53
51
Demo jai13_buffer
OpenGL 1.4: Problema
7/25/2019 Minicurso Jai13 II
52/53
52
Estruturas internas s podem ser visualizadas em
em cortes planares.
p
Organizao do Minicurso
7/25/2019 Minicurso Jai13 II
53/53
53
g
Protocolo de diagnstico de displasia cortical focal
Modelo matemtico de neuroimagens e tcnicas de
renderizao Tecnologia de renderizao: GPUs
Estado-de-arte de visualizao de neuromagens
Implementao de ferramentas de interao