2009-11-07 21 views
12

Soy un programador de C++ con una experiencia de programación de servidor muy extensa. Sin embargo, estoy bastante aburrido en este momento y decidí abordar una nueva área: la programación de juegos 3D, con fines de aprendizaje. Además, creo que este proyecto de aprendizaje puede ser un buen material para currículos en el futuro si decidiera trabajar en esta área.¿Qué estructura de gráficos 3D debería usar para un motor de juegos del mundo real?

En lugar de crear un motor 3D desde cero, decidí emular de la manera más exacta posible una existente: la de World of Warcraft. Si usted es curioso en cuanto a por qué (puede saltarse este):

  • Es un juego de éxito en el mundo real
  • Todos los mapas de texturas, modelos y lo que no lo están ya hecho (no estoy interesado en el aprendizaje cómo dibujar realmente una textura con photoshop o lo que sea)
  • Sus formatos de archivo han sido más o menos completamente ingeniería inversa
  • Ya hay un proyecto de código abierto idéntico (wowmapview) que puedo ver si estoy en problemas .

bien, que era un largo prefacio .. Ahora, mi pregunta principal es la siguiente: ¿Debo usar DirectX, OpenGL, las bibliotecas de derivadores como SDL, o qué?

¿Cuál es el más usado en el mundo real?

Y, algo más que me deja perplejo: ¡World of Warcraft parece estar usando ambos! De hecho, normalmente usa DirectX, pero puede usar opengl al iniciarlo con el interruptor "-opengl" a través de la línea de comando.

¿Es esto algo común en los juegos? ¿Por qué lo hicieron? Me imagino que es mucho trabajo y, desde mi entender, nadie usa OpenGL de todos modos (muy pocas personas saben sobre el interruptor secreto en absoluto). Si los programadores generalmente crean su propio "envoltorio" de motor 3D, algo como SDL hecho en casa, y basado en switches/#defines/que no decidan a qué función API llamar en última instancia (DirectX u OpenGL) ? ¿O esta funcionalidad ya está incorporada en sdl (puede cambiar entre DirectX y OpenGL a voluntad)?

Y, finalmente, ¿tiene algún libro que sugerir?

Gracias!

+5

"¿Por qué lo hicieron?" Porque Mac OsX no tiene soporte de DirectX? –

+3

SDL es simplemente una capa de abstracción de plataforma, no sustituye ni a OpenGL ni a DirectX. Sin embargo, cuando se usa SDL, se usa más comúnmente con OpenGL, ya que ambas bibliotecas de plataforma cruzada. También vale la pena señalar que SDL no proporciona un kit de herramientas de widgets, por lo que si es un requisito (algo poco común en los juegos 3D de pantalla completa), algo como Qt podría ser una mejor opción para una aplicación multiplataforma. – codelogic

+1

@gf: buen punto. Hace que me pregunte ahora por qué no admiten Linux de forma nativa, ya que se tomaron todas las molestias para hacer que OpenGL funcione para mac ... solo debería necesitar cambios relativamente triviales. Bueno, supongo que nunca lo sabré. –

Respuesta

30

Me doy cuenta de que ya has aceptado una respuesta, pero creo que esto merece algunos comentarios más. Perdón por citarte fuera de orden, estoy respondiendo por lo que creo que es importante.

En lugar de crear un motor 3D desde cero decidí emular lo más exactamente posible: uno de World of Warcraft.

Sin embargo, quería centrarme en el motor 3d y de representación, no en la interfaz, así que no creo que vaya a usarlo [lua] para este proyecto.

De estos dos fragmentos, puedo decirte que no estás tratando de emular el motor del juego. Solo el 3D render backend. No es lo mismo, y la parte de render back-end es una parte muy pequeña en comparación con el motor de juego completo.

Esto, por cierto, puede ayudar a responder a una de sus preguntas:

World of Warcraft parece estar utilizando los dos! De hecho, normalmente usa DirectX, pero puede usar opengl al iniciarlo con el interruptor "-opengl" a través de la línea de comando.

Sí, implementaron ambos. La cantidad de trabajo para hacer eso no es despreciable, pero el back-end de renderizado, en mi experiencia, es como máximo el 10% del código total, generalmente menos. Entonces no es tan indignante implementar múltiples.

