2011-02-03 20 views
58

En la época era fácil; Hiciste tus propias cosas en 3D, luego vino DirectX, luego vino OpenGL. Para los desarrolladores de .Net MDX fue agradable. Entonces XNA asumió el control de MDX, pero no es lo mismo. XNA parece estar muy centrado en el juego con todo el contenido de canalización y precarga de modelos fijos y demás.¿Qué usar? Tao, SharpGL, OpenTK, DirectX P/Invoke, XNA, MDX, SlimDX, Windows API Codec Pack

Entonces, ¿dónde estamos parados ahora? Después de un par de días de investigación/error de prueba &, siento que en todas partes busco bibliotecas medio desarrolladas, bibliotecas con sobrecarga, limitaciones severas o bibliotecas que son demasiado complejas.

Quiero hacer cosas 3D "a mano alzada". Por ejemplo, mostrar 200k puntos en una pantalla en 3D y moverlos a 30 fps (imagen de profundidad de Kinect). Quiero crear protectores de pantalla 3D, complementos de análisis de audio, etc. Todos los cuales no son prefabricados para una canalización de contenido, y que requieren un alto rendimiento. Y (ehm) quiero hacerlo desde .Net.

Alguien tiene experiencia con las bibliotecas que son fáciles/comprensible y todavía da una cierta cantidad de libertad y la velocidad?

+17

+1 Muy interesado en respuestas para esto. –

Respuesta

13

me parece que han aterrizado en OpenTK. Creo que da acceso más o menos directo a la API de OpenGL y no requiere muchas dependencias.

Es comparativamente fácil de entender. Requiere pocas (y comprensibles) líneas de código para comenzar. No retiene los objetos para mí, así que puedo cambiar cualquier cosa por cada pase, lo cual es genial porque estoy trabajando principalmente con punteros inseguros para la memoria.

Por supuesto, es difícil combinar velocidad con la facilidad de uso. La velocidad requiere hablar directamente con la API 3D, mientras que la facilidad de uso requiere abstracción. Por lo tanto, esto debe considerarse una API de nivel más bajo que algunos de los otros que he probado. Si quisiera hacer una animación de personajes prefabricada, XNA probablemente sería una mejor opción, pero para mi uso (descrito anteriormente), esto parece muy prometedor hasta el momento (4-5 horas de pirateo).

un código de ejemplo:

private void Render() 
{ 
    // Every frame 
    GL.MatrixMode(MatrixMode.Modelview); 
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
    GL.LoadMatrix(ref cameraMatrix); 

    GL.Begin(BeginMode.Points); 

    // Here I can add lots of points. I add 200k without any big problem. 
    // It seems these points could have been passed in as an array pointer too, 
    // but I'll look at that later. 
    GL.Vertex3(x2, y2, z2); 

    GL.End(); 
    glControl.SwapBuffers(); 
} 
+1

Solo quería señalar que su código tiene un pequeño error (la primera llamada de GL.Begin es superflua). OpenTK está diseñado como una API de bajo nivel, a diferencia de XNA. Requiere más esfuerzo pero le da más control a cambio (además de que es multiplataforma para arrancar). –

+0

Gracias, eliminado primero Comience. –

+0

No estoy seguro de si esto se supone que es un ejemplo de trabajo, pero cameraMatrix no existe. – AaronLS

1

nos enfrentamos a un problema similar hace algún tiempo y los siguientes representa nuestra opinión, sólo por supuesto. Una de nuestras principales preocupaciones era que la biblioteca debería ser versátil, producir imágenes en 3D de muy buena calidad, gratuitas y sin cargas adicionales en el instalador, por ejemplo, con XNA, donde debe tener instalados los archivos correctos. Esto parecía ser una posible fuente de dolor de cabeza. Al final nos conformamos con DirectX y escribimos la GUI en C#. Toda la interacción necesaria con 3D se realizó con wndproc. Esto nos proporcionó tanto el poder de DirectX como la facilidad de desarrollo de GUI con C#. No nos hemos arrepentido de esto en absoluto.

+0

¿Quiere decir que alojó el DirectX en un wpf como WinForms? – Archival

+0

¡No! Solo DirectX y WinForms. Los eventos de mouse y clave se enviaron a la superficie renderizada de DirectX utilizando wndproc. – Pedery

8

Si te gustó MDX, SlimDX debe ser hasta su callejón. Es básicamente un reemplazo para MDX, pero con muchas de las decisiones de diseño cuestionables arregladas, y mucha más funcionalidad incluida. Cualquier cosa que haya tenido con MDX, encontrará presente en SlimDX de una forma u otra.

+1

Presentaré mi apoyo para SlimDX. Después de jugar con OpenTK y MDX, me decidí por SlimDX como API para hacer gráficos en 3D en mi proyecto. Es muy limpio, está bien diseñado y es fácil de traducir ejemplos de C++ DX. –

+2

También hay SharpDX (generado a partir de DirectX CPP Headers) en la tabla ahora. También con Mono-Soporte. http://code.google.com/p/sharpdx/ –

3

Alternativamente hay otro C# paquete de envoltura para OpenGL: OpenGL DotNet. ¡Funciona genial para mí! Échale un vistazo al http://www.taylaninan.com/opengl-dotnet.php.

Se envuelve OpenGL hasta la versión 4.4 y es compatible con más de más de 550 extensiones de OpenGL. También es compatible con GLU, GLUT, FreeGLUT, DevIL (biblioteca de imágenes del desarrollador), ILU e ILUT para DevIL.

Es una API de bajo nivel para las bibliotecas anteriores.