• Nenhum resultado encontrado

Implementação do algoritmo Marching Cubes usando shaders

N/A
N/A
Protected

Academic year: 2022

Share "Implementação do algoritmo Marching Cubes usando shaders"

Copied!
48
0
0

Texto

(1)

Implementação do algoritmo Marching Cubes usando shaders

Luiz Fernando Oliveira Corte Real [email protected]

(2)

Marching Cubes

Textura 3D Isosuperfície

3 9 8 7

6 8 5 4

9 9 7 6

10 6 4 2

(3)

Marching Cubes

Textura 3D Isosuperfície

3 9 8 7

6 8 5 4

9 9 7 6

10 6 4 2

(4)

Marching Cubes

Isosuperfície:

6

(5)

Marching Cubes

Isosuperfície:

6

(marcação apenas ilustrativa e errada)

(6)

Marching Cubes

Isosuperfície:

6

(marcação apenas ilustrativa e errada)

(7)

Marching Cubes

http://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/MarchingCubes.svg/1000px-MarchingCubes.svg.png

(8)

OpenGL Pipeline

Pipeline fixo

(9)

OpenGL Pipeline

Pipeline fixo

● Padrão até OpenGL 2.1

● Removido no 3.1

(10)

OpenGL Pipeline

Pipeline programável

(11)

OpenGL Pipeline

Vertex Shader:

transformações vértice a vértice

● Posição

● Normal

● Cor

(12)

OpenGL Pipeline

Geometry Shader:

transformações em primitivas

● Uma entrada

● Várias saídas

(13)

OpenGL Pipeline

Fragment Shader:

transformações

fragmento a fragmento

● Iluminação

● Texturização

(14)

OpenGL Pipeline

Paralelismo: de graça!

● Vértices

processados em paralelo

● OpenGL cuida dos problemas de

concorrência

(15)

OpenGL Pipeline

Ideia:

patches do algoritmo produzidos no

Geometry Shader

(16)

Implementação

Paralelismo no processamento dos vértices

(17)

Implementação

Paralelismo no processamento dos vértices Cubos do algoritmo independentes

(18)

Implementação

Paralelismo no processamento dos vértices Cubos do algoritmo independentes

Um vértice para cada cubo!

(19)

Implementação

1º passo: um vértice para cada cubo

(20)

Implementação

0 1

0 0 1

1

Resolução:

H x W x D

(21)

Implementação

0 1

0 0 1

1

dx dz

dy

Resolução:

H x W x D dx = 1 / W dy = 1 / H dz = 1 / D

(22)

Implementação

Vértices: (-1, -1, -1) -> (1, 1, 1)

(23)

Implementação

Vértices: (-1, -0.95, -0.8) -> (1, 0.95, 0.8)

(supondo W > H > D)

(24)

Implementação

Vértices: (-1, -0.95, -0.8) -> (1, 0.95, 0.8)

Voxel: (x, y, z)

Vértice: (-1, -0.95, -0.8) + 2 (dx.x, dy.y, dz.z)

(25)

Implementação

Vértices: (-1, -0.95, -0.8) -> (1, 0.95, 0.8)

glBegin(GL_POINTS);

for (double x = -maxX; x <= maxX; x += 2 * dx) {

for (double y = -maxY; y <= maxY; y += 2 * dy) { for (double z = -maxZ; z <= maxZ; z += 2 * dz) {

glVertex3f(x, y, z);

} }

}

glEnd(GL_POINTS);

(26)

Implementação

Vértices: (-1, -0.95, -0.8) -> (1, 0.95, 0.8)

glBegin(GL_POINTS);

for (double x = -maxX; x <= maxX; x += 2 * dx) {

for (double y = -maxY; y <= maxY; y += 2 * dy) { for (double z = -maxZ; z <= maxZ; z += 2 * dz) {

glVertex3f(x, y, z);

} }

}

glEnd(GL_POINTS);

(27)

Implementação

1º passo: um vértice para cada cubo 2º passo: tabela de patches no shader

(28)

Implementação

Tabela:

● 1 linha = 1 possível configuração do cubo

(29)

Implementação

Tabela:

● 1 linha = 1 possível configuração do cubo

8 vértices = 28 possibilidades = 256 linhas

(30)

Implementação

Tabela:

● 1 linha = 1 possível configuração do cubo

