¿Es inútil aprender OpenGL 2.1 hoy?

44

Soy nuevo en el mundo 3D OpenGL / DirectX y descubrí que las especificaciones OpenGL 4.1 y GLSL se acaban de lanzar hoy.

Un amigo mío me dio el Libro Rojo para OGL v2.1 pero, por lo que he leído, 3.xy 4.x difieren mucho de 2.xy muchas cosas están en desuso ahora.

¿Puedo usar el libro para comenzar a aprender los conceptos básicos de 3D y CG o es mejor encontrar una copia más nueva?

reefaktor
fuente
10
No sé mucho sobre OpenGL / DirectX, pero disfruto jugando en una máquina que tiene más de un año. Me imagino que tu conocimiento de 3.GL OpenGL sería beneficioso para mis hábitos de juego. Solo un pensamiento.
Simurr
No me gusta la forma en que se formula esta pregunta. ¿Puedes hacer un juego en OpenGL 2.1 ? La respuesta: un definitivo . ¿Qué quieres decir con inútil entonces? ¿Puedes aprender los conceptos básicos de 3D de un libro antiguo o API obsoleta? De nuevo un definitivo . ¿Es la mejor forma de hacerlo? Probablemente no .
bobobobo

Respuestas:

18

En momentos como este, siempre me dirijo a Steam Hardware Survey: http://store.steampowered.com/hwsurvey/ : verá que la penetración en el mercado de los sistemas de clase DX10 / 11 es de casi el 80%; esto es ampliamente equivalente a GL3.3 o superior. Este 80% está restringido a usuarios de Vista / 7: agregue una GPU DX10 / 11 con XP y aumente a poco más del 90%.

Teniendo en cuenta que estamos hablando de jugadores un poco más hardcore aquí, entonces debes comenzar a pensar en tu público objetivo. ¿Son estas las personas a las que quieres apuntar? ¿Estás apuntando a aquellos con más hardware de nivel inferior en su lugar? ¿Qué pasa con los gráficos Intel? ¿Qué pasa con los usuarios de Mac y Linux? Estas son todas las preguntas que debe responder por sí mismo, por lo que, en general, las pautas generales son las mejores que obtendrá.

Además de eso, debe tener en cuenta el hecho de que si está empezando a aprender hoy con la intención de enviar algo, está viendo un período mínimo de aproximadamente un año antes de llegar allí (a menos que estemos hablando sobre casos realmente triviales / simples). Con la tendencia al alza de las capacidades de gfx que continúan, estamos buscando estar realmente cerca del 100% de la absorción del hardware GL3.3 + para entonces.

Luego, tenga en cuenta que con GL2.1 o inferior, aprenderá y usará una gran cantidad de tonterías viejas y crudas, incluso si se limita al sombreador y al subconjunto VBOs de GL2.1 (las versiones GLSL de nivel inferior son desagradables de usar , y los VBO de transmisión son prácticamente inutilizables sin GL_ARB_map_buffer_range): GL3.3 + ha introducido formas mucho más agradables (y más efectivas) de manejar muchas cosas, estarás haciendo un mejor uso del hardware del jugador (y te lo agradecerán) por eso) y pasarás más tiempo escribiendo código productivo en lugar de luchar contra una API que realmente no quiere cooperar contigo.

Y luego, por supuesto, está la temida situación del conductor. El hecho difícil pero cierto es que los controladores GL en Windows están en un estado lamentable: NV admite cosas que no deberían, AMD no admite cosas que deberían, y con Intel realmente necesita restringirse a la funcionalidad GL para la que existe Un equivalente en D3D. Cuanto más reciente sea GL_VERSION, es más probable que encuentre errores de controlador, pero para GL3.3 las cosas son bastante estables ahora.

Entonces, el resumen es que, en ausencia de cualquier otra información (público objetivo, etc.), apuntaría a GL3.3 como línea de base (posiblemente aprovechando la funcionalidad de GL_VERSIONs superiores donde está disponible y donde no interrumpe la base de código demasiado) a menos que haya una razón muy específica e identificada definitivamente para ir más abajo (y me gustaría estar absolutamente 100% seguro de eso en lugar de usar una vaga noción de " pero qué pasa con aquellos con hardware más antiguo "). En el último caso, no iría por debajo de GL2.1, y trataría de incorporar tanta funcionalidad 3.x como fuera posible incluso en ese momento.

Maximus Minimus
fuente
Gran punto en GL3.3 ~ = DX10 / 11 y estadísticas de hardware de Steam.
Nate
Solo para actualizar estas estadísticas: DX10 / 11 GPU + Vista / 7 ahora están en ~ 88%, agregue otro 4.38% para DX10 / 11 GPU + XP y está viendo cómodamente más del 90% de penetración. La aceptación está aumentando mucho más rápido de lo que había anticipado cuando hice esa publicación original.
Maximus Minimus
"GL3.3 + ha introducido formas mucho más agradables (y más eficaces) de manejar muchas cosas" - ¿Cómo le va a 3.2 en comparación? Los usuarios de Mac aún no obtienen 3.3. He estado asumiendo que es casi lo mismo, pero no quiero asumir demasiado.
michael.bartnett
38

