cubes usando shaders algoritmo marching implementação dodmc/pgpgpu/12.pdf · implementação do...
TRANSCRIPT
Implementação do algoritmo Marching
Cubes usando shadersLuiz Fernando Oliveira Corte Real
Marching Cubes
http://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/MarchingCubes.svg/1000px-MarchingCubes.svg.png
OpenGL Pipeline
Paralelismo: de graça! ● Vértices
processados em paralelo
● OpenGL cuida dos problemas de concorrência
Implementação
Paralelismo no processamento dos vértices
Cubos do algoritmo independentes
Um vértice para cada cubo!
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)
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);
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);
Implementação
Tabela:● 1 linha = 1 possível configuração do cubo
○ 8 vértices = 28 possibilidades = 256 linhas
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
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
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
Implementaçãoint 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};
ImplementaçãoglGenTextures(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);
ImplementaçãoglGenTextures(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);
Seminterpolação!
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 correspondente4. Calcular posição dos vértices nas arestas5. Gerar triângulos
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
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
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