8 vértices = 28 possibilidades = 256 linhas

● Colunas = arestas do cubo c/ ponto do patch

Maior patch: 16 vértices => 16 colunas

(31)

Implementação

Tabela:

● 1 linha = 1 possível configuração do cubo

8 vértices = 28 possibilidades = 256 linhas

● Colunas = arestas do cubo c/ ponto do patch

Maior patch: 16 vértices => 16 colunas

256 x 16 = 4096 inteiros

(32)

Implementação

1 linha:

● índices das arestas do cubo com vértices

● -1 = fim

3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1

(33)

Implementação

int RawTriangleTable[] = {

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ...

...

...

...

2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1,

1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

(34)

Implementação

Muitos dados para

passar para shader Textura

(35)

Implementação

glGenTextures(1, &triangleTableTexture);

glActiveTexture(GL_TEXTURE1);

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, triangleTableTexture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA16I_EXT, 16, 256, 0, GL_ALPHA_INTEGER_EXT, GL_INT, &RawTriangleTable);

(36)

Implementação

glGenTextures(1, &triangleTableTexture);

glActiveTexture(GL_TEXTURE1);

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, triangleTableTexture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA16I_EXT, 16, 256, 0, GL_ALPHA_INTEGER_EXT, GL_INT, &RawTriangleTable);

Sem

interpolação!

(37)

Implementação

1. Calcular valor da textura nos vértices do cubo

2. Marcar quais são maiores e menores que o valor da superfície

3. Obter linha da tabela correspondente

4. Calcular posição dos vértices nas arestas 5. Gerar triângulos

(38)

Implementação

Vertex Shader: apenas passa os vértices (pontos) para o Geometry Shader

Fragment Shader: colore e ilumina os

triângulos rasterizados do Geometry Shader

(39)

Implementação

Vertex Shader: apenas passa os vértices (pontos) para o Geometry Shader

Fragment Shader: colore e ilumina os

triângulos rasterizados do Geometry Shader

Usa a textura para calcular as normais

(40)

Demonstração

(41)

Otimização

Toda a superfície é regerada a cada alteração na cena

(42)

OpenGL Pipeline

(43)

OpenGL Pipeline

Transform feedback

(44)

OpenGL Pipeline

Transform feedback

● Extensão OpenGL até versão 2.1

● Core a partir da 3.0

(45)

Otimização

(46)

Otimização

(47)

Demonstração

(48)

Links

Implementação original: http://www.icare3d.

org/blog_techno/gpu/opengl_geometry_shader_marching_cubes.html

Transform feedback: http://www.opengl.

org/registry/specs/EXT/transform_feedback.txt

Implementação no MedSquare: https://medsquare.svn.sourceforge.

net/svnroot/medsquare/branches/marching-

cubes/Rendering/vtkmsqOpenGLShadersImageMarchingCubesMapper.

cxx

Obrigado!

[email protected]

Referências

Documentos relacionados

Na continuidade do estudo que vem sendo realizado pelo Observatório do Turismo de Lisboa, em conjunto com a Administração do Porto de Lisboa sobre o perfil do

Desta forma, como o Fundo Trígono Flagship Small Caps cresceu rapidamente entre o final de 2019 e o início de 2020, devido ao seu excepcio- nal desempenho (que foi o que motivou

§ 3º - Para concorrer às vagas destinadas a cota de inclusão, os candidatos deverão preencher o Formulário de Inscrição na página da COMVEST na internet

Localizada no litoral norte de Santa Catarina, a cidade de Navegantes conta com uma orla marítima de aproximadamente 12 quilômetros, divididas em Praia Central, Meia Praia e Gravatá

l em 1655 1655 1655 1655 1655, empreendeu a primeira guerra naval contra a Holanda primeira guerra naval contra a Holanda primeira guerra naval contra a Holanda primeira guerra

consideram que o desenvolvimento do storyboard é uma das etapas mais relevantes na metodologia de FGUGPJQGEQPUVTWȖȒQFG4.1ũU

O primeiro passo para construir uma triangulação Delaunay consiste em considerar a malha superficial inicial gerada pelo algoritmo Marching Cubes, para o qual o algoritmo mais

Tomando-se como base para a compreensão dessa lógica capitalista o espaço rural e a proletarização no campo, essa pesquisa consiste num estudo dos trabalhadores