Sugeriría seguir con la intersección de 2.1 y 3. Todavía hay una gran cantidad de hardware y controladores que solo admiten OpenGL 2.1, pero las prácticas fomentadas por OpenGL 3 core son mejores. Este tutorial es un buen lugar para comenzar (enseña OpenGL 2.0 sin características que han quedado en desuso en 3).

Jake McArthur
fuente
3
+1 para el tutorial de Joe Groff. Te lleva a través de todo el proceso en el Capítulo 2. Y cualquier código de "utilidad" que agregue son solo dos funciones: una para leer en un archivo (para GLSL) y otra para leer imágenes TGA (y también podrías usar otra biblioteca de imágenes o escriba su propio cargador de imágenes una vez que tenga el ejemplo funcionando). Todo lo demás se explica y forma parte del tutorial.
michael.bartnett
18

Yo diría que no es inútil.

¿Por qué? Bueno, mientras que el resto del mundo es compatible con OpenGL 3.xy 4.0, Mac OS X todavía solo es compatible con OpenGL 2.1. Y, OpenGL ES, que se usa en la mayoría de las plataformas portátiles, si no todas, todavía es ampliamente compatible con todas las versiones: 1.0, 1.1 y 2.0; que son más o menos comparables a OpenGL 1.4, 1.5 y 2.1, respectivamente.

Entonces, hasta que OpenGL ES 1.0 desaparezca por completo de la faz de la Tierra, conocer OpenGL 2.x no será un desperdicio.

Eso no quiere decir que no haya valor en usar OpenGL 3.xo 4.0 en plataformas que lo admitan, por supuesto.

Actualización: a partir del lanzamiento de Mac OS X Lion (10.7), el perfil de OpenGL 3.2 Core ahora es compatible con Mac. Esta versión desprecia grandes partes de OpenGL 1.x para simplificar la API. Los usuarios de versiones anteriores de OS X (y gráficos Intel de gama baja) todavía están limitados a OpenGL 2.0 y 2.1. Sin embargo, conocer OpenGL 2.x sigue siendo útil y lo seguirá siendo durante bastante tiempo.

Greyfade
fuente
Snow Leopard admite la mayoría de las extensiones de OpenGL 3, incluso sombreadores de geometría.
Axel Gneiting
@Alex La compatibilidad con "la mayoría" de las extensiones no significa que Core GL3 sea compatible. Y solo estamos hablando de 3.x
Matias Valdenegro
@Axel Gneiting: simplemente no es lo mismo. La mayoría de las características interesantes de OpenGL 3.0+ no están disponibles como extensiones. Hay una gran cantidad de cambios centrales.
greyfade
12

La respuesta de mh01 cubrió gran parte de lo básico, por lo que agregaré algunos suplementos.

OpenGL ES

Hablemos de ES 2.0 vs. Desktop GL 2.1 vs. Desktop GL 3.3. A los efectos de esta discusión, el término "GL XY" se referirá a la versión de escritorio de OpenGL XY, mientras que "ES XY" se referirá a OpenGL ES XY

Estructuralmente , ES 2.0 tiene más en común con core GL 3.3 que con GL 2.1. GL 3.3 y ES 2.0 están basados ​​en sombreado puro. Ambos están basados ​​puramente en objetos buffer. Etc. GL 2.1 tiene muchas trampas de rendimiento y codificación que facilitarían la escritura de una aplicación GL 2.1 que no sería fácilmente portátil para ES 2.0.

Sin embargo, en términos de sintaxis del lenguaje de sombreado , GLSL ES 1.00 (asignación a ES 2.0) se parece mucho más a GLSL de GL 2.1 que a GL 3.3. Las palabras clave attributey varyingno existen en 3.3 core; usa iny out, que es mucho más consistente y razonable cuando se trata de más de 2 etapas de sombreado (por eso ES 3.0 adoptó la sintaxis GL 3.3).

Es fácil mapear los conceptos aprendidos en GL 3.3 a ES 2.0. Entonces, si aprende GL 3.3 para cualquiera de las diversas herramientas para hacerlo, comprenderá cómo trabajar en el mundo ES 2.0. Necesitará averiguar dónde está el subconjunto, por supuesto (es decir: las cosas que GL 3.3 puede hacer que ES 2.0 no puede), pero los conceptos son los mismos.

Mapear la sintaxis de GLSL, para que pueda copiar sombreadores de uno a otro, es un poco más difícil. Pero en realidad, todo lo que se necesita es un #define en los lugares correctos. Además, GLSL 3.30 tiene algunas características de compatibilidad con ES, como highpy así sucesivamente (que no hacen nada en GLSL de escritorio).

Entonces, obtienes algo para ES 2.0 cuando aprendes de GL 3.3 en lugar de GL 2.1.

Nicol Bolas
fuente
8

Para los juegos que no requieren los cambios más grandes en OpenGL expuestos solo en las versiones más recientes, usar solo 3.x + lo limita a una serie nvidia 8 y hacia arriba (no estoy seguro de los otros proveedores de gráficos que desearía buscar). Entonces, si no está utilizando las características 3.x +, solo está creando un límite artificial, evitando que las personas con tarjetas gráficas más antiguas pero poderosas jueguen su juego.

