GLSLFX Shaders

Los archivos GLSLFX constituyen el puente entre la aplicación y los archivos de sombreador glsl.
Permite utilizar cualquier sombreador glsl sin tener que modificar el código.

Formato de archivo

GLSLFX formato es un archivo XML. Se admiten comentarios.

Encabezado y nodo raíz

El elemento nodo raíz XML se denomina glslfx.

<?xml version="1.0" encoding="UTF-8"?>

<glslfx version="1.0.0" author="allegorithmic.com">

    <!-- BODY -->

    <!-- ... -->

</glslfx>

Cuerpo

Técnica

Elemento XML que describe una técnica. Una técnica es una variación del FX actual. Un GLSLFX puede contener múltiples técnicas, pero al menos una técnica debe ser definida.

La geometría se renderizará con una de las técnicas definidas por la aplicación.

Definición de elemento XML

Técnica Name:

Atributos:

  • nombre: Cualquier cadena utilizada para nombrar la técnica

El elemento XML puede tener varios elementos secundarios. Los elementos definidos en una técnica sustituyen a los elementos definidos globalmente.

Por ejemplo, se utiliza para invalidar algunos valores de uniformes y obtener la variación de FX para esta técnica.

Pase de renderizado

Elemento XML que describe una pasada de procesamiento. Una pasada de procesamiento describe la representación de la geometría.

Una técnica puede contener varias pasadas de procesamiento que se ejecutarán secuencialmente. Una técnica que no contiene ninguna pasada de procesamiento es equivalente a una técnica que contiene una pasada de procesamiento en pantalla.

Los elementos definidos en una pasada de procesamiento reemplazan a los elementos definidos en la técnica principal.

Definición de elemento XML Nombre: paso

Atributos:

  • output

  • fuera de pantalla: El procesamiento se realizará en destinos de procesamiento definidos por el usuario

  • en pantalla: El procesamiento se realizará en el destino de procesamiento predeterminado

Sombreadores

Establezca los archivos de sombreado GLSL para cada tipo.

Definición de elemento XML:

Definición de elemento XML

Sombreador Name:

Atributos:

  • tipo: El tipo de sombreador GLSL;

  • nombre de archivo: Ruta de acceso del archivo de sombreado glsl. Puede ser absoluto o relativo al archivo GLSLFX;

  • primitiveType: El método para representar lo primitivo.

table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2
Valor ‘type’ Descripción
punto vertical Sombreado de vértices
geometría Sombreador de Geometría
tess_control Sombreador de control de teselación
test_eval Sombreador de evaluación de teselación
fragmento Fragmentar sombreador
table 0-row-2 1-row-2 2-row-2 3-row-2
Valor ‘primitiveType’ Descripción
punto Procesar como puntos
lineloop Procesar como bucle de línea
parche[1…N] Procesar como parches con vértices [1…N]

Propiedades

Permita configurar alguna parte del estado de OpenGL.

Definición de elemento XML

Propiedad Name:

Atributos:

  • nombre: Nombre de la propiedad que se va a establecer. El nombre se basa en la función OpenGL o en el nombre glEnum:

    • Sintaxis de ENUM: Sin el prefijo ‘GL_’, en minúsculas. Ejemplos: glEnable(GL_FUSIÓN_ENABLE) => “”“, glDisable(GL_CULL_FACE) => “””
    • Sintaxis de funciones: sin el prefijo ‘gl’, en minúsculas y con todas las palabras separadas por el carácter ‘_’. Ejemplo: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”
  • Sintaxis de ENUM: Sin el prefijo ‘GL_’, en minúsculas. Ejemplos: glEnable(GL_FUSIÓN_ENABLE) => “”“, glDisable(GL_CULL_FACE) => “””

  • Sintaxis de funciones: sin el prefijo ‘gl’, en minúsculas y con todas las palabras separadas por el carácter ‘_’. Ejemplo: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”

  • valor: El valor de la propiedad.

