Otros

Roca Brillante De Software

09.10.2016

Roca Brillante de Software

OpenGL

‘ve, finalmente, consiguio el renderizado de OpenGL Desterrado con identico resultado en el DX9 y DX11 renderizadores. I’ve todavia tengo un poco de trabajo para apoyar a las partes aburridas de un motor de representacion, tales como el manejo de la ventana cambia de tamano, cambia a pantalla completa, y el manejo de representador de los cambios en tiempo de ejecucion. Pero todo lo que’s de la plataforma de codigo especifico. Lo que realmente importa aqui es que ahora tengo un trabajo de CONTABILIDAD en la aplicacion que en caso de que (con suerte) a la perfeccion el trabajo en OSX y Linux.

‘s una captura de pantalla — lo cual es bastante aburrido, a excepcion de it’s prestados con OpenGL y no’t falta de cualquiera de sus funciones.

las pruebas Iniciales muestran que el procesador OpenGL es en la actualidad no es tan rapido como DX11, pero mas rapido que en DX9. No habiendo incluso trato de una optimizacion de pasar todavia, yo’m bastante contento con el nivel de rendimiento hasta ahora.

Llegar a OpenGL trabajo ha sido un poco de una experiencia de aprendizaje. Me habia’t GL usado desde el 2003 — y, obviamente, it’s cambiado mucho desde 1.1 a 4.5. Al menos ya no tengo que usar un monton de extensiones (pero todavia un par!).

Para soportar una gran variedad de sistemas, I’m limitar el renderizado utilizando la version 3.2. Me gustan algunas de las funciones de la API de OpenGL/GLSL 4 mejor, pero 3.2 apoya en todo lo Desterro necesidades, y, potencialmente, apoya todo lo que’d necesidad para el futuro de los juegos en los proximos anos.

Ahora que tengo OpenGL de trabajo, puedo’t dicen que’s mejor o peor que Direct3D 9 u 11 (no es que no me di’t hacer un poco de gritos y pasar a cara, mientras que llegar a la aplicacion de trabajo). I don’t como la API, como algunos otros, pero yo’ve consiguio un mucho de los anos de sesgo en los graficos Api.

En el final de it’s todavia acaba de llegar triangulos en la pantalla de mapeado de texturas con algunas de fantasia shader los programas que se ejecutan. En el momento que yo’cinco utilizado un nuevo sistema de it’s requiere de una nueva plataforma de procesador especifico — Playstation 2, 3, GameCube, Wii, Xboxs, etc, todo uso de diferentes APIs, y en el final se puede obtener la misma imagen en la pantalla al final del dia. El uso de GL realmente no es muy diferente. Cuando Vulkan, y el Manto, y DX 12 se utilizan mas ampliamente, I’ll hacer todo esto de nuevo, pero probablemente con diferentes juegos.

Sombreado Idiomas

Asi que para mejor o peor, yo’cinco disenado mi propio lenguaje de sombreado, escrito un compilador que lo analiza, da errores sintacticos y semanticos, y si no hay errros, los resultados del programa en varios otros lenguajes de sombreado. De esta manera, puedo escribir un sombreado de una vez y destino de multiples plataformas. Y ademas, ahora tengo el Dragon Libro!

En linea con GLSL, HLSL, PSSL, y los otros, I’m llamando a mi idioma SRSL de Roca Brillante Lenguaje de Sombreado. I’m serio debate llamando SRSLY, debido a que’s divertido, y los buhos son cool. Solo tengo que decidir lo que la Y representa. O no.

la Definicion de la totalidad de la gramatica y todo el lenguaje extensivo de las reglas es, probablemente, mas alla del alcance de este post, asi que’ll solo estara dando una vision general y un monton de ejemplos.

en Primer lugar algunos conceptos basicos:

El cuerpo de texto de los shaders es muy C como y debe ser facil de entender que vienen de otros lenguajes de sombreado. SRSL tiene todas las funciones intrinsecas de you’d esperar de HLSL o GLSL. punto, cruz, reflexionar, abrazadera, sin, cos, de paso, lerp, saturar, etc.

‘ll aviso de que todos los tipos en los ejemplos son HLSL estilo — float, float2, float3, float4, int, int2, uint, uint2, float4x4, etc. Yo prefiero esto a traves de GL estilo vec, ivec, uvec, y mat4. Creo que el HLSL estilo comunica mas y mejor informacion acerca de la incorporada en los tipos.

