2010-07-27 14 views
5

Tengo una aplicación opengl que carga un dxf y lo dibuja en la pantalla, cada vez que necesito calcular las normales. ¿Hay alguna manera de calcular normales en GPU en lugar de CPU? si es así, cómo ?¿puedo calcular normales en gpu?

Respuesta

2

Sí, es posible. Deseará aprender sobre Shaders en Cg.

Official book.

+2

Las normales deben calcularse en un shader de geometría, no fragmentar. – ext

1

Eche un vistazo a glEnable(GL_AUTO_NORMAL).

4

Puede calcular las normales "sombreadas planas" (una normal por cara) desde el sombreador de geometría. Uno para cada triángulo, "sobre la marcha", utilizando productos cruzados. No se pueden generar normales "suaves" de esa manera, porque GS no tiene información sobre vecinos.

Si la malla es paramétrica (por ejemplo, metaballs), lo normal se puede calcular muestreando algunos valores de función cercanos. Esto también se puede hacer en GPU.

También puede calcular las normales en el sombreador si la malla se basa en el mapa de alturas o algo similar.

IF GPU admite CUDA, OpenCL o algo similar, Y si puede procesar matrices arbitrarias de datos, entonces probablemente también pueda calcular normales en la GPU, utilizando técnicas tradicionales.

Además, creo que hace 5 años (más o menos) vi un documento titulado algo así como "suavizado normal en GPU" o "generación normal en GPU". Tenía un corazón poligonal reflexivo y sombreado en la primera página. Desafortunadamente, no puedo encontrar ese papel, y no estoy exactamente seguro de si existió (o dónde lo vi). Es posible que pueda encontrarlo (si existe) en documentos GDC, documentos SIGGRAPH, SDK de ATI o SDK de NVidia.

4

Tendrás que usar sombreadores.

Puede usar un sombreador de geometría GLSL. Aquí está la versión GLSL para cara normales. Los vértices normales requieren más trabajo ya que tienen que tener en cuenta los vértices vecinos.

  • ¡Asegúrese de que su tarjeta gráfica soporta sombreadores de geometría! Utilice, por ejemplo, GPU Caps Viewer.
  • Corte y pegue cualquier tutorial para incorporar un sombreador de geometría en su aplicación.
  • El shader debe tener este aspecto:
//glsl shader 

#version 120 
#extension GL_EXT_geometry_shader4 : enable 
void main(void) 
{ 
// Compute per-face normal 
    vec4 d1 = gl_PositionIn[1] - gl_PositionIn[0]; 
    vec4 d2 = gl_PositionIn[2] - gl_PositionIn[0]; 
    gl_Normal = cross(d1,d2); 

// Emit all input vertices 
    for(i=0; i< gl_VerticesIn; i++){ 
     gl_Position = gl_PositionIn[i]; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
}