table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 5-row-3 6-row-3 7-row-3 8-row-3 9-row-3 10-row-3 11-row-3 12-row-3 13-row-3 14-row-3 15-row-3 16-row-3 17-row-3 18-row-3 19-row-3 20-row-3 21-row-3 22-row-3 23-row-3 24-row-3 25-row-3 26-row-3 27-row-3 28-row-3 29-row-3 30-row-3 31-row-3 32-row-3 33-row-3 34-row-3 35-row-3 36-row-3 37-row-3 38-row-3 39-row-3
Valores ‘name’ Valores ‘value’ Descripción
blend_enabled booleano Activar o desactivar el modo de fusión
true
falso
blend_func cadena, cadena Definición de las funciones de fusión de origen y destino
cero para OpenGL enum GL_ZERO
uno para OpenGL enum GL_ONE
src_color para OpenGL enum GL_SRC_COLOR
one_minus_src_color para enumeración de OpenGL GL_ONE_MINUS_SRC_COLOR
dst_color para OpenGL enum GL_DST_COLOR
one_minus_dst_color para enumeración de OpenGL GL_ONE_MINUS_DST_COLOR
src_alpha para OpenGL enum GL_SRC_ALPHA
one_minus_src_alpha para enumeración de OpenGL GL_ONE_MINUS_SRC_ALPHA
dst_alpha para OpenGL enum GL_DST_ALPHA
one_minus_dst_alpha para enumeración de OpenGL GL_ONE_MINUS_DST_ALPHA
constante_color para OpenGL enum GL_CONSTANT_COLOR
one_minus_constant_color para enumeración de OpenGL GL_ONE_MINUS_CONSTANT_COLOR
constante_alfa para OpenGL enum GL_CONSTANT_ALPHA
one_minus_constant_alpha para enumeración de OpenGL GL_ONE_MINUS_CONSTANT_ALPHA
src_alpha_saturate para enumeración de OpenGL GL_SRC_ALPHA_SATURATE
src1_color para OpenGL enum GL_SRC1_COLOR
one_minus_src1_color para enumeración de OpenGL GL_ONE_MINUS_SRC1_COLOR
src1_alpha para OpenGL enum GL_SRC1_ALPHA
one_minus_src1_alpha para enumeración de OpenGL GL_ONE_MINUS_SRC1_ALPHA
cull_face_enabled booleano Activar o desactivar el sacrificio de caras
true
falso
cull_face_mode cadena Definir el modo de sacrificio de caras
frente para OpenGL enum GL_FRONT
posterior para OpenGL enum GL_BACK
front_and_back para enumeración de OpenGL GL_FRONT_AND_BACK
profundidad_func cadena Definir la función de comparación de profundidad
nunca para OpenGL enum GL_NEVER
menos para OpenGL enum GL_LESS
lequial para OpenGL enum GL_LEQUAL
igual para OpenGL enum GL_EQUAL
notable para OpenGL enum GL_NOTEQUAL
gequal para OpenGL enum GL_GEQUAL
mayor para OpenGL enum GL_GREATER
siempre para OpenGL enum GL_ALWAYS

Uniformes

Permite anular algunos uniformes definidos globalmente o en la técnica principal. Esto permite cambiar el comportamiento del sombreador para esta técnica o pasada de renderizado.

Consulte la sección Uniformes a continuación para obtener más detalles sobre su definición.

+++Ejemplo

+++

Destinos de procesamiento

Para las pasadas de procesamiento ‘fuera de la pantalla’, los destinos de procesamiento deben definirse en la pasada de procesamiento.

Definición de elemento XML

Salida de Nombre:

Atributos:

  • archivo adjunto: El punto de conexión de OpenGL, inspirado en los nombres de OpenGL:
    GL_COLOR_ATTACHMENT[0.3] => ‘color[0.3]’
    GL_PROFUNDIDAD_ATTACHMENT => ‘profundidad’

archivo adjunto: El punto de conexión de OpenGL, inspirado en los nombres de OpenGL:
GL_COLOR_ATTACHMENT[0.3] => ‘color[0.3]’
GL_PROFUNDIDAD_ATTACHMENT => ‘profundidad’

  • nombre: el nombre del destino de procesamiento.
    Se puede utilizar en una pasada de procesamiento posterior para enlazar este destino de procesamiento como un muestreador.

nombre: el nombre del destino de procesamiento.
Se puede utilizar en una pasada de procesamiento posterior para enlazar este destino de procesamiento como un muestreador.

  • formato: el formato interno del destino de procesamiento.

formato: el formato interno del destino de procesamiento.

  • claro: atributo opcional que define un valor claro.
    Si está presente, el destino de procesamiento se borrará hasta este valor al principio de la pasada de procesamiento.
    Si falta, el destino de procesamiento mantendrá su contenido anterior.
NOTE
Los destinos de procesamiento de color están prohibidos en una pasada de procesamiento "en pantalla", pero un destino de procesamiento de profundidad se puede compartir con cualquier pasada de procesamiento (pero es probable que se interrumpa el procesamiento al mezclar varios materiales en la escena).

Acerca de los formatos

Para los formatos de profundidad, se admiten todos los formatos OpenGL de solo profundidad (sin galería de símbolos):

  • GL_PROFUNDIDAD_COMPONENT16 => ‘profundidad26’
  • GL_PROFUNDIDAD_COMPONENT24 => ‘profundidad34’
  • GL_PROFUNDIDAD_COMPONENT32 => ‘profundidad42’
  • GL_PROFUNDIDAD_COMPONENT32F => ‘profundidad42f’

Para los formatos de color, el nombre se basa en nombres de enumeración de OpenGL, sin el prefijo ‘GL_’, en minúsculas.
No se admiten tres formatos de canal (RGB); en su lugar, utilice un formato RGBA.
Profundidad de bits por canal admitida:

  • Entero sin signo normalizado: 8, 16
  • Punto flotante: 16, 32