Más al punto, la parte de programación de un motor de juego de hoy no es la mayor parte. La mayoría de los scripts de lua se consideran de ese lado, por ejemplo)

Para WoW, el soporte de OSX significaba OpenGL. Entonces lo hicieron. También querían admitir hardware antiguo ... Así que admiten hardware de nivel DX8. Eso ya son 3 backends. No estoy al tanto de cuántos realmente implementan, pero todo se reduce a la base de clientes a la que querían llegar.

Varios back-ends en un motor de juego es algo que es más o menos necesario para escalar a todas las tarjetas gráficas/sistemas operativos/plataformas. No he visto un solo motor de juego real que no sea compatible con múltiples backends (incluso los títulos de los primeros tienden a admitir un back-end alternativo para la depuración).

bien, eso fue un largo prefacio ... Ahora, mi pregunta principal es la siguiente: ¿Debería usar DirectX, OpenGL, bibliotecas de contenedor como sdl, o qué?

Bueno, esto depende en gran medida de lo que quiere obtener de ella. Podría añadir que la lista de opción no es bastante completa:

  • DirectX9
  • DirectX10
  • DirectX11
  • OpenGL < 3.1 (antes de quitar API en desuso)
  • OpenGL> = 3.1
  • OpenGL ES 1.1 (solo si usted necesita para.No es programable)
  • OpenGL ES 2,0

Sí, esas API son tan diferentes que es necesario decidir cuáles desea manejar.

Si desea aprender los conceptos básicos de la representación 3D, cualquiera de ellos puede funcionar. OpenGL < 3.1 tiende a ocultar muchas cosas que, en última instancia, tienen que suceder en el código de usuario para los demás (por ejemplo, manipulación de matriz, consulte this plug).

Los DX SDK vienen con muchas muestras que ayudan a comprender los conceptos básicos, pero también tienden a usar las últimas y mejores características de DX cuando no es necesario al iniciar (por ejemplo, usar el sombreador Geometry para representar sprites. ..)

Por otro lado, la mayoría de los tutoriales de GL tienden a usar características que son esencialmente no perfectas en hardware moderno (por ejemplo, glBegin/glEND, selección/selección, ... vea la lista de cosas que se eliminaron de GL 3.1 o this other plug) y tienden a sembrar los conceptos incorrectos para muchas cosas.

¿Cuál es el más usado en el mundo real?

Para juegos, DirectX9 es el estándar hoy en el mundo de PC. Por un margen lejano.

Sin embargo, estoy esperando que DirectX11 obtenga más cuota de mercado, ya que permite un trabajo de varios subprocesos. Desafortunadamente, es mucho más complicado que DX9.

nadie usa OpenGL de todos modos (muy pocas personas saben sobre el interruptor secreto en absoluto).

Pregunte a los propietarios de Mac qué opinan.

Pregunta adicional, ¿de verdad crees que los proveedores de hardware gastarían cualquier energía en los controladores OpenGL si este fuera realmente el caso (me doy cuenta de que generalizo tu comentario, lo siento)? hay usos del mundo real de eso. No hay mucho en juegos, sin embargo. Y Apple hace que OpenGL sea más relevante a través del iPhone (bueno, OpenGL ES, realmente).

Si es algo que suele hacer, no programadores suelen crear su propio motor 3d "envoltura",

Por lo general es una parte integrante del diseño del motor. Eso sí, no es abstraer la API en el mismo nivel, por lo general es más como "dibujar esto con todas las campanas y silbidos de allí". Qué algoritmo de representación aplicar en ese sorteo tiende a ser específico del back-end.

Esto, sin embargo, es muy dependiente del motor del juego. Si quieres entender mejor, puedes mirar UE3, acaba de obtener released free (beer) for non-commercial use (no lo he visto todavía, así que no sé si expusieron los backends, pero vale la pena verlo). Para volver a mi comentario, el motor de juego no solo significa 3D, look at this.

+3

+1 para una respuesta muy completa y reflexiva! –

+1

Excelente respuesta, marcada como aceptada. Gracias ! –

+0

wow, ni siquiera sabía que podría cambiar la respuesta aceptada después del hecho. – Bahbar

3

