Función fija vs Shaders: ¿cuál para principiantes?

16

Actualmente voy a la universidad para ciencias de la computación. Aunque planeo utilizar un motor existente en algún momento para crear un juego pequeño, mi objetivo en este momento es aprender los fundamentos: la programación 3D. Ya he realizado algunas investigaciones sobre la elección entre DirectX y OpenGL, y el sentimiento general que surgió de eso fue que si elige OpenGL o DirectX como su plataforma de ruedas de entrenamiento, gran parte del conocimiento es transferible a la otra plataforma . Por lo tanto, dado que OpenGL es compatible con más sistemas (probablemente una razón tonta para elegir qué aprender), decidí que primero aprenderé OpenGL.

Después de tomar esta decisión de aprender OpenGL, investigué un poco más y descubrí una dicotomía que de alguna manera desconocía todo este tiempo: OpenGL de función fija versus OpenGL moderno basado en sombreador programable. Al principio, pensé que era una opción obvia que debería elegir aprender OpenGL basado en sombreadores, ya que eso es lo que más se usa en la industria hoy en día. Sin embargo, luego me topé con la muy popular programación de aprendizaje moderno de gráficos en 3D de Jason L. McKesson, que se encuentra aquí: http://www.arcsynthesis.org/gltut/

Leí los fragmentos introductorios, y en la sección "Acerca de este libro", el autor declara:

"Primero, gran parte de lo que se aprende con este enfoque debe abandonarse inevitablemente cuando el usuario encuentra un problema gráfico que debe resolverse con la capacidad de programación. La capacidad de programación borra casi toda la canalización de funciones fijas, por lo que el conocimiento no se transfiere fácilmente".

Sin embargo, al mismo tiempo, también establece que la funcionalidad fija proporciona una curva de aprendizaje más fácil e inmediata para los principiantes al afirmar:

"En general, se considera más fácil enseñar a los programadores de gráficos de neófitos que utilizan la canalización de funciones fijas".

Naturalmente, puede ver por qué podría estar en conflicto sobre qué paradigma aprender: ¿Paso mucho tiempo aprendiendo (y luego desaprendiendo) las formas de funcionalidad fija, o elijo comenzar con sombreadores? Mi principal preocupación es que los sombreadores programables modernos de alguna manera requieren que el programador ya comprenda la tubería de función fija, pero dudo que ese sea el caso.

TL; DR = Como aspirante a programador de gráficos de juegos, ¿me interesa aprender a programar en 3D a través de la funcionalidad fija o la programación moderna basada en sombreadores?

Rob Hays
fuente
Hay algunas preguntas similares a esto también ...
notlesh
"Sin embargo, al mismo tiempo, también establece que la funcionalidad fija proporciona una curva de aprendizaje más fácil e inmediata para los principiantes al afirmar:" Tengo curiosidad. ¿Cómo exactamente eso hace ese caso? Debido a que la cita dice claramente: "Generalmente se considera más fácil ..." (énfasis agregado). Como en, puede considerarse cierto, pero eso no significa que sea cierto.
Nicol Bolas
Sí, esa fue una forma incómoda de redactar eso.
Rob Hays
La canalización de funciones fijas ha quedado en desuso tanto en OpenGL como en DirectX, por lo que no perdería su tiempo con ella. Los sombreadores básicos son bastante sencillos, y ciertamente no son más complicados que comprender lo suficiente como para que funcione un contexto de representación.
3Dave

Respuestas:

30

No compro el argumento de que es más fácil comenzar con el material de función fija. Es posible que la función fija le permita hacer ciertas cosas con menos código: en OpenGL de función fija, por ejemplo, puede obtener iluminación / sombreado básico haciendo glEnable(GL_LIGHTING)algunas otras llamadas. El problema es que tan pronto como desee algo ligeramente diferente: iluminación por píxel, por ejemplo, en lugar de iluminación por vértice, debe abandonar por completo las funciones de función fija y escribir un sombreador para implementar tanto la funcionalidad fija que estaba utilizando antes, más lo que quisieras cambiar.

Parece que sería más simple y menos confuso usar sombreadores todo el tiempo. Los sombreadores necesitan un poco más de trabajo de configuración ya que tiene un archivo fuente separado que debe cargarse y compilarse, algunas llamadas C adicionales para buscar y establecer parámetros, etc. Pero una vez que tiene un sombreador en funcionamiento, es lo más fácil codificar algunos efectos diferentes, probar diferentes ideas, etc. Y no necesita preocuparse acerca de dónde están los límites del sistema de función fija y si puede o no hacer lo que quiere; Los sombreadores pueden hacer cualquier cosa para la que pueda escribir código, modular los límites habituales de rendimiento y memoria.

Nathan Reed
fuente
Genial, gracias por la respuesta. Lo más probable es que termine yendo bien para los sombreadores.
Rob Hays
3
+1 - también es algo así como "Learning C ++" vs "Learning BASIC". Le llevará más tiempo aprender C ++, pero a la larga habrá aprendido más.
Jonathan Dickinson
3
Me gustaría recomendar opengl-tutorial.org . El sitio explica los conceptos básicos bastante bien y solo usa sombreadores.
Exilyth
2

En segundo lugar voy directamente a los sombreadores. En realidad no es que mucho más difícil de configurar, y al pasar este primer obstáculo que tendrá pleno poder a su alcance.

Más concretamente, descubrirá que la programación de sombreadores se asemeja más a las ecuaciones matemáticas que ve en los libros y las conferencias de gráficos en la universidad.

MGB
fuente
0

Sugeriría usar la canalización de función fija como columna vertebral de su programa. Encuentro que es más fácil que aparezca algo usándolo en lugar de sombreadores. Luego, cuando sabes que no has estropeado tus vértices o normales, puedes avanzar lenta pero seguramente hacia el mundo de las sombras.

Oskar
fuente