a pesar de que ninguno de estos ejemplos se muestra que, mientras que los bucles, hacer loops, para los bucles y condicionales estan disponibles en el idioma. Sin embargo interruptor de declaraciones no estan implementadas.

Una diferencia de C como de las lenguas es para el casting de las variables entre los tipos. En primer lugar, no existe un sistema automatico de fundicion entre int y tipos float tipos, como HLSL. Ademas, si usted tuvo una int4 y queria echarlo a float4, El estilo de C mon seria:

Pero SRSL utiliza una izquierda a derecha legible post-fix op:

Otra diferencia es la declaracion de matrices. En SRSL, las matrices se definen con el tamano de la matriz, como parte de la definicion de tipo, asi:

Mientras que el C declaracion de estilo podria ser:

El lenguaje no tiene ninguna de las variables globales. Todo se pasa para el sombreado y el punto de entrada si una funcion necesita, tiene que ser pasado como parametro. I’m bastante seguro de que’ve rara vez o nunca se usan variables globales en el shader de programacion por lo que no he’t veo en la necesidad inmediata de la lengua. (Obviamente en otros idiomas vertice atributos, los uniformes y las texturas pueden ser globales, pero que’s no es lo que’m hablando aqui.)

El unico caso de uso puedo pensar en tener variables globales son constantes desea definir de una vez, como pi, o la magia de los numeros utilizados en mas de un lugar. Pero en lugar de anadir otra caracteristica del lenguaje, las funciones se utilizan para devolver valores constantes. Debido a shader compiladores agresivo alineaciones, la llamada siempre va a desaparecer y ser una constante en la asamblea.

Por ejemplo:

en Lugar de algo como:

Asi que ahora me’ll obtener derecho a ella, dejar’s echar un vistazo a un shader. Aqui’s el cuerpo de la mas simple sombreado utilizado en Desterrado.

Mi primera meta fue el idioma para tratar el vertex shader, geometria de sombreado, sombreado de pixeles, etc como un solo programa -‘re escriben normalmente como parejas y trios (o sin embargo muchos etapas estan en uso), por lo que el lenguaje debe tratar como tal. Debe ser dificil escribir un programa valido en donde las piezas de la tuberia (vertice, de la geometria, de pixel) no’t sync’d por defecto, sin embargo, la escritura de una sola fase de canalizacion debe ser posible si es necesario.

La forma en que el lenguaje se ve a la canalizacion de graficos es una secuencia de datos, seguido por el codigo, que genera un flujo de datos y, a continuacion, mas el codigo se ejecuta, y otro flujo de datos de salida.

Si alguna vez vuelvo a agregar calcular el estilo de shaders para el idioma, es probable que’t siga este paradigma — como shaders de computo no’t necesariamente va a ser utilizado para poner los pixeles en la pantalla. Pero ya que’s en mi propio idioma, siempre se puede anadir sintaxis especifica para lo que necesito.

de todos modos, flujos de datos estan definidos por una estructura. Cada uno de los miembros de la estructura que puede tener un atributo que se une a un recurso de hardware especifico. Atributos’t, excepto en unos pocos casos — como el espacio de la pantalla de posicion, indice de instancia, vertice indice de profundidad de salida, etc. Todos los. 0. 1. 2, la asignacion de tareas a continuacion son opcionales, y el compilador asignara a ellos si no’t especificado.

Para cualquier shader, la secuencia definida anteriormente es asignado automaticamente una variable definida por el llamado ‘entrada’. y la corriente despues de que se define como ‘salida’.

muchas veces, desea que varios de los sombreadores de pixeles por vertex shader, o viceversa. En ese caso, puede definir varios shaders entre las corrientes. I’d uso para la prueba de alfa, diferente textura de la mezcla, pelar o morphing vertices, etc. Mientras los arroyos son los mismos para los shaders usted puede escribir algo como esto:

Este tambien muestra como se puede escribir solo pixel shader, sin el vertex shader anterior.

Otro de los objetivos del diseno que tenia era para quitar codigo repetitivo en los shaders. Esto suele pasar bastante cuando usted tiene un monton de similar shaders con pequenas diferencias. Un margen extra de iluminacion de relieve, o aspectos de un modelo. Estos son los mismos como base de sombreado con solo un par de lineas anadio.