Una excepción a estas reglas es el formato GL_R11F_G11F_B10F que se admite.:

  • GL_RGBA8 => ‘rgba8’
  • GL_RGBA16F => ‘rgba16f’
  • GL_SRGB8_ALPHA8 => ‘srgb8_alpha8’
  • GL_R11F_G11F_B10F => ‘r11f_g11f_b10f’
  • GL_RG16 => “rg16”

Samplers

Si se permite reemplazar algunos muestreadores definidos globalmente, no se pueden definir en una técnica. Esto permite definir un uso de muestra para esta pasada de procesamiento o leer desde un destino de procesamiento de una pasada de procesamiento anterior.

Consulte la sección Samplers para obtener más detalles sobre su definición.

+++Ejemplo

+++

Formato de vértice de entrada

Esto permite definir la semántica de cada atributo definido en el sombreador del vértice.

Definición de elemento XML:

Nombre: ‘vertexformat’

Atributos:

  • ‘nombre’: El nombre del atributo tal como se define en el sombreador de vértices.
  • ‘semántico’: Semántica del atributo.
Valor ‘semántico’
Descripción
posición
Posición del vértice (float3)
normal
Vértice normal (float3)
texcoord[0…N]
Búfer de coordenadas N de la textura del vértice (float2)
tangente[0…N]
Búfer de tangentes de vértices N (float4)
binormal[0…N]
Búfer binormal del vértice N (float4)

Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>

<glslfx version="1.0.0" author="allegorithmic.com">

     <!-- BODY -->

     <!-- ... -->

     <!-- INPUT VERTEX FORMAT -->

     <vertexformat name="iVS_Position" semantic="position"/>

     <vertexformat name="iVS_Normal" semantic="normal"/>

     <vertexformat name="iVS_UV" semantic="texcoord0"/>

     <vertexformat name="iVS_Tangent" semantic="tangent0"/>

     <vertexformat name="iVS_Binormal" semantic="binormal0"/>

</glslfx>

Samplers

Esto permite definir el uso de cada muestreador.
Lo utiliza la aplicación para saber qué textura se va a establecer en los muestreadores especificados.

Definición de elemento XML:

Nombre: ‘sampler’

Atributos:

  • ‘nombre’: Nombre de la variable de muestra en el archivo sombreador.
  • ‘uso’: El uso del muestreador. Coincide con el uso especificado en el nodo Salida del gráfico.
Valor de ‘uso’
Descripción
difundir
mapa de Difuso
opacidad
Mapa de opacidad
emisivo
mapa de emisivos
oclusión ambiental
Mapa de oclusión ambiental
ambiente
Mapa ambiental
máscara
Mapa de máscara
detallado normal
Mapa normal de detalle
normal
Mapa de normales
bache
Mapa de relieve
height
mapa de height
desplazamiento
mapa de desplazamiento
nivel especular
mapa de specular level
color especular
Mapa de colores del specular
specular
mapa de speculares
brillo
Mapa de brillo
rugosidad
Mapa de rugosidad
anisotropinivel
Mapa de nivel de anisotropía
anisotropiángulo
Mapa de ángulo de anisotropía
transmisivo
Mapa transmisivo
reflexión
Mapa de reflejos
refracción
Mapa de refracción
entorno
Mapa de entorno (mapa de cubos)
panorama
El mapa panorámico (mapa de latitud/longitud)
máscara de azul
Una textura de tramado de 256x256
  • Se admiten varios usos.
    • Ejemplo:
   <!-- SAMPLERS -->

    <sampler name="baseColorMap" usage="basecolor,diffuse"/>

     <!-- ... -->

‘isHidden’: Booleano que indica si el muestreador debe aparecer en la GUI

  • Ejemplo:
     <!-- SAMPLERS -->

    <sampler name="bluenoiseMask" usage="bluenoisemask" ishidden="true"/>

     <!-- ... -->

Modo de ajuste:

Nombre
Valor
textura_wrap_s, textura_wrap_t, textura_wrap_r
clamp_to_edge
clamp_to_border
mirrored_repeat
repetir

Filtro de textura

Nombre
Valor
textura_min_filter, textura_mag_filter
más cercano
lineal
nearest_mipmap_nearest
linear_mipmap_nearest
nearest_mipmap_linear
linear_mipmap_linear

Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>

<glslfx version="1.0.0" author="allegorithmic.com">

     <!-- BODY -->

     <!-- ... -->

     <!-- SAMPLERS -->

     <sampler name="baseColorMap" usage="basecolor,diffuse"/>

     <sampler name="heightMap" usage="height"/>

     <sampler name="normalMap" usage="normal"/>

     <sampler name="detailNormalMap" usage="detailNormal"/>

     <sampler name="environmentMap" usage="environment"/>

     <sampler name="bluenoiseMask" usage="bluenoisemask" ishidden="true"/>

     <sampler name="sssDiffuseMap" usage="sssDiffuse"/>

