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.
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.
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:
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.
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.
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.
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.
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.
- 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:
Filtro de textura
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.
‘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
- ‘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 * iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_Tangent = iVS_Tangent.xyz;
iFS_Binormal = iVS_Binormal.xyz;
iFS_PointWS = (worldMatrix * 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 * v0 + uvw.y * v1 + uvw.z * v2;
}
vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2, vec3 uvw)
{
devuelve uvw.x * v0 + uvw.y * v1 + uvw.z * 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 * tiling).x * 2.0 - 1.0;
newPos += newNormal * heightTextSample * heightMapScale;
vec4 obj_pos = vec4(newPos, 1);
gl_Position = worldViewProjMatrix * obj_pos;
iFS_UV = newUV * mosaico;
iFS_Tangent = newTangent;
iFS_Binormal = newBinormal;
iFS_Normal = newNormal;
iFS_PointWS = (worldMatrix * 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) * 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) * 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 * LightColor;
SpecularContrib = litV.y * litV.z * Ks * 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 *);
height flotante = textura2D(heightMap,uv).x * 2.0 - 1.0 ;
float parallax = parallax_mode == 0 ? (tessellationFactor / 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
uv += (height * s.xy * paralaje) ;
// ------------------------------------------
// Agregar normal desde normalMap
vec3 normalTS = texture2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x*tangentOS + normalTS.y*binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);
// ------------------------------------------
// Agregar mapa normal de detalles
vec3 normalDetailTS = textura2D(detailNormalMap,uv*TilingDetail).xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
vec3 variableNormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,Profundidad_detail);
vec3 normalDetailOS = variableNormalDetailTS.x*tangentOS + variableNormalDetailTS.y*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 * textureCube(environmentMap,R.xyz).bgr;
float FallofRefl;
if (KFs >= 0.0)
FallofRefl = max((1-dot(pointToCameraDirWS/(KFs),cumulatedNormalWS),0)*KF_on;
else
FalseRefl = (1-max((1-dot(pointToCameraDirWS/(-KFs),cumulatedNormalWS)),0))*KF_on;
if (KF_on == 0)
FallofRefl=1.0;
vec3 Ambiant_final = diffuseColor.rgb*AmbiColor;
// ------------------------------------------
vec3 emissive = texture2D(emissiveMap,uv).xyz;
vec3 finalcolor = Ambiant_final
+ specularColor*specContrib
+ diffuseColor.rgb*diffContrib
+ (reflColor*specularColor*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>