¿Cuáles son los pros / contras de los tres?
¿Cuáles son los pros / contras de los tres?
Respuestas:
coderanger tiene razón acerca de que HLSL apunta a DirectX, GLSL apunta a OpenGL y CG está disponible con ambas interfaces.
Sin embargo, hay otras cosas a considerar (aprendidas en el foro OGRE):
Entonces, si no está utilizando las últimas funciones de sombreado, CG parece una buena opción. GLSL parece mejor si vas a usar OpenGL completo. HLSL si vas exclusivamente a plataformas Microsoft.
Ahora, desarrollar primero en HLSL para Windows para usar DirectX y luego convertirlo a GLSL para Linux y Mac podría ser la mejor solución para estar seguro del rendimiento y tener disponible el conjunto más amplio de características de sombreado. Sin embargo, podría ser mucho trabajo (no lo hice yo mismo, así que no puedo decirlo). El motor de gráficos OGRE (y otros motores) permiten usar cualquier API (DirectX u OpenGL u otros), por lo que ayuda, pero todavía hay un código de sombreador para convertir si sigue este camino.
Esa es toda la información que reuní al elegir mi idioma de sombreador (aún no he tomado una decisión).
Actualización: Valve realizó una conversión de uno de sus juegos a OpenGL y no encontró forma de hacer que la versión de DirectX sea más rápida que la de OGL . Tenga en cuenta que el estado de la implementación del controlador, la calidad de la API, etc., todo eso cambia demasiado cada año para que pueda confiar totalmente en el rendimiento bruto como argumento para elegir uno u otro. Con esto en mente, elija OpenGL / GLSL para simplificar su vida cuando trabaje (o tenga planes o espere trabajar) con otras plataformas que no sean Windows, use DirectX / HLSL si realmente quiere usar solo plataformas y enfoque de Microsoft y tal vez tener algo bueno API más rápido que OpenGL (esto se está invirtiendo ahora, así que no cuentes con eso); use CG si desea proporcionar ambas posibilidades al usuario, pero si tiene la fuerza de trabajo (y las herramientas) para hacerlo, usar GLSL y HLSL también podría ser una solución viable.
Actualización (2012): es importante tener en cuenta que CG ha sido descontinuado y Nvidia ya no lo respalda ni lo trabaja activamente. Nvidia recomienda que todos los usuarios cambien a una combinación de GLSL y HLSL, o una biblioteca más nueva como nvFX (en github). Esto se debe a que era demasiado difícil mantener la compatibilidad de características entre GLSL y HLSL.
Solo puedo hablar de CG vs HLSL porque esos son los 2 que he usado hasta ahora.
Cg no es lo mismo que HLSL.
En CG, NVIDIA hizo un excelente trabajo al crear una sintaxis de sombreador muy limpia. Es muy similar a HLSL.
Pero , la vinculación con D3D9 / D3D11 (código de inicio, código de compilación del sombreador) es mucho más limpia en HLSL que Cg. -1 Cg. Cg tiene un código de inicio desagradable que ni siquiera necesita tener para HLSL sobre D3D.
En Cg, debe "cgGetNamedParameter" para cada uniform
variable de sombreador que desee establecer / modificar. Y debe mantener una CGparameter
referencia en su código para esa variable
// C++ code to interact with Cg shader variable (shader language independent)
CGparameter mvp = cgGetNamedParameter( vs, "modelViewProj" );
CG::getLastError("Getting modelViewProj parameter"); // check for errors
cgSetMatrixParameterdr( mvp, &modelViewProj._11 ) ; // setting the matrix values
En HLSL, esto termina siendo mucho más limpio, solo una línea, y no tiene que mantener esa CGparameter
variable.
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
En lo anterior, DX_CHECK
es solo una función simple que verifica el HRESULT que se devuelve de la SetMatrix
llamada. El código anterior es d3d9 . D3D10 y 11, por supuesto, son mucho más dolorosos (ya que no hay un objeto ID3DX11Effect).
Antes de comenzar a usar HLSL, solía mirar este código y realmente me ponía celoso .
Aunque NVIDIA hicieron todo lo posible para hacer una interfaz común para CG entre OpenGL / D3D, en la práctica su no de esa manera, y tiene cgGL*
, cgD3D9
, cgD3D10
,cgD3D11
grupos de funciones que lidiar. ¡Así que todo funciona para OpenGL y D3D! reclamo solo va tan lejos. Todavía tiene que envolver todo en #ifdef
grupos de tipo OpenGL / D3D para que funcione en diferentes plataformas. -2 Cg.
Además, recientemente tuve una mala experiencia con las tarjetas Cg / ATI, que estoy bastante seguro de que no es mi mala. (¿Alguien más lo prueba?). Creo que puede ser cierto que NVIDIA no prueba completamente las tarjetas ATI, como afirma Klaim. O que ATI no prueba en Cg. De una forma u otra, hay un desajuste allí y algún tipo de conflicto de intereses. -3 Cg.
En general, preferí Cg. Su sintaxis y denominación de código de sombreador es limpia, dulce y ordenada. Es una lástima que tenga estos otros problemas.
Mi comprensión básica es que HLSL es solo para DirectX y GLSL es solo para OpenGL. Cg es básicamente el mismo lenguaje que HLSL, pero se puede usar con DirectX u OpenGL (aunque a través de un código de tiempo de ejecución diferente).
Otra diferencia crucial entre HLSL y GLSL (no conozco CG así que no puedo hablar por ello) es que con HLSL Microsoft proporciona el compilador de sombreado como parte del tiempo de ejecución D3D mientras que con GLSL su proveedor de hardware lo proporciona como parte de su conductor.
Esto tiene ventajas y desventajas en ambos lados.
Con el método GLSL, el proveedor puede ajustar el compilador a las capacidades de su hardware. Conocen mejor su propio hardware, saben qué hacer y qué no hacer. Por otro lado, la desventaja es que, en un mundo donde hay múltiples proveedores de hardware, existe una situación en la que puede haber inconsistencias entre los compiladores de sombreadores, y el proveedor también tiene un reinado libre completo para fastidiar.
Con el método HLSL, Microsoft controla el compilador. Todos tienen una base tecnológica constante, y si un sombreador se compila con éxito en un lugar, se puede suponer razonablemente que se compilará en todas partes. El mismo sombreador producirá la misma salida compilada independientemente del proveedor (todas las demás cosas son iguales, por supuesto). Por otro lado, el compilador HLSL tiene que ser un "funciona de manera consistente en todo", por lo que no es capaz de sacar ningún truco específico del proveedor para sacar las últimas gotas de jugo del tanque.
Si esto aparece como si tuviera preferencia por la visión HLSL del mundo, es porque lo hago. Me han mordido mucho antes por un comportamiento muy inconsistente en diferentes plataformas, y en un caso incluso tuve que llevar una carga de GLSL a ARB ASM solo para obtener una línea de base que funcionó. El compilador GLSL de NVIDIA se puede ver como particularmente notorio aquí: incluso aceptará la sintaxis y las palabras clave de HLSL, lo que significa que si no tiene cuidado puede terminar produciendo sombreadores que solo funcionarán en NVIDIA y nada más. Es una jungla alla afuera.
He estado usando ambos, comencé con glsl y me mudé a hlsl solo porque el proyecto lo exige. Dada la opción, es glsl todo el camino. glsl se siente muy hábil y hlsl parece que salió de la banca de pasatiempos de un ingeniero.
Es posible que también desee ver el RTSS (Sistema de sombreado de tiempo de ejecución) que viene con Ogre. Es bastante nuevo, pero básicamente escribes sombreadores en código en lugar de archivos externos. Todavía no lo he implementado, pero definitivamente planeo usar esto cuando llegue el momento.
Aquí hay una gran serie de tutoriales en la wiki de Ogre también para escribir sombreadores. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide
En cuanto a su pregunta original, como dijo Praetor, no es realmente una cuestión de pros / contras, es una cuestión de qué sistema de renderización desea utilizar. Dado que usar DX / OpenGL con Ogre es solo cuestión de cargar el complemento, lo más probable es que desee usar el formato .cg.