</glslfx>

Uniformes

Esto le permite agregar información adicional sobre los uniformes de cada sombreador.

Definición de elemento XML:

Nombre: ‘uniforme’

Atributos:

‘nombre’: El nombre del uniforme en el archivo de sombreado.

Valor ‘semántico’
Descripción
mundo
Matriz mundial (float16)
worldinversetranspose
Matriz de transposición inversa mundial (float16)
worldviewprojection
Matriz de proyección de la vista mundial (float16)
view inverso
Matriz inversa mundial (float16)
visión del mundo
Matriz de vista del mundo (float16)
modelview
Matriz de vista de modelo (float16)
proyección
Matriz de proyección (float16)
ambiente
Color ambiente de la escena (float3)
lightposition[0.N]
Posición de la luz n de la escena (float3)
lightcolor[0…N]
Color de la luz n de la escena (float3)
intensidad de luz[0…N]
Intensidad de la luz n de la escena (flotante)
tiempo global
Hora actual en segundos (float)
resolución
Resolución de ventana gráfica (int2)
ratón
Posición del ratón (int2)
samplespostablesize
Número de muestras que se utilizarán para calcular la iluminación ambiental (int)
irradianceschcoefs
El conjunto de vectores de armónicos esféricos (float3[10])
panoramamipmapheight
Número de niveles de mapa MIP en el mapa panorámico (float)
panorámica
Ángulo Ángulo de rotación del mapa panorámico (flotante)
panoramaintensity
Intensidad del mapa panorámico (float)
computebinormalinfragmentshader
¿Se calcula el binormal por fragmento? (si no es así, por vértice) (bool)
isdirectxnormal
¿Es el DirectX del formato de mapa de normales? (bool)
uvwscale
Valores de escala de u, v, w (float3)
renderuvitil
¿Renderizar solo 1 mosaico UV? (bool)
uvtilecoords
Coordenada del mosaico UV que se va a procesar (int2)

‘semántico’: La semántica del uniforme. (Todas las matrices son float16).

Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>

<glslfx version="1.0.0" author="allegorithmic.com">

     <!-- BODY -->

     <!-- ... -->

     <!-- MATRICES -->

     <uniform name="worldMatrix" semantic="world"/>

     <uniform name="worldViewProjMatrix" semantic="worldviewprojection"/>

     <uniform name="worldViewMatrix" semantic="worldview"/>

     <uniform name="worldInverseTransposeMatrix" semantic="worldinversetranspose"/>

     <uniform name="viewInverseMatrix" semantic="viewinverse"/>

     <uniform name="modelViewMatrix" semantic="modelview"/>

     <uniform name="projectionMatrix" semantic="projection"/>

</glslfx>

Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>

<glslfx version="1.0.0" author="allegorithmic.com">

    <!-- BODY -->

    <!-- ... -->

    <!-- SCENE PARAMETERS -->

    <uniform name="AmbiColor" semantic="ambient"/>

    <uniform name="Lamp0Pos" semantic="lightposition0"/>

    <uniform name="Lamp0Color" semantic="lightcolor0"/>

    <uniform name="Lamp1Pos" semantic="lightposition1"/>

    <uniform name="Lamp1Color" semantic="lightcolor1"/>

</glslfx>

Otros parámetros

Se puede añadir información adicional a cada uniforme para:

  • definir el valor predeterminado
  • valores de sujeción
  • controlar la forma en que se mostrará el uniforme en la aplicación:
  • establecer la etiqueta
  • establezca la información del widget utilizada para editar el valor en la aplicación:
  • nombre del widget, min, max, increment/decrement step
  • uniformes de grupo en widgets de grupo

Como los Uniformes pueden ser reemplazados para cada técnica, permite mostrar una configuración de interfaz de usuario específica para cada técnica.

Definición de elemento XML:

Nombre: ‘uniforme’

Atributos:

  • ‘nombre’: El nombre del uniforme en el archivo de sombreado.
  • ‘predeterminado’: El valor predeterminado uniforme
  • ‘min’: El valor mínimo del intervalo de validez
  • ‘max’: El valor máximo del intervalo de validez
  • ‘guiName’: El nombre del uniforme en la GUI de la aplicación
  • ‘guiGroup’: El nombre del grupo para poner el uniforme en la GUI de la aplicación
  • ‘guiWidget’: El nombre del widget utilizado para editar el valor uniforme en la GUI de la aplicación
Valor ‘guiWidget’
Descripción
regulador
Widget de regulador para floatN
ángulo
Widget de ángulo para flotador
color
Widget de color para float3, float4 color
casilla de verificación
Widget de CheckBox para bool
  • ‘guiMin’: El valor mínimo del widget
  • ‘guiMax’: El valor máximo del widget

Ejemplo: Teselación/paralaje

