Shaders Personalizados

Guías sobre cómo escribir tus propios shaders en Wonderland Engine.

Shaders de Vértice vs Fragmento 

En Wonderland Engine, actualmente exponemos APIs para escribir shaders de fragmentos personalizados.

Estructura del Material 

La estructura del material define las propiedades del material para ingresar a tu shader y generar una interfaz de usuario para ello.

Esta definición de estructura nos permite empaquetar eficientemente las entradas del material y generar código de desempacado automáticamente en el marcador de posición {{ decoder }} de tu shader.

Un ejemplo de estructura de material puede verse así:

1struct Material {
2    lowp vec4 ambientColor;
3    mediump uint diffuseTexture;
4    lowp uint shininess;
5    lowp float ambientFactor;
6    mediump float amplifier;
7};

Tipos de Propiedades 

Los siguientes tipos de propiedades son compatibles en combinación con los especificadores de precisión lowp y mediump:

  • float, uint, int: Valores escalares
  • vec2, vec3, vec4: Vectores de punto flotante
  • ivec2, ivec3, ivec4: Vectores enteros

Precisión 

En Wonderland Engine, lowp siempre resultará en un tipo codificado de 8 bits por componente, mediump en un tipo codificado de 16 bits (por ejemplo, un medio flotante) y highp, donde sea compatible, será un tipo codificado de 32 bits.

Sufijos 

Los siguientes sufijos tienen un significado especial:

  • *Color: Generará un selector de color. Usa lowp para colores LDR.
  • *Texture: Generará un desplegable de recursos de textura. Siempre usa mediump.

Alineación de Memoria 

Debido a cómo funciona el empaquetado de materiales de Wonderland Engine, la mayoría de los tipos de vectores requieren alineación a 32 bits. Consulta precisión para ver cómo contar bits por componente.

Símbolos del Preprocesador 

Para compilar partes de un shader por motivos de rendimiento, permitimos una implementación extendida del preprocesador.

Características 

Puedes definir “Símbolos de Característica” en shaders para habilitar y deshabilitar partes de tu shader:

1#define FEATURE_ALPHA_MASKED
2#define FEATURE_NORMAL_MAPPING
3#define FEATURE_VERTEX_COLORS
4#define FEATURE_WITH_EMISSIVE

FEATURE_<name> se usa para definir una característica llamada <name>. Estas serán expuestas en los ajustes de Views > Resources > Pipelines en la lista de “Features”. Si una característica está habilitada, se definirá un símbolo que coincida con el nombre de tu característica, por ejemplo, ALPHA_MASKED en el ejemplo anterior (no FEATURE_ALPHA_MASKED).

Entradas de Fragmento 

Los símbolos prefijados con USE_<input> se utilizan para habilitar entradas del shader. Tienes las siguientes opciones:

SímboloTipoNombre
USE_POSITION_WORLDhighp vec3fragPositionWorld
USE_POSITION_VIEWhighp vec3fragPositionView
USE_TEXTURE_COORDShighp vec2fragTextureCoords
USE_TEXTURE_COORDS_1highp vec2fragTextureCoords1
USE_COLORmediump vec4fragColor
USE_TANGENTmediump vec4fragTangent
USE_OBJECT_IDmediump uintfragObjectId
USE_MATERIAL_IDmediump uintfragMaterialId
USE_NORMALmediump vec3fragNormal
USE_BARYCENTRICmediump vec3fragBarycentric

Includes 

Wonderland Engine viene con un sistema de inclusión de shaders GLSL. Por favor, consulta los shaders existentes para saber qué includes son comúnmente requeridos.

Uniforms 

Algunos uniformes especiales que siempre están disponibles:

UniformeTipoDescripción
viewIndexuintÍndice de la vista actual siendo renderizada.

Para otros, por favor, utiliza los shaders proporcionados con el editor como referencia. Algunos de ellos solo están disponibles cuando se habilitan a través de un símbolo de preprocesador.