Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Universidade Estadual de Campinas – Unicamp
Faculdade de Engenharia Elétrica e de Computação – Feec
PROJETO IA369EVISUALIZAÇÃO VOLUMÉTRICA INTERATIVA
Rodrigo Mologni Gonçalves dos Santos
Rafael Guimarães Ramos
Tópicos em Engenharia da Computação (IA369E)
Docente: Prof.ª Wu, Shin-Ting
2º semestre de 2011
PROJETO IA369E
R. M. G. Santos | R. G. Ramos
PROPOSTA DE TRABALHO
Implementar as seguintes técnicas de visualização de dados volumétricos:
1. Algoritmo de voxelização baseado em buffer de profundidade;
2. Renderização volumétrica baseada em textura 2D: fatias alinhadas ao eixo;
3. Renderização volumétrica baseada em textura 3D: fatias alinhadas ao eixo;
4. Esquemas de composição e correção de opacidade;
5. Tabela de cores: função de transferência pré-interpolativa;
6. Iluminação volumétrica local: iluminação Lambertiana em tempo de execução;
7. Recorte volumétrico baseado em superfícies;
8. Lançamento de raio por espaçamento constante para grades uniformes;
9. Renderização estereoscópica 3D em OpenGL.
PROJETO IA369E
AMBIENTE DE DESENVOLVIMENTO
O ambiente de desenvolvimento é composto pelas seguintes ferramentas:
• Eclipse IDE 3.7.1;
• PyDev 2.2.4;
• Python 2.6.6;
• PyQt 4.8.6;
• PyOpenGL 3.0.1;
• PyQGLViewer 0.9.1;
• NumPy 1.6.1.
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Algoritmo de Voxelização Baseado em Buffer de Profundidade
Algoritmo de Karabassi et al. (1999) para
voxelização de objeto geométrico 3D a
partir de 6 buffers de profundidade
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Algoritmo de Voxelização Baseado em Buffer de Profundidade
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Renderização Volumétrica Baseada em Textura 3D: Fatias Alinhadas ao Eixo
• Volume composto de fatias texturizadas (texturas 3D);
• Proxy geometry: quadrados, alinhado aos eixos x, y e z;
• Planos chaveados de acordo com o vetor de visualização.
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Renderização Volumétrica Baseada em Textura 3D: Fatias Alinhadas ao Eixo
Vantagem
• Uma única textura para todo o
volume;
• Consome menos memória de CPU;
• Interpolação trilinear.
Desvantagem
• Não suportada em placas mais antigas;
• Consome mais memória na GPU.
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Renderização Volumétrica Baseada em Textura 2D: Fatias Alinhadas ao Eixo
Uma alternativa para placas gráficas que não suportam texturas 3D ou suportam apenas
texturas 3D de dimensões reduzidas.
1 textura 3D ↔ (dx + dy + dz) texturas 2D
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Renderização Volumétrica Baseada em Textura 2D: Fatias Alinhadas ao Eixo
Vantagem
• A visualização é igual ao da
Renderização Volumétrica Baseada em
Textura 3D;
• Pode ser visualizado em placas gráficas
mais simples.
Desvantagem
• Ocupa 3X o tamanho de uma única
textura 3D.
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Esquemas de Composição e Correção de Opacidade
Composição dita a maneira como os voxels são acumulados...
Composição back-to-front:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) cores associadasglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) cores não-associadas
Composição front-to-back:glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE) cores associadas ou não
Cores não-associadas: multiplicar RGB por alpha no fragment shader
Projeção de intensidade máxima:glBlendEquation(GL_MAX)glBlendFunc(GL_SRC_COLOR, GL_DST_COLOR)
Cuidado! Inicializar corretamente alpha buffer e depth test
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Esquemas de Composição e Correção de Opacidade
back-to-front associada back-to-front não-associada
front-to-back associada front-to-back não-associada
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Tabela de Cores: Função de Transferência Pós-Interpolativa
Função é aplicada sobre amostras interpoladas
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Tabela de Cores: Função de Transferência Pós-Interpolativa
Importante: atribuir corretamente as unidades de textura da GPU...
glUseProgramObjectARB(self.progObj)glActiveTextureARB(GL_TEXTURE0_ARB)glUniform1iARB(glGetUniformLocationARB(self.progObj, "volume"), 0)glActiveTextureARB(GL_TEXTURE1_ARB)glUniform1iARB(glGetUniformLocationARB(self.progObj, "colors"), 1)
uniform sampler3D volume;uniform sampler1D colors;void main() {
float index = texture3D(volume, gl_TexCoord[0].xyz).a;vec4 result = texture1D(colors, index);gl_FragColor = result;
}
Aplicando a função de transferência no fragment shader...
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Iluminação Volumétrica Local: Iluminação Lambertiana em Tempo de Execução
Aproximação diminui acesso a texturas:
Gradientes calculados on-the-fly(fragment shader)
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Iluminação Volumétrica Local: Iluminação Lambertiana em Tempo de Execução
#define DELTA 0.01#define THRESHOLD 0.01uniform vec3 lightPosition;uniform vec3 lightColor;uniform vec3 Kd;uniform sampler3D data3d;uniform sampler1D transf;void main() {
float sample = texture3D(data3d, gl_TexCoord[0].xyz).r;vec4 result = texture1D(transf, sample);if (result.a > THRESHOLD) {
vec3 L = normalize(gl_TexCoord[1].xyz - lightPosition);float sampleL = texture3D(data3d, gl_TexCoord[0].xyz + DELTA * L).x;result.rgb += Kd * lightColor * (sampleL – sample);
}gl_FragColor = vec4(result.r * result.a, result.g * result.a,result.b * result.a, result.a);
}
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
def draw(self):glPushMatrix()glTranslatef(self.origin.x, self.origin.y, self.origin.z)glClipPlane(GL_CLIP_PLANE0, (self.normal.x, self.normal.y, self.normal.z))glPopMatrix()self.drawScene()
def drawScene(self):glEnable(GL_CLIP_PLANE0)self.drawTextureImage3D()glDisable(GL_CLIP_PLANE0)
TUTORIAIS
Recorte Volumétrico Baseado em Superfícies
A própria OpenGL dispõe de um método para aplicar recorte a partir da especificação de
um plano no espaço.
a(x – x0) + b(y – y0) + c(z – z0) = 0
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Recorte Volumétrico Baseado em Superfícies
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Lançamento de Raio por Espaçamento Constante em GPU para Grades Uniformes
• Resultado semelhante a técnica por fatias, porém mais lento• Algoritmo implementado difere do mostrado no livro
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Lançamento de Raio por Espaçamento Constante em GPU para Grades Uniformes
vec3 volExtentMin = vec3(0, 0, 0); vec3 volExtentMax = vec3(1, 1, 1);
for(int i = 0; i < 300; i++) { value = texture3D(volume, position); scalar = value.r;vec4 source = texture1D(colors, scalar); destination.rgb += (1 - destination.a) * source.a * source.rgb; destination.a += (1 - destination.a) * source.a; position = position + direction * stepsize; vec3 temp1 = sign(position - volExtentMin); vec3 temp2 = sign(volExtentMax - position); float inside = dot(temp1, temp2);
}
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
def __init__(self):glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STEREO)
def paintGL(self):glDrawBuffer(GL_BACK_LEFT)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)glPushMatrix()glMatrixMode(GL_MODELVIEW)gluLookAt(-.25, 0, 3, 0, 0, 0, 0, 1, 0)self.drawScene()glPopMatrix()
glDrawBuffer(GL_BACK_RIGHT)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)glPushMatrix()glMatrixMode(GL_MODELVIEW)gluLookAt(.25, 0, 3, 0, 0, 0, 0, 1, 0)self.drawScene()glPopMatrix()
TUTORIAIS
Renderização Estereoscópica 3D em OpenGL
R. M. G. Santos | R. G. Ramos
PROJETO IA369E
TUTORIAIS
Renderização Estereoscópica 3D em OpenGL
A renderização estereoscópica funcionou,
porém o resultado não foi o esperado.
R. M. G. Santos | R. G. Ramos