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
Sí, es posible. Deseará aprender sobre Shaders en Cg.
Eche un vistazo a glEnable(GL_AUTO_NORMAL)
.
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.
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();
}
- 1. ¿Cómo calcular k valores eigen más grandes en la GPU?
- 2. calcular las normales de vértice de una esfera
- 3. GPU MD5/SHA1 Hasher
- 4. Ajustaciones de imagen HSL en la GPU
- 5. Computación multi-GPU Cuda
- 6. Cálculos enteros en GPU
- 7. Sincronizaciones en GPU
- 8. GPU lee desde CPU o CPU escribe en la GPU?
- 9. ¿Cómo puedo calcular estas estadísticas?
- 10. ¿Puedo calcular exp (1 + 2j) en python?
- 11. Regresión lineal en R (datos normales y logarítmicos)
- 12. unlocked_ioctl vs ioctl normales
- 13. aritmética modular en la gpu
- 14. Detección de procesamiento de GPU en Flash Player 10
- 15. uso básico multi-GPU
- 16. ¿Cómo puedo leer la carga de la GPU?
- 17. las configuraciones normales en Visual Studio
- 18. Django Sitemaps y vistas "normales"
- 19. SLI para múltiples GPU
- 20. ¿Puedo calcular el promedio de estos números?
- 21. ¿Puedo calcular el puntaje z con R?
- 22. Algoritmo rápido para calcular Pi en paralelo
- 23. Computación en paralelo de GPU con OpenCV
- 24. ¿Cómo hacer la interpolación bilineal de normales en un quad?
- 25. ¿Cómo puedo calcular cuánto tiempo tarda una función en jQuery?
- 26. ¿Cómo puedo calcular la distancia entre dos puntos en MkMapview?
- 27. ¿Hay protección de memoria en las GPU
- 28. Programación de GPU en Xbox 360
- 29. Predicación de rama en la GPU
- 30. Memoria de asignación dinámica en la GPU
Las normales deben calcularse en un shader de geometría, no fragmentar. – ext