Archivo Sombreador de vértices de paralaje

Se encuentra en .\tessellation_parallax\parallax\vs.glsl

Contenido:

> #version 120

attribute vec4 iVS_Position;
atributo vec4 iVS_Normal;
attribute vec2 iVS_UV;
attribute vec4 iVS_Tangent;
attribute vec4 iVS_Binormal;

variar vec3 iFS_Normal;
variar vec2 iFS_UV;
variar vec3 iFS_Tangent;
variar vec3 iFS_Binormal;
variar vec3 iFS_PointWS;

worldMatrix uniforme mat4;
mat4 worldViewProjMatrix uniforme;

void main()
{
gl_Position = worldViewProjMatrix &#42; iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_Tangent = iVS_Tangent.xyz;
iFS_Binormal = iVS_Binormal.xyz;
iFS_PointWS = (worldMatrix &#42; iVS_Position).xyz;
}

Archivo de Sombreador de vértices de teselación

Se encuentra en .\tessellation_parallax\tessellation\vs.glsl

Contenido:

​>>

​#version 120

attribute vec4 iVS_Position;
atributo vec4 iVS_Normal;
attribute vec2 iVS_UV;
attribute vec4 iVS_Tangent;
attribute vec4 iVS_Binormal;

variación de vec4 oVS_Normal;
variar vec2 oVS_UV;
variar vec4 oVS_Tangent;
variar vec4 oVS_Binormal;

void main()
{
gl_Position = iVS_Position;
oVS_Normal = iVS_Normal;
oVS_UV = iVS_UV;
oVS_Tangent = iVS_Tangent;
oVS_Binormal = iVS_Binormal;
}

Archivo de sombreador de control de teselación

Se encuentra en .\tessellation_parallax\tessellation\tcs.glsl

Contenido:

​>>

​#version 400 core
​#extension GL_ARB_tessellation_shader : permitir

layout(vertices = 3) out;

en vec4 oVS_Normal[];
en vec2 oVS_UV[];
en vec4 oVS_Tangent[];
en vec4 oVS_Binormal[];

out vec4 oTCS_Normal[];
out vec2 oTCS_UV[];
out vec4 oTCS_Tangent[];
out vec4 oTCS_Binormal[];

teselación de flotador uniformeFactor;

void main()
{
gl_TestLevelOuter[0] = tessellationFactor;
gl_TestLevelOuter[1] = tessellationFactor;
gl_TestLevelOuter[2] = tessellationFactor;
gl_TestLevelInner[0] = tessellationFactor;
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;

oTCS_Normal[gl_InvocationID] = oVS_Normal[gl_InvocationID];
oTCS_UV[gl_InvocationID] = oVS_UV[gl_InvocationID];
oTCS_Tangent[gl_InvocationID] = oVS_Tangent[gl_InvocationID];
oTCS_Binormal[gl_InvocationID] = oVS_Binormal[gl_InvocationID];
}

Archivo sombreador de evaluación de teselación

Se encuentra en .\tessellation_parallax\tessellation\tcs.glsl

Contenido:

​>>

​#version 400 core

layout(triangles, equal_spacing, ccw) in;

en vec4 oTCS_Normal[];
en vec2 oTCS_UV[];
en vec4 oTCS_Tangent[];
en vec4 oTCS_Binormal[];

worldMatrix uniforme mat4;
mat4 worldViewProjMatrix uniforme;

muestra uniforme 2D heightMap;

baldosas flotantes uniformes = 1,0f;
altura de flotador uniformeMapScale = 1,0f;

out vec3 iFS_Normal;
out vec2 iFS_UV;
out vec3 iFS_Tangent;
out vec3 iFS_Binormal;
out vec3 iFS_PointWS;

vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2, vec3 uvw)
{
devuelve uvw.x &#42; v0 + uvw.y &#42; v1 + uvw.z &#42; v2;
}

vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2, vec3 uvw)
{
devuelve uvw.x &#42; v0 + uvw.y &#42; v1 + uvw.z &#42; v2;
}