Creo que la principal ventaja de usar OpenGL sobre DirectX es la portabilidad. DirectX solo se ejecuta en Windows. Sin embargo, esto a menudo no es un problema (muchos juegos solo se ejecutan en Windows).

DirectX también proporciona otras bibliotecas que son útiles para juegos que no están relacionados con los gráficos, como el sonido y la entrada. Creo que hay equivalentes que a menudo se usan con OpenGL, pero no creo que sean realmente parte de OpenGL.

Si vas a encerrar Windows con DirectX y estás dispuesto/interesado en aprender C# y el código administrado, he descubierto que XNA es una plataforma extremadamente fácil de aprender. Le permite aprender la mayoría de los conceptos sin tener que lidiar con muchos de los detalles realmente difíciles de DirectX (u OpenGL). Todavía puede usar el código de sombreado y tener toda la potencia de DirectX, pero en un entorno mucho más amigable. Sería mi recomendación, pero una vez más, tendrías que cambiar a C# (claro, también puedes poner eso en tu currículum).

+0

DirectX ya no es compatible con C#: http://social.msdn.microsoft.com/Forums/en-US/gametechnologiesdirectx101/thread/e9f458e0-65c6-4936-9af4-4276fc92f111. La última versión que utilicé con soporte fue 9.0c –

+2

Enorme +1 para XNA dado el historial de los solicitantes y la aplicabilidad futura de la tecnología – gn22

+0

Es cierto que no se puede programar DirectX directamente con C#, pero XNA es una biblioteca C# que usa DirectX debajo.No es lo mismo que DirectX y está muy en uso hoy en día, la versión 3.0 acaba de salir recientemente. –

1

Es posible que desee ver algunos proyectos que encapsulan la API de nivel bajo en una interfaz de nivel superior que es independiente de API, como Ogre3D. Mientras haces esto para aprender, supongo que probablemente serás más interesante al implementar los detalles de bajo nivel por ti mismo, pero probablemente podrías aprender mucho de ese proyecto.

+1

O irrlicht, o openscenegraph –

+0

De hecho, todo bien. – jcoder

-1

Estoy trabajando en OpenGL ahora mismo (tanto en Windows como en Mac).

En comparación con mi programación de juegos de medianoche con el motor Unity3D, usar OpenGL es como tener que talar tus propios árboles para hacer una casa versus comprar los materiales.

Unity3D se ejecuta en todo (Mac, PC y iPhone, reproductor web, etc.) y le permite concentrarse en lo que hace un juego, un juego. Para colmo, es más rápido que cualquier cosa que pueda escribir. Código para ello en C#, Java (EDITAR: hacer eso JavaScript) o Boo . (EDITAR: Soporte Boo se ha caído)

Acabo de utilizar Unity para crear una demo para un cliente que quiere algo hecho en OpenGL por lo que tiene su uso real también.

-Chris

PS: La versión Unidad independiente recientemente quedó libre.

+1

Una pequeña corrección: ¡Puedes programar en Javascript, no en Java! :-) –

+0

Gracias Thiago. Lo arreglé 7 años después ... –

0

si solo está interesado en la parte de representación, puedo sugerir ogre3d. es limpio, C++, probado y multiplataforma. Lo usé en dos proyectos y en comparación con otras experiencias (por ejemplo, torque3d), me gustó el buen soporte (tutoriales/wiki/foro) y la curva de aprendizaje no tan pronunciada. Creo que alguien también puede aprender mucho mirando el código fuente y los conceptos que han utilizado en el diseño. también hay un libro de acompañamiento, que está un poco desactualizado, pero es bueno para el inicio

El problema con esto es que pensarás dentro de este motor y pronto necesitarás un juego similar (temporizadores, eventos) elementos para simular y probar tus efectos o lo que quieras hacer. por lo que terminará trabajando en las deficiencias de ogre3ds (no es un motor de juego) e implementará por su cuenta o usará otro middleware.

así que si realmente quieres tocar el renderizado 3D primero, tomaría algunos libros de gráficos por computadora (gpu gems, shaderx) y veré algunos tutoriales y demostraciones en la web y comenzaré a construir mi propio marco básico. esto es por la experiencia y creo que aprenderá más de este enfoque. al menos lo hice ...

Cuestiones relacionadas