por Lo que el lenguaje le permite insertar codigo de sombreado en un definido previamente shader. En el siguiente ejemplo, el sombreado ‘psalpha’ deriva de ‘sal’ — todo el codigo del cuerpo se utiliza y, a continuacion, el clip de la instruccion se anexa en la parte inferior. Esta es una operacion muy comun cuando la definicion de algunas de sombreado donde es necesaria la version que descartes pixeles basandose en el canal alfa.

No solo se puede anexar codigo al final de un shader, pero puede insertar en algun lugar en el medio el uso de una etiqueta.

a Continuacion es un shader que calcula la posicion de un vertice para su uso en la sombra de la cartografia. Nota: la etiqueta de la palabra clave. En ese lugar, cualquier vertice puede ser modificado en el espacio local si el codigo se inserta alli.

Cuando una piel de modelo debe representar en el mapa de sombras, solo el desuello de los vertices que se pueden insertar en la etiqueta positionmod. Tenga en cuenta que la corriente de entrada para este shader es diferente, pero en la medida en que contiene todas las entradas de la matriz de sombreado, se compilara bien.

En este punto, usted puede estar preguntandose acerca de esta fantasia codigo de insercion caracteristica del lenguaje, y por que yo’m no solo el uso de macros o funciones a hacer lo mismo.

Con funciones, cada shader tendria una larga lista de llamadas a la funcion, con muchos parametros, y muchas declaraciones por fuera de los parametros que son utilizados por diferentes partes del shader. En mi experiencia los shaders son muy volatiles durante el desarrollo de la — cambian todo el tiempo como caracteristicas se anaden o se eliminan, o las nuevas ideas son puestas a prueba. Firmas de funcion cambian con frecuencia. Si una funcion de los cambios de firma, I’d no pasar el tiempo para cambiar de 50 o 100 shaders para la actualizacion de los parametros de llamada. It’s mas facil tener todo el codigo en linea y permitir que las variables de un sombreado a que se accede sin problema en otro.

Al menos, que’s la idea de -‘s funcionado bien para reducir el tamano del codigo de Desterrado, y se espera que lo hagan para futuros proyectos.

Macros son algo que’m no se interesan en la aplicacion en el idioma, sin embargo hay’s que un simple preprocesador en los idiomas tokenizer, con un simple #if, #ifn, #define, #else, #final, y #include. Permite diferentes compilacion basada en el blanco y caracteristicas, y para el reparto de funciones comunes y estructuras.

Usted puede ver algo como esto en el sombreado, para deshabilitar el calculo de la sombra de asignacion de coordenadas en el menor shader niveles de detalle.

no Hay ningun requisito para que el preprocesador de tokens para ser el primer elemento en una linea, asi que usted puede tambien ver algo como esto con un condicional compilar en linea. DirectX 9 no tiene ninguna instancia de entrada como un shader de la variable, asi que tiene que ser alterada de alguna manera. En Desterrado, it’s en la actualidad como esto:

Funciones pueden ser definidas fuera de un bloque de programa para la funcionalidad compartida, y el aspecto de tipico estilo de C funciones:

Shaders usar mas de vertice entradas — tambien hay uniforme constantes y texturas que se deben pasar para el sombreado. En el diseno de la lengua, yo queria que el uso de constantes y las texturas y sus enlaces a los registros que se ven exactamente como la union secuencia de variables a registros de hardware.

Si se mira hacia atras en el primer ejemplo que se me presento, el vertex shader utiliza varias constantes, es decir, tc y gc. Estos se definen como esto:

Cuando usted desea utilizar un conjunto de vertices constantes en un programa de sombreado de it’s se hace referencia como esto:

La idea aqui es que hay’s no hay necesidad de un monton de flojos global uniforme constantes (constante o buffers) como en HLSL y GLSL. El programa de acogida solo proporciona ciertas constantes, y que son conocidos en general por el programa de sombreado y estan disponibles todo el tiempo. De esta manera son explicitamente definidos, y una vez que la instalacion se’s duro para hacer un error, como el uso de una constante y uniforme, destinada a un pixel shader en un vertex shader.

Para los casos en que las constantes son diferentes, es decir para la elaboracion de un tipo especifico de geometria, un conjunto de constantes que podria ser especificado asegurarse de que solo los constantes disponibles son en realidad utilizados por el sombreado.

las Texturas son definidos de una manera similar. La textura de la estructura solo puede contener tipos de textura.