void main()
{
vec3 uvw = gl_TessCoord.xyz;

vec3 newPos = interpolate3D(gl_in[0].gl_Position.xyz, gl_in[1].gl_Position.xyz, gl_in[2].gl_Position.xyz, uvw);
vec3 newNormal = normalize(interpolate3D(oTCS_Normal[0].xyz, oTCS_Normal[1].xyz, oTCS_Normal[2].xyz, uvw);
vec3 newTangent = normalize(interpolate3D(oTCS_Tangent[0].xyz, oTCS_Tangent[1].xyz, oTCS_Tangent[2].xyz, uvw));
vec3 newBinormal = normalize(interpolate3D(oTCS_Binormal[0].xyz, oTCS_Binormal[1].xyz, oTCS_Binormal[2].xyz, uvw);
vec2 newUV = interpolate2D(oTCS_UV[0], oTCS_UV[1], oTCS_UV[2], uvw);

float heightTextSample = textura(heightMap, newUV &#42; tiling).x &#42; 2.0 - 1.0;
newPos += newNormal &#42; heightTextSample &#42; heightMapScale;

vec4 obj_pos = vec4(newPos, 1);
gl_Position = worldViewProjMatrix &#42; obj_pos;

iFS_UV = newUV &#42; mosaico;
iFS_Tangent = newTangent;
iFS_Binormal = newBinormal;
iFS_Normal = newNormal;
iFS_PointWS = (worldMatrix &#42; obj_pos).xyz;
}

Fragmentar archivo de Sombreador

Se encuentra en .\tessellation_parallax\fs.glsl

Contenido:

​>>

​#version 120

// #define ALG_NORMAL_DIRECTX
​#define ALG_NORMAL_OPENGL

​#ifdef ALG_NORMAL_DIRECTX
// #define VOLTEAR_NORMAL_X
​#define VOLTEAR_NORMAL_Y
// #define VOLTEAR_NORMAL_Z
​#endif //#ifdef ALG_NORMAL_DIRECTX

​#ifdef ALG_NORMAL_OPENGL
// #define VOLTEAR_NORMAL_X
​#define VOLTEAR_NORMAL_Y
// #define VOLTEAR_NORMAL_Z
​#endif //#ifdef ALG_NORMAL_OPENGL

variar vec3 iFS_Normal;
variar vec2 iFS_UV;
variar vec3 iFS_Tangent;
variar vec3 iFS_Binormal;
variar vec3 iFS_PointWS;

vec3 uniforme Lamp0Pos = vec3(0,0f,0,0f,70,0f);
vec3 uniforme Lamp0Color = vec3(1,0f,1,0f,1,0f);
vec3 uniforme Lamp1Pos = vec3(70,0f,0,0f,0,0f);
vec3 uniforme Lamp1Color = vec3(0,198f,0,198f,0,198f);
uniforme bool flipNormal = true;
piso uniforme TilingDetail = 3.0f;
Float uniforme SpecExpon = 50.0;
flotador uniforme Ks = 1,0;
uniforme int parallax_mode = 0;
teselación de flotador uniformeFactor = 4.0;
altura de flotador uniformeMapScale = 1,0f;
profundidad de flotador uniforme_detail = 0,5f;
Kr = 0.5f;
uniforme int KF_on = 1;
KFs de flotador uniforme = 1.0f;
vec3 AmbiColor uniforme = vec3(0,07f,0,07f,0,07f);
baldosas flotantes uniformes = 1,0f;
uniforme int enableTilingInFS = 0;

muestra uniforme 2D heightMap;
muestra uniforme2D normalMap;
muestra uniforme 2D detailNormalMap;
muestreador uniforme 2D emissiveMap;
muestra uniforme 2D diffuseMap;
muestra uniforme 2D specularMap;
muestra uniforme 2D opacityMap;
muestra uniformeEntorno de cuboMapa;

worldMatrix uniforme mat4;
uniforme mat4 worldInverseTransposeMatrix;
uniforme mat4 viewInverseMatrix;

vec4 litFct(float NdotL, float NdotH, float specExp)
{
float ambient = 1.0;
float diffuse = max(NdotL, 0.0);
specular float = step(0.0, NdotL) &#42; pow(max(0.0, NdotH), specExp);
vec4 de retorno (ambiente, difuso, specular, 1.0);
}

vec3 lerpFct(vec3 v0, vec3 v1, porcentaje flotante)
{
valor devuelto v0 + (v1-v0) &#42; por ciento;
}

// Sombreado de Phong
void phong_sombreado(
en vec3 LightColor,
en vec3 normalWS,
en vec3 pointToLightDirWS,
en vec3 pointToCameraDirWS,
inout vec3 DiffuseContrib,
inout vec3 SpecularContrib)
{
vec3 Hn = normalize(pointToCameraDirWS + pointToLightDirWS);
vec4 litV = litFct(dot(normalWS, pointToLightDirWS), dot(normalWS, Hn), SpecExpon);
DiffuseContrib = litV.y &#42; LightColor;
SpecularContrib = litV.y &#42; litV.z &#42; Ks &#42; LightColor;
}

vec3 fixNormalSample(vec3 v)
{
resultado vec3 = v - vec3(0,5,0,5,0,5);

​#ifdef FLIP_NORMAL_X
result.x = -result.x;
​#endif // ifdef FLIP_NORMAL_X
​#ifdef FLIP_NORMAL_Y
result.y = -result.y;
​#endif // ifdef FLIP_NORMAL_Y
​#ifdef FLIP_NORMAL_Z
result.z = -result.z;
​#endif // ifdef FLIP_NORMAL_Z

resultado de retorno;
}

vec3 normalVecOSToWS(vec3 normal)
{
retorno normal;
}

void main()
{
vec3 cameraPosWS = viewInverseMatrix[3].xyz;
vec3 pointToLight0DirWS = normalize(Lamp0Pos - iFS_PointWS);
vec3 pointToLight1DirWS = normalize(Lamp1Pos - iFS_PointWS);
vec3 pointToCameraDirWS = normalize(cameraPosWS);
vec3 normalOS = normalize(iFS_Normal);
vec3 tangentOS = normalize(iFS_Tangent);
vec3 binormalOS = normalize(iFS_Binormal);

// ------------------------------------------
// Asegúrese de que la TBN esté normalizada Orthon
binormalOS = normalize(cross(normalOS, tangentOS));
tangentOS = normalize(cross(binormalOS, normalOS));

vec3 cumulatedNormalOS = normalOS;

// ------------------------------------------
// Actualizar UV
float a = dot(normalOS,-pointToCameraDirWS);
vec3 s = vec3(dot(pointToCameraDirWS,tangentOS), dot(pointToCameraDirWS,binormalOS), a);
vec2 uv = enableTilingInFS == 0 ? iFS_UV : (mosaico iFS_UV &#42;);
height flotante = textura2D(heightMap,uv).x &#42; 2.0 - 1.0 ;
float parallax = parallax_mode == 0 ? (tessellationFactor / 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
uv += (height &#42; s.xy &#42; paralaje) ;

// ------------------------------------------
// Agregar normal desde normalMap
vec3 normalTS = texture2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x&#42;tangentOS + normalTS.y&#42;binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);

// ------------------------------------------
// Agregar mapa normal de detalles
vec3 normalDetailTS = textura2D(detailNormalMap,uv&#42;TilingDetail).xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
vec3 variableNormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,Profundidad_detail);
vec3 normalDetailOS = variableNormalDetailTS.x&#42;tangentOS + variableNormalDetailTS.y&#42;binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalDetailOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);

if (length(normalTS)<0.0001)
cumulatedNormalOS = normalOS;

vec3 cumulatedNormalWS = normalVecOSToWS(cumulatedNormalOS);

// ------------------------------------------
// Computar Difuso y Specular

// Contribución de Light 0
vec3 diffContrib = vec3(0, 0, 0);
vec3 specContrib = vec3(0, 0, 0);
phong_sombreado(Lamp0Color, cumulatedNormalWS, pointToLight0DirWS, pointToCameraDirWS, diffContrib, specContrib);

// Contribución de Light 1
vec3 diffContrib2 = vec3(0, 0, 0);
vec3 specContrib2 = vec3(0, 0, 0);
phong_sombreado(Lamp1Color, cumulatedNormalWS, pointToLight1DirWS, pointToCameraDirWS, diffContrib2, specContrib2);

diffContrib += diffContrib2;
specContrib += specContrib2;

vec4 diffuseColor = texture2D(diffuseMap,uv);

vec3 specularColor = texture2D(specularMap,uv).rgb;
vec3 R = reflejo(pointToCameraDirWS,cumulatedNormalWS);
vec3 reflColor = Kr &#42; textureCube(environmentMap,R.xyz).bgr;

float FallofRefl;

if (KFs >= 0.0)
FallofRefl = max((1-dot(pointToCameraDirWS/(KFs),cumulatedNormalWS),0)&#42;KF_on;
else
FalseRefl = (1-max((1-dot(pointToCameraDirWS/(-KFs),cumulatedNormalWS)),0))&#42;KF_on;

if (KF_on == 0)
FallofRefl=1.0;

vec3 Ambiant_final = diffuseColor.rgb&#42;AmbiColor;

// ------------------------------------------
vec3 emissive = texture2D(emissiveMap,uv).xyz;

vec3 finalcolor = Ambiant_final
​+ specularColor&#42;specContrib
​+ diffuseColor.rgb&#42;diffContrib
​+ (reflColor&#42;specularColor&#42;FallofRefl)
​+ emisivo;

// Color final
vec4 finalColor4 = vec4(final, color, textura2D(opacityMap,uv));

gl_FragColor = finalColor4;
}

Archivo GLSLFX

El fichero glslfx define dos técnicas para procesar la geometría:

  • Uno usa la técnica de teselación de hardware
  • El otro se basa en un efecto de paralaje que se utilizará como retroceso si el hardware del usuario no admite la teselación.

Se encuentra en .\tessellation_parallax\fs.glsl

Contenido:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sbsbatchnode SYSTEM "glslfx.dtd">

<glslfx version="1.0.0" author="allegorithmic.com">

    <!-- TECHNIQUES -->

    <technique name="Tesselation">

        <!-- PROPERTIES -->

        <property name="blend_enabled" value="true"/>

        <property name="blend_func" value="src_alpha,one_minus_src_alpha"/>

        <property name="cull_face_enabled" value="true"/>

        <property name="cull_face_mode" value="back"/>

        <!-- SHADERS -->

        <shader type="vertex" filename="tessellation_parallax/tessellation/vs.glsl" primitiveType="patch4"/>

        <shader type="tess_control" filename="tessellation_parallax/tessellation/tcs.glsl"/>

        <shader type="tess_eval" filename="tessellation_parallax/tessellation/tes.glsl"/>

        <shader type="fragment" filename="tessellation_parallax/fs.glsl"/>

        <!-- UNIFORMS -->

        <uniform name="parallax_mode" guiName="Parallax Mode" min="0" max="0" />

        <uniform name="enableTilingInFS" guiName="Tiling Enabled In FS" min="0" max="0" />

        <uniform name="tessellationFactor" guiName="Tessellation Factor" default="4" min="1" max="64" guiStep="1" guiWidget="slider"/>

    </technique>

    <technique name="Parallax">

        <!-- PROPERTIES -->

        <property name="blend_enabled" value="true"/>

        <property name="blend_func" value="src_alpha,one_minus_src_alpha"/>

        <property name="cull_face_enabled" value="true"/>

        <property name="cull_face_mode" value="back"/>

        <!-- SHADERS -->

        <shader type="vertex" filename="tessellation_parallax/parallax/vs.glsl"/>

        <shader type="fragment" filename="tessellation_parallax/fs.glsl"/>

        <!-- UNIFORMS -->

        <uniform name="parallax_mode" guiName="Parallax Mode" min="1" max="1" />

        <uniform name="enableTilingInFS" guiName="Tiling Enabled In FS" min="1" max="1" />

    </technique>

    <!-- INPUT VERTEX FORMAT -->

    <vertexformat name="iVS_Position" semantic="position"/>

    <vertexformat name="iVS_Normal" semantic="normal"/>

    <vertexformat name="iVS_UV" semantic="texcoord0"/>

    <vertexformat name="iVS_Tangent" semantic="tangent0"/>

    <vertexformat name="iVS_Binormal" semantic="binormal0"/>

    <!-- SAMPLERS -->

    <sampler name="diffuseMap" usage="diffuse"/>

    <sampler name="heightMap" usage="height"/>

    <sampler name="normalMap" usage="normal"/>

    <sampler name="detailNormalMap" usage="detailNormal"/>

    <sampler name="emissiveMap" usage="emissive"/>

    <sampler name="specularMap" usage="specular"/>

    <sampler name="opacityMap" usage="opacity"/>

    <sampler name="environmentMap" usage="environment"/>

    <!-- MATRICES -->

    <uniform name="worldMatrix" semantic="world"/>

    <uniform name="worldViewProjMatrix" semantic="worldviewprojection"/>

    <uniform name="worldViewMatrix" semantic="worldview"/>

    <uniform name="worldInverseTransposeMatrix" semantic="worldinversetranspose"/>

    <uniform name="viewInverseMatrix" semantic="viewinverse"/>

    <uniform name="modelViewMatrix" semantic="modelview"/>

    <uniform name="projectionMatrix" semantic="projection"/>

    <!-- SCENE PARAMETERS -->

    <uniform name="AmbiColor" semantic="ambient"/>

    <uniform name="Lamp0Pos" semantic="lightposition0"/>

    <uniform name="Lamp0Color" semantic="lightcolor0"/>

    <uniform name="Lamp1Pos" semantic="lightposition1"/>

    <uniform name="Lamp1Color" semantic="lightcolor1"/>

    <!-- UNIFORMS -->

    <uniform name="tiling" guiName="Tiling" default="1" min="1" guiWidget="slider" guiMax="10"/>

    <uniform name="heightMapScale" guiGroup="Height" guiName="Scale" default="1" min="0" guiWidget="slider" guiMin="-50" guiMax="50" />

    <uniform name="TilingDetail" guiGroup="Detail Normal" guiName="Tiling" default="3" min="1" guiWidget="slider" guiMax="10"/>

    <uniform name="Depth_detail" guiGroup="Detail Normal" guiName="Intensity" default="0.5" min="0" max="1" guiStep="0.05" guiWidget="slider"/>

    <uniform name="SpecExpon" guiGroup="Specular" guiName="Power" default="50" min="1" guiWidget="slider" guiMax="128"/>

    <uniform name="Ks" guiGroup="Specular" guiName="Intensity" default="1" min="0" guiWidget="slider" guiMax="3"/>

    <uniform name="Kr" guiGroup="Reflection" guiName="Intensity" default="0.5" min="0" max="1" guiStep="0.01" guiWidget="slider"/>

    <uniform name="KF_on" guiGroup="Reflection" guiName="Falloff" default="1" min="0" max="1" guiStep="1" guiWidget="slider"/>

    <uniform name="KFs" guiGroup="Reflection" guiName="Falloff Size" default="1" min="-1" max="1" guiStep="0.05" guiWidget="slider"/>

</glslfx>
recommendation-more-help
substance-3d-designer-help-guide