Por esta razón, recomiendo aprender el subconjunto compatible con versiones posteriores y las versiones más nuevas, luego elegir la versión más baja en la que pueda impulsar su juego de manera efectiva. Usted puede

También responderé a otra pregunta que OpenGL: ES 2.0 elimina la canalización de funciones fijas, por lo que es más equivalente a 3.0 que 2.1. También siempre admite diferentes características según la versión gl admitida en tiempo de ejecución.

jsimmons
fuente
4

Diría que es seguro aprender OpenGL usando su Libro Rojo, simplemente ignore las cosas que están en desuso en las versiones más recientes (como glBegin (), glEnd (), use VBO en su lugar). La mayor parte de la funcionalidad en las versiones más nuevas ya estaba disponible antes a través de extensiones.

thbusch
fuente
4

Principalmente estoy de acuerdo con thbusch. Pero no ignoraría por completo las API en desuso: todavía hay demasiado código que las usa. Sin embargo, les prestaría mucha menos atención. No tiene sentido, por ejemplo, aprender glBegin (), glEnd () lo suficiente como para escribir su propio código con ellos. Pero debe reconocerlos cuando los vea y tener una idea de lo que están haciendo.

Todavía vale la pena leer todo el Libro Rojo al menos una vez, incluso si no construye el código de muestra y hace ejercicios que cubren las funciones descontinuadas en OpenGL 3.x.

usuario1800
fuente
3

La respuesta corta:

No. Aprender OpenGL 2.1 es una buena idea, incluso hoy, siempre y cuando aprenda las "partes buenas".

La respuesta larga:

OpenGL puede dividirse esencialmente en dos partes: "Las partes buenas" y "Funciones heredadas".

Honestamente, no veo mucho beneficio en aprender funciones heredadas (la "función fija"). Sin embargo, una parte sustancial de OpenGL 2.1 (las partes buenas) todavía están disponibles hoy con cambios relativamente menores.

Como tal, aprender algunas partes de OpenGL 2.1 puede ser beneficioso. En particular, OpenGL ES 2 es muy popular en estos días, y ES 2 es principalmente (pero no exactamente) un subconjunto de OpenGL 2.1. Para la programación 3D en teléfonos inteligentes, OpenGL ES 2 es imprescindible.

Entonces, ¿qué es "bueno"? Esencialmente, todo lo que se encuentra en OpenGL 3.x "perfil principal" (en oposición a "perfil de compatibilidad") y / o en OpenGL ES 2.

  • Sombreadores de vértices y fragmentos: apréndalos
  • Texturas: aún buenas.
  • Matrices: Saber cómo funcionan es beneficioso, pero glLoadIdentityese tipo de funciones están desactualizadas y deben evitarse.
  • Luz: es útil saber cómo se puede simular la luz en gráficos de computadora, pero se glLightfvdeben evitar otras funciones de luz de función fija.
  • Tampones de matriz: bueno
  • glBegin, glVertex, glColor, glEnd: Evitarlos. Puede ser bueno para la experimentación rápida, pero hay otras formas mejores de hacer lo mismo.
  • Mostrar listas: evitar

La pregunta donde originalmente publiqué esta respuesta resultó ser un duplicado, así que la estoy volviendo a publicar aquí.

luiscubal
fuente
1

No creo que sea una mala idea. Muchos conceptos de GL abarcan todas las versiones de OpenGL y, en última instancia, lo ayudarán. Tengo una serie de libros de OpenGL de hace 10 años que todavía ayudan hoy. Diría que si eres nuevo en OpenGL y hay algunos libros mejores que son más antiguos, aprenderás mucho y el código aún debería funcionar. La mayor parte de OpenGL es compatible con versiones anteriores (creo).

Mungoid
fuente
1

Te aconsejo que primero aprendas las cosas modernas y solo pretendas que las cosas heredadas no existen hasta que las necesites.

Las cosas desactualizadas pueden ser útiles en algunos casos, por ejemplo, si está tratando de programar algo que solo admite OpenGL 1.5 o anterior (se puede encontrar en netbooks viejos y sistemas MacOS más antiguos), OpenGL ES 1.x (los iPhone más antiguos y Android antes de 1.6), o OpenGL SC (El subconjunto de Saftey Critical si está programando una pantalla en un jet de combate). Minecraft, por ejemplo, está construido contra OpenGL 1.3, por lo que puede admitir hardware realmente antiguo (pero incluso eso tiene una opción 'avanzada').

También puede ser útil si solo desea obtener píxeles en la pantalla y no le importa hacerlo de la manera "correcta".

Es útil confiar en algunas de las funciones que OpenGL hace de forma predeterminada al aprender, como configurar una ventana gráfica de -1.0 a 1.0 y renderizar sin sombreadores. Esto le permite aprender sin tener que hacer todo de una vez.

Pero aparte de eso, se debe omitir si es posible.

Le sugiero que consulte mis respuestas aquí y aquí para obtener información más detallada.

David C. Bishop
fuente