‘m va divagando un poco aqui, y que’ll ver algunos de mi proceso de pensamiento a la hora de disenar este idioma. El lenguaje es todavia nuevo y puede necesitar algunos ajustes — este es uno de esos lugares.

Si usted’he estado cerca de prestar atencion a cualquiera de los ejemplos, que’ll aviso de una flagrante incoherencia con los uniformes y las texturas versus el sombreado de entradas y salidas. Shader entradas y salidas se definen automaticamente las variables de entrada y de salida de tipo — de entrada.posicion de entrada.texcoord, de salida.posicion de salida.color, etc.

las Texturas y los uniformes se utilizan actualmente sin nombre y las variables dentro de la estructura son simplemente declarado como locales para el sombreado. Esto esta bien. Pero yo’he estado tratando de decidir si debo hacer esto en consonancia con el resto de entradas del sombreado.

en la Actualidad los uniformes y las texturas se accede tales como:

Pero yo’he estado pensando en cambiar a

me gusta este cambio para un par de razones. En primer lugar, it’s consistente con la manera en que los arroyos que se manejan, y en segundo lugar, se detiene de forma inadvertida contaminantes a la variable local de espacio de nombres con involuntaria de los nombres que usted puede usar de otra manera. Un dia yo podria agregar una nueva textura a una estructura, y que’s nombre de enfrentamientos con un local existente en un sombreado — la exigencia de un cambio de nombre a un elemento u otro.

En el otro lado, arroyos podria tener la entrada. y de salida. cayeron tambien, pero demasiado a menudo, quiero poner el mismo nombre en ambas estructuras (posicion, texcoord, color, etc) de modo que se inician con introduccion. y salida. es mejor en mi opinion.

En el caso de las texturas, yo podria querer una textura llamada difusa y una variable llamada difusa para representar el color resultante cuando las texturas es muestreada.

‘s agradable y bastante claro en cuanto a lo que la variable tiene.

El verdadero inconveniente aqui es de los uniformes. Tener que escribir algo como ‘uniforme.gc.worldToProjection ‘ todo el lugar puede ser demasiado detallado, sin embargo it’s absolutamente claro lo que’s pasando. Se me ocurren un par de formas para reducir la longitud, tales como permitir que un nombre especificado por el usuario cuando se declara uniformes y texturas tales como…

En el otro habia, podia ambito de las texturas con una variable y dejar los uniformes solo. Realmente esto es solo el azucar en la lengua. Funciona bien como esta, y yo’ll probablemente una decision de una u otra manera cada vez lo uso mas.

Cambiar Desterrado el uso de la nueva lengua (una vez que el compilador fue escrito y depurado) ha sido bastante indoloro, y la reduccion en el codigo de redundancia es muy buena. I’cinco en realidad, se encuentran varios errores en el original codigo de sombreado al hacer la conversion, ?Vaya!)

Desterrado tambien ha sido un buen banco de pruebas para una variedad de shaders — creo que seria dificil disenar algo como esto sin un mundo real de casos de prueba.

Todo esta casi listo, pero me’m seguro de que el compilador todavia tiene bugs en lo que yo’ll encontrar como escribir mas shaders. Tambien hay caracteristicas que faltan de I’d gustaria anadir en algun momento. Dependiendo de lo que mas me’m trabajando no puedo agregarlos hasta que la necesito.

Hay’s en la actualidad ninguna textura de tipo de matriz, sin embargo, y no hay’t las funciones de muestreo para especificar que el mip a utilizar. (pero un nuevo tipo de textura y de la funcion de muestreo son bastante faciles de agregar). No hay matrices multidimensionales, pero puedo’t pensar en la ultima vez que incluso se utiliza uno en C++. La geometria del soporte shader isn’t terminado. Y hay’s no teselacion de sombreado como de ahora.

Ufff. Don’t engane a si mismo, y los compiladores de lenguajes son los grandes proyectos.

de Modo que’s SRSL (o SRSLY…) en una cascara de nuez. Funciona, puedo dibujar cosas a traves de el, it’s cross platform ready. Ahora por fin puedo terminar la grafica OpenGL renderer. Woot.

Portabilidad: OpenGL y Shaders

Obtener una nueva API de graficos de ejecucion existentes en un motor de juego es algo doloroso -‘s siempre algun tipo de problema o de arquitectura de supervision que no’t se funden bien con el nuevo Api. Pero el motor del juego para Desterrado esta escrito de tal manera que resumen toda la funcionalidad grafica detras de una API comun, por lo que la portabilidad no es’t tan terrible como podria ser. El juego ya se puede cambiar entre DirectX 9 y 11 en tiempo de ejecucion, por lo que la adicion de OpenGL a la mezcla deberia’t ser demasiado malo.

sin Embargo, hay’s de una masa critica de codigo necesario para obtener la mas simple de graficos para mostrar.

Vertex Buffers necesitan ser implementadas para almacenar los datos de la malla, como el Indice de Buferes. Vertice Disenos deben ser definidos para decirle a la GPU como leer que los datos de la malla. Constante Buffers necesarios para enviar constante y uniforme de datos a la GPU para su uso en pixel y vertex shaders. Estado de procesamiento de las necesidades de una aplicacion — se dice que el GPU de como mezclar la nueva geometria en la escena (transparente, solido, etc), como actualizar la profundidad y de la plantilla de memoria, y como cada triangulo obtiene rasterizan. Vertex Shaders son necesarios para transformar los datos de la malla en algo que’s de un triangulo en la pantalla, y Pixel Shaders son necesarios para leer las texturas, la realizacion de la iluminacion, y la salida de la final de color para cada pixel.

Todo lo que acaba de obtener una simple triangulo en la pantalla.

una Vez que el triangulo que se muestra, texturas necesitan ser apoyados -‘s Texturas 2D, Cubemaps, formatos comprimidos, mipmaps, copiar las texturas, y el escalado de imagenes — un monton de codigo. A continuacion, Procesar las Metas necesitan ser puestos en practica para ser capaz de hacer fuera de la pantalla, buferes y representar mapas de sombras.

Solo entonces el renderizador de ser completa. Una vez que tengo todo lo que el codigo hecho, el juego solo debe visualizarse correctamente con OpenGL. It’s que todo el codigo comun en el nivel de dibujo de un edificio, el terreno, interfaz de usuario, o cualquier otra cosa.

‘s solo alrededor de 80 kb de codigo, pero conseguir que todo derecho lleva algun tiempo de depuracion.

OpenGL tiene un par de elementos que DirectX no’t — como Vertice de la Matriz de los Objetos y de los Programas de Sombreado que pre enlace de vertex y pixel shaders. No es una gran oferta, pero estos son cosas de mi motor era’t disenado alrededor, asi que hay un par de aros para saltar a traves.

Todos los de esta aplicacion es bastante mecanico — con una buena OpenGL referencia nada de esto es terrible — pero yo’he estado luchando con como implementar un articulo en particular, y que’s vertex shader y pixel shaders.

En su forma mas simple, un shader es un pequeno programa que le dice a la GPU como tratar con los datos de la malla, o como el color de un pixel. Cada una de las API de DirectX 9, 11, OpenGL) tienden a tener que’re el propio camino de la especificacion de estos programas. Para cada API, una version ligeramente diferente del mismo programa es necesario.

Por ejemplo, aqui’s que un simple programa de vertice escrito para DirectX 9, HLSL para Shader Model 2.0/3.0. (No me di’t realmente compilar cualquiera de estos… asi que perdonen los errores de menor importancia)

‘s el mismo vertice programa, escrito para DirectX 11 — HLSL 4/5 — bastante similares, pero hay algunas diferencias. Hay mas diferencias en los casos mas complejos, tales como la textura de muestreo y el trato con la entrada y salida de los registros.

Ahora, el OpenGL GLSL version 3.3:

en la Actualidad, el motor de juego soporta DirectX 9 y 11 — y los shaders son lo suficientemente cerca como para ser capaz de cambiar entre ellos mediante algun codigo generado por las constantes y algunas macros para dar cuenta de las diferencias de idioma. It’s probable que sea posible hacer lo mismo con GLSL, pero yo’m no tiene interes en hacerlo.

‘m generalmente no es un codificador que las preocupaciones sobre el futuro de correccion de codigo — yo escribir lo que tengo ahora, y refactorizar cuando sea necesario. Pero yo ya refactorizado mi shaders cuando he anadido DirectX 11 codigo, y yo’m lo vuelve a hacer ahora para OpenGL’s GLSL idioma.

Si un dia quiero incluir soporte para otro hardware que tiene Gpu programable, mas versiones de estos programas son necesarios. Desterrado ya ha 50-60 diferentes shaders, por lo que para cada nueva plataforma compatible, hay’s de los mismos programas para la implementacion de mas y mas. Hay’s ya otros lenguajes de sombreado por ahi que yo’m no en la actualidad la orientacion, pero puede hacerlo en el futuro — Hay diferencias de OpenGL ES, OpenGL 2, OpenGL 4, Vulkan, Xbox 360, Xbox One, PS3, PS4, AMD Mantle y DirectX 12. Hay’s probablemente mas I don’t sabe acerca de.

Hay un par de soluciones a esto:

Opcion 1. Tratar con multiples versiones.

  • Esto no es realmente ideal. Lo’s frustrante es aqui en desarrollo, estos shaders son a menudo en flujo — y actualizacion de los muchos programas que hacen lo mismo es propensa a errores y un poco desperdicio de tiempo.

Esto seria como escribir Desterrado en C en OSX y C++ en Windows. It’s no mucho codigo, pero usted consigue la idea. No tiene mucho sentido para la implementacion de la misma cosa de diferentes maneras cuando el resultado es identico.

Peor es que desde que uso la PC para el desarrollo, I’d probablemente conseguir perezoso, solo actualizar el PC shaders, y luego cuando quiero probar en otra plataforma, tendria que pasar todo el dia en la actualizacion de los shaders en otros idiomas.

Opcion 2. El uso de macros, buscar/reemplazar, y parcialmente el codigo generado para dar cuenta de las diferencias de idioma.

  • Esta es la opcion que esta actualmente en uso. Funciona, pero’s no a prueba de futuro. El mas idiomas que son compatibles, el mas macros se utilizan, y el desordenado el codigo llega a mirar. Si you’ve gastado tiempo modding Desterrado y miro a los shaders, que’ll aviso a toda la basura alrededor del cuerpo del texto de los shaders para hacerlos compatibles solo con DX9/11.

Hay’s tambien una gran cantidad de #ifdef/#else/#endif secciones de codigo para dar cuenta de las diferencias entre los dos. It’s complicado.

puedo conseguir que esto funcione para OpenGL, pero todavia se requiere al menos uno mas de refactorizacion de todos los shaders.

Opcion 3. El uso de una herramienta existente, como HLSL2GLSL

  • Esta es una buena opcion. Hay algunas herramientas para convertir de HLSL para GLSL, pero don’t soportar tantos idiomas como yo’d como. Se podria trabajar para la version de OpenGL de Desterrado, pero que’s sobre el.

yo probablemente podria modificar la herramienta para la salida de otros idiomas, pero realmente no’t gusta jugar con otras personas’s de codigo. (Si, yo’m uno de los codificadores…)

Ademas de I’d prefieren el lenguaje que uso no ser puro HLSL de alguna version en concreto. I’d como un lenguaje que pueda ser actualizado para soportar nuevas caracteristicas de hardware. Nvidia siempre el centro de gravedad de idioma por un tiempo, que se enfoco en muchas plataformas, pero el desarrollo ha sido descontinuado, por lo que’s no ir para la preparacion para el futuro.

Opcion 4. El diseno de un nuevo lenguaje de sombreado que se puede leer en y, a continuacion, la salida en cualquier idioma.

  • Para mi, esta es la mejor opcion, pero uno que’he estado tratando de decidir si se’s vale la pena el esfuerzo. Yo, basicamente, tendria que escribir un compilador. It’s no una pequena empresa, pero tiene sus ventajas.

Hay cosas que nunca me gusto HLSL, y yo’m hallazgo que don’t como GLSL que mucho. Ambos idiomas son muy C como, pero don’t necesidad de ser — I’d en lugar de ver a un lenguaje que esta disenado en torno al hardware, en vez de mirar como el codigo que todo lo demas esta escrito con una sintaxis especial, solo para unirse a ciertas variables de caracteristicas de hardware.

en Mi propio idioma daria la libertad para implementar las funciones que necesito, y agregar caracteristicas a medida que se necesitan. I’he estado pensando acerca de mi ideal lenguaje de sombreado por un tiempo (por ser un programador grafico y todo), pero nunca vio la necesidad de hacerlo.

Con mi propia lengua, mi motor se convertiria API agnostico. I’ve consiguio mi propia graficos de la capa de todos modos, que oculta la plataforma de detalles especificos, por lo que tener un lenguaje de sombreado para que coincida tendria sentido.

Ademas de que no habia escrito un compilador, it’s una de esas tareas de programacion que mis dedos estan rogando a implementar.

Para ello, bastante caracteristica completa compilador con un adecuado analisis sintactico, semantico, la comprobacion de tipo de controles, tablas de simbolos, lleno de mensajes de error, y mas seria necesario. It’s de un gran proyecto.

la Opcion 5 — OpenGL Solo

  • yo podria limitar el motor para el uso de OpenGL. Sin embargo, esto es mas restrictiva que la de I’d como.

seria compatible con Windows, OSX y Linux, pero en el futuro lo que me limita a trabajar solo en OpenGL sistemas. Concedido, it’s un muy amplio conjunto de sistemas, pero I don’t veo ninguna razon para hacer esto ya que ya tengo DirectX implementaciones de trabajo y un marco para el apoyo de varias Api para graficos y hardware.

‘d como hacer juegos de la consola de nuevo un dia, y OpenGL tiende a no ser, o no,’t la base de la biblioteca de graficos, que da pleno de la GPU de control.

Opcion 6 — Grafico de Nodos Alternativos o la Representacion

  • Shaders podria ser construido con una alternativa de representacion, como el grafico de nodos editor de materiales en Irreal y algunos otros motores de juego. La idea es utilizar pequenos bloques, cada uno con su propio fragmento de codigo, y las une visualmente. Para cada idioma de destino, un fragmento de codigo seria utilizado por el nodo.

Este tipo de sistema puede ser una gran herramienta para la generacion de prototipos de funciones y permite a los no-programadores para generar shaders. It’s bastante duro para generar el codigo no valido. Tambien permite multiples tipos de salidas para cualquier lenguaje de sombreado.

sin Embargo, este tipo de herramienta se necesita un poco de codigo para implementar, un poco de la interfaz de usuario. Hay’s todavia una significativa generacion de codigo de paso, y de la mano de codificacion de cada nodo en el grafico para cada idioma. En un entorno sin necesidad de un gran numero de artistas, esto tambien puede ser excesivo en terminos de un conjunto de herramientas.

El motor de juego, que Desterrado se ejecuta unicamente en el texto las entradas sin ningun tipo de herramientas visuales, por lo que la adicion de este tipo de herramienta probablemente no’t hacer un monton de sentido.

Decision?

‘m de escritura de un compilador. It’s la solucion mas flexible, de modo que’s lo que’he estado trabajando en los ultimos dos meses (bueno, un par de otras cosas tambien, entre otras herramientas, y va a GDC)

‘he estado pensando acerca de este problema de idioma por un largo tiempo, el diseno y el cambio de la sintaxis, y asegurarse de que se puede extender a geometry shaders (y otras caracteristicas de hardware) en algun momento. I’ve tambien a observar el conjunto de caracteristicas que todos los lenguajes de sombreado estan proporcionando y asegurarse de que puede proporcionar el conjunto completo de caracteristicas que se necesitan para los juegos que hago y el hardware de e’m orientacion.

Mientras que’s sido un lento camino a la obtencion de hecho, yo’m bastante seguro de que en este punto de mi propio idioma que es justo lo que necesita y tiene una sintaxis limpia es lo mejor.

todavia tengo que hacer uno mas refactorizar de todos los shaders en el juego — pero como que’s requiere de todos modos, independientemente de lo que tengo que hacer para hacer OpenGL trabajo. Si me acaban de trasladar Desterrado a alguna otra plataforma con diferentes API de graficos, I’ll ser capaz de escribir una nueva salida para el compilador. El siguiente juego que hacen que acaba de ser portable a cualquier sistema.

En este punto me’ve consiguio la mayoria de las compilador escrito. Lee en mi sintaxis y de salida se puede GLSL 3.2, HLSL 2/3 y 4/5 y yo’ve convertido suficiente shaders que la interfaz de usuario de terrenos y edificios se muestran en el juego.

Como un lado los motivos, las I’m emocionado de estar escribiendo un compilador — me hace empezar a pensar que el siguiente juego que hago, posiblemente, podria tener un lenguaje de scripting de codigo de juego — pero que’s una forma fuera.

Descripcion del articulo: se utiliza software

Fuente:
Roca brillante de Software

Також ви можете прочитати