Sombreadores GLSLFX

Os arquivos GLSLFX fazem a ponte entre o aplicativo e os arquivos de sombreador glsl.
Permite usar qualquer sombreador glsl sem ter que modificar o código.

Formato de arquivo

O formato de arquivo GLSLFX é XML. Os comentários são aceitos.

Nó de cabeçalho e raiz

O elemento de nó raiz XML é chamado glslfx.

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

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

    <!-- BODY -->

    <!-- ... -->

</glslfx>

Corpo

Técnica

Elemento XML que descreve uma técnica. Uma técnica é uma variação do FX atual. Um GLSLFX pode conter várias técnicas, mas pelo menos uma técnica precisa ser definida.

A geometria será renderizada com uma das técnicas definidas pelo aplicativo.

Definição de elemento XML

Técnica Nome:

Atributos:

  • nome: qualquer string usada para nomear a técnica

O elemento XML pode ter vários filhos. Os elementos definidos em uma técnica substituem os elementos definidos globalmente.

Por exemplo, é usado para substituir alguns valores uniformes e obter variação de FX para essa técnica.

Passe de Renderização

Elemento XML que descreve uma passagem de renderização. Uma passagem de renderização descreve a renderização da geometria.

Uma técnica pode conter várias passagens de renderização que serão executadas sequencialmente. Uma técnica que não contém nenhuma passagem de renderização é equivalente a uma técnica que contém uma passagem de renderização “na tela”.

Os elementos definidos em uma passagem de renderização substituem os elementos definidos na técnica pai.

Definição de elemento XML Nome: passagem

Atributos:

  • saída

  • fora da tela: a renderização será feita em destinos de renderização definidos pelo usuário

  • Na tela: a renderização será feita no destino de renderização padrão

Sombreamentos

Defina os arquivos de sombreador GLSL para cada tipo.

Definição do elemento XML:

Definição de elemento XML Nome: sombreador

Atributos:

  • tipo: o tipo de sombreador GLSL;

  • nome do arquivo: o caminho do arquivo de sombreador glsl. Pode ser absoluto ou relativo ao arquivo GLSLFX;

  • primitiveType: O método para renderizar a primitiva.

table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2
Valor de ‘type’ Descrição
vértice Sombreador de vértice
geometria Sombreador de geometria
tess_control Sombreador de Controle de Mosaico
tess_eval Sombreador de Avaliação de Mosaico
fragmento Sombreador de fragmento
table 0-row-2 1-row-2 2-row-2 3-row-2
Valor de ‘primitiveType’ Descrição
ponto Renderizar como pontos
lineloop Renderizar como loop de linha
patch[1…N] Renderizar como correções com [1…N] vértices

Propriedades

Permite configurar parte do estado OpenGL.

Definição de elemento XML

Propriedade Name:

Atributos:

  • nome: o nome da propriedade a ser definida. O nome é baseado na função OpenGL ou no nome glEnum:

    • Sintaxe Enums: sem o prefixo ‘GL_’, em minúsculas. Exemplos: glEnable(GL_BLEND_ENABLE) => “”“, glDisable(GL_CULL_FACE) => “”"
    • Sintaxe de funções: sem o prefixo ‘gl’, em minúsculas e com todas as palavras separadas com o caractere ‘_’. Exemplo: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”
  • Sintaxe Enums: sem o prefixo ‘GL_’, em minúsculas. Exemplos: glEnable(GL_BLEND_ENABLE) => “”“, glDisable(GL_CULL_FACE) => “”"

  • Sintaxe de funções: sem o prefixo ‘gl’, em minúsculas e com todas as palavras separadas com o caractere ‘_’. Exemplo: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”

  • valor: o valor da propriedade.

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 de ‘name’ Valores de ‘value’ Descrição
blend_enabled booleano Ativar/desativar o modo de mesclagem
true
Falsa
blend_func string, string Definir as funções de mesclagem de origem e destino
zero para enumeração do OpenGL GL_ZERO
um para enumeração do OpenGL GL_ONE
src_color para enumeração do OpenGL GL_SRC_COLOR
one_minus_src_color para enumeração do OpenGL GL_ONE_MINUS_SRC_COLOR
dst_color para enumeração do OpenGL GL_DST_COLOR
one_minus_dst_color para enumeração do OpenGL GL_ONE_MINUS_DST_COLOR
src_alpha para enumeração do OpenGL GL_SRC_ALPHA
one_minus_src_alpha para enumeração do OpenGL GL_ONE_MINUS_SRC_ALPHA
dst_alpha para enumeração do OpenGL GL_DST_ALPHA
one_minus_dst_alpha para enumeração do OpenGL GL_ONE_MINUS_DST_ALPHA
constante_cor para enumeração do OpenGL GL_CONSTANT_COLOR
one_minus_constant_color para enumeração do OpenGL GL_ONE_MINUS_CONSTANT_COLOR
constante_alpha para enumeração do OpenGL GL_CONSTANT_ALPHA
one_minus_constant_alpha para enumeração do OpenGL GL_ONE_MINUS_CONSTANT_ALPHA
src_alpha_saturate para enumeração do OpenGL GL_SRC_ALPHA_SATURATE
src1_color para enumeração do OpenGL GL_SRC1_COLOR
one_minus_src1_color para enumeração do OpenGL GL_ONE_MINUS_SRC1_COLOR
src1_alpha para enumeração do OpenGL GL_SRC1_ALPHA
one_minus_src1_alpha para enumeração do OpenGL GL_ONE_MINUS_SRC1_ALPHA
cull_face_enabled booleano Ativar/desativar a remoção de rosto
true
Falsa
selecionar_rosto_modo string Definir o modo de remoção de rosto
frente para enumeração do OpenGL GL_FRONT
trás para enumeração do OpenGL GL_BACK
frente_e_verso para enumeração do OpenGL GL_FRONT_AND_BACK
profundidade_func string Definir a função de comparação de profundidade
nunca para enumeração do OpenGL GL_NEVER
menos para enumeração do OpenGL GL_LESS
desigual para enumeração do OpenGL GL_LEQUAL
igual para enumeração do OpenGL GL_EQUAL
diferente para enumeração do OpenGL GL_NOTEQUAL
gequal para enumeração do OpenGL GL_GEQUAL
maior para enumeração do OpenGL GL_GREATER
sempre para enumeração do OpenGL GL_ALWAYS

Uniformulários

Permite substituir alguns uniformes definidos globalmente ou na técnica pai. Isso permite alterar o comportamento do sombreador para essa técnica ou passagem de renderização.

Consulte a seção Uniformes abaixo para obter mais detalhes sobre a definição.

+++Exemplo

+++

Destinos de renderização

Para passagens de renderização ‘fora da tela’, os destinos de renderização devem ser definidos na passagem de renderização.

Definição de elemento XML

Saída de Nome:

Atributos:

  • anexo: O ponto de anexo do OpenGL, inspirado nos nomes do OpenGL:
    GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
    GL_PROFUNDIDADE_ATTACHMENT => ‘profundidade’

anexo: O ponto de anexo do OpenGL, inspirado nos nomes do OpenGL:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_PROFUNDIDADE_ATTACHMENT => ‘profundidade’

  • nome: o nome do destino de renderização.
    Ele pode ser usado em um passo de renderização posterior para vincular esse destino de renderização como um sampler.

nome: o nome do destino de renderização.
Ele pode ser usado em um passo de renderização posterior para vincular esse destino de renderização como um sampler.

  • format: o formato interno do destino de renderização.

format: o formato interno do destino de renderização.

  • clear: atributo opcional que define um valor clear.
    Se presente, o destino de renderização será limpo para esse valor no início da passagem de renderização.
    Se ausente, o destino de renderização manterá seu conteúdo anterior.
NOTE
Os destinos de renderização de cores são proibidos em um passo de renderização “na tela”, mas um destino de renderização de profundidade pode ser compartilhado com qualquer passo de renderização (mas é provável que ele interrompa a renderização ao misturar vários materiais na cena).

Sobre formatos

Para formatos de profundidade, todos os formatos OpenGL somente de profundidade (sem estêncil) são compatíveis:

  • GL_PROFUNDIDADE_COMPONENT16 => ‘profundidade26’
  • GL_PROFUNDIDADE_COMPONENT24 => ‘profundidade34’
  • GL_PROFUNDIDADE_COMPONENT32 => ‘profundidade42’
  • GL_PROFUNDIDADE_COMPONENT32F => ‘profundidade42f’

Para os formatos de cores, o nome é baseado nos nomes enum do OpenGL, sem o prefixo ‘GL_’, em minúsculas.
Não há suporte para três formatos de canal (RGB); em vez disso, use um formato RGBA.
Profundidade de bits por canal compatível:

  • Inteiro sem sinal normalizado: 8, 16
  • Ponto flutuante: 16, 32

Uma exceção a essas regras é o formato GL_R11F_G11F_B10F, que é compatível.:

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

Amostragem

Permitir que o substitua alguns amostradores definidos globalmente, eles não podem ser definidos em uma técnica. Isso permite definir um uso do sampler para essa passagem de renderização ou para ler de um destino de renderização de uma passagem de renderização anterior.

Consulte a seção Samplers para obter mais detalhes sobre suas definições.

+++Exemplo

+++

Formato de vértice de entrada

Isso permite definir a semântica de cada atributo definido no sombreador de vértice.

Definição de Elemento XML:

Nome: ‘vertexformat’

Atributos:

  • ‘name’: O nome do atributo conforme definido no sombreador de vértice.
  • ‘semantic’: A semântica do atributo.
Valor ‘semântico’
Descrição
posição
Posição do vértice (float3)
normal
Vértice normal (float3)
texcoord[0…N]
Buffer de coordenadas de textura de vértice N (float2)
tangente[0…N]
Buffer tangente de vértice N (float4)
binormal[0…N]
Buffer binormal de vértice N (float4)

Exemplo:

<?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>

Amostragem

Isso permite definir o uso de cada amostrador.
É usado pelo aplicativo para saber qual textura definir nos classificadores especificados.

Definição de Elemento XML:

Nome: ‘sampler’

Atributos:

  • ‘name’: O nome da variável do sampler no arquivo shader.
  • ‘uso’: O uso do sampler. Corresponde ao uso especificado no nó Saída do gráfico.
Valor de ‘uso’
Descrição
difusa
Mapa difuso
opacidade
Mapa de opacidade
emissivo
Mapa emissivo
ambientoclusão
Mapa de oclusão do ambiente
ambiente
Mapa do ambiente
máscara
Mapa de máscara
detalhadonormal
Detalhar mapa normal
normal
Mapas normais
mapeamento
Mapa de relevo
height
mapa de heights
deslocamento
mapa de deslocamentos
specularlevel
mapa de speculares leveis
specularcolor
mapa de cores do specular
specular
mapa de specular
glossiness
Mapa de textura reluzente
de aspereza
Mapa de aspereza
anisotropylevel
Mapa do nível de anisotropia
anisotropiângulo
Mapa do ângulo de anisotropia
transmissivo
Mapa transmissivo
reflexo
Mapa de reflexão
refração
Mapa de refração
ambiente
Mapa do ambiente (mapa do cubo)
panorama
O Mapa Panorâmico (Mapa Da Latitude/Longitude)
bluenoisemask
Uma textura de pontilhamento de 256x256
  • Há suporte para vários usos.
    • Exemplo:
   <!-- SAMPLERS -->

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

     <!-- ... -->

‘isHidden’: Booleano que indica se o sampler deve aparecer na GUI

  • Exemplo:
     <!-- SAMPLERS -->

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

     <!-- ... -->

Modo de quebra automática:

Nome
Valor
textura_wrap_s, textura_wrap_t, textura_wrap_r
clamp_to_edge
clamp_to_border
mirrored_repeat
repetir

Filtro de Textura

Nome
Valor
textura_min_filter, textura_mag_filter
mais próximo
linear
nearest_mipmap_nearest
linear_mipmap_nearest
nearest_mipmap_linear
linear_mipmap_linear

Exemplo:

<?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>

Uniformulários

Isso permite que você adicione informações adicionais em cada uniforme de sombreador.

Definição de Elemento XML:

Nome: ‘uniforme’

Atributos:

‘nome’: o nome do uniforme no arquivo de sombreador.

Valor ‘semântico’
Descrição
mundo
Matriz Mundial (float16)
worldinversetranspose
Matriz mundial de transposição inversa (float16)
worldviewprojection
Matriz de projeção do World View (float16)
viewinverse
Matriz Inversa Mundial (float16)
worldview
Matriz do World View (float16)
modelview
Matriz de visualização de modelo (float16)
projeção
Matriz de Projeção (float16)
ambiente
Cor do ambiente da cena (float3)
posição da luz[0…N]
Posição da luz nº da cena (float3)
lightcolor[0…N]
Cor da luz n da cena (float3)
lightintensity[0…N]
Intensidade da luz n da cena (flutuante)
globaltime
Tempo atual em segundos (float)
resolução
Resolução do visor (int2)
rato
Posição do mouse (int2)
samplespostablesize
Número de amostras a serem usadas para calcular a iluminação ambiente (int)
irradianceshcoefs
A matriz de vetores harmônicos esféricos (float3[10])
panoramamipmapheight
Número de níveis do mipmap no mapa panorâmico (flutuante)
panoramarotation
Ângulo Ângulo de rotação do mapa de panorama (flutuante)
intensidade de panorama
Intensidade do mapa de panorama (flutuante)
computebinormalinfragmentshader
O binormal é calculado por fragmento? (se não for então por vértice) (bool)
isdirectxnormal
O formato de mapa normal é DirectX? (bool)
uvwscale
Valores de escala de u, v, w (float3)
renderuvtile
Renderizar apenas 1 bloco UV? (bool)
uvtilecoords
Coordenada do ladrilho UV a ser renderizado (int2)

‘semântica’: A semântica do uniforme. (Todas as matrizes são float16).

Exemplo:

<?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>

Exemplo:

<?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>

Outros parâmetros

Outras informações adicionais podem ser adicionadas a cada uniforme para:

  • definir o valor padrão
  • valores do grampo
  • controlar a forma como o uniforme será apresentado no pedido:
  • definir o rótulo
  • defina as informações do widget usadas para editar o valor no aplicativo:
  • nome do widget, mínimo, máximo, etapa de incremento/decremento
  • uniformes de grupo nos widgets de grupo

Como os Uniformes podem ser substituídos por cada técnica, permite exibir uma configuração de interface gráfica específica para cada técnica.

Definição de Elemento XML:

Nome: ‘uniforme’

Atributos:

  • ‘nome’: o nome do uniforme no arquivo de sombreador.
  • ‘default’: O valor padrão uniforme
  • ‘min’: o valor mínimo do intervalo de validade
  • ‘max’: O valor máximo do intervalo de validade
  • ‘guiName’: O nome do uniforme na interface gráfica do aplicativo
  • ‘guiGroup’: O nome do grupo para colocar o uniforme na interface gráfica do aplicativo
  • ‘guiWidget’: o nome do widget usado para editar o valor uniforme na interface gráfica do aplicativo
Valor de ‘guiWidget’
Descrição
corredor
Widget de controle deslizante para floatN
ângulo
Widget de ângulo para flutuar
cores
Widget de cor para cor float3, float4
caixa de seleção
Widget CheckBox para bool
  • ‘guiMin’: O valor mínimo do widget
  • ‘guiMax’: O valor máximo do widget

Exemplo: mosaico/paralaxe

Arquivo de sombreador de vértices da paralaxe

Localizado em .\tessellation_parallax\parallax\vs.glsl

Conteúdo:

> #version 120

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

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

uniforme mat4 worldMatrix;
uniforme mat4 worldViewProjMatrix;

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;
}

Arquivo de Sombreador de Vértice de Mosaico

Localizado em .\tessellation_parallax\tessellation\vs.glsl

Conteúdo:

​>>

​#version 120

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

variando vec4 oVS_Normal;
variando vec2 oVS_UV;
variando vec4 oVS_Tangent;
variando 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;
}

Arquivo de Sombreador de Controle de Mosaico

Localizado em .\tessellation_parallax\tessellation\tcs.glsl

Conteúdo:

​>>

​#version núcleo 400
​#extension GL_ARB_tessellation_shader : habilitar

layout(vértices = 3) out;

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

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

fator de mosaico de flutuador uniforme;

void main()
{
gl_TessLevelOuter[0] = tessellationFactor;
gl_TessLevelOuter[1] = tessellationFactor;
gl_TessLevelOuter[2] = tessellationFactor;
gl_TessLevelInner[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];
}

Arquivo de Sombreador de Avaliação do Mosaico

Localizado em .\tessellation_parallax\tessellation\tcs.glsl

Conteúdo:

​>>

​#version núcleo 400

layout(triângulos, igual_espaçamento, ccw) em;

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

uniforme mat4 worldMatrix;
uniforme mat4 worldViewProjMatrix;

sampler2D heightMap uniforme;

revestimento de flutuador uniforme = 1.0f;
heightMapScale de flutuação uniforme = 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)
{
return uvw.x &#42; v0 + uvw.y &#42; v1 + uvw.z &#42; v2;
}

vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2, vec3 uvw)
{
return 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 heightTexSample = texture(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; tiling;
iFS_Tangent = newTangent;
iFS_Binormal = newBinormal;
iFS_Normal = newNormal;
iFS_PointWS = (worldMatrix &#42; obj_pos).xyz;
}

Arquivo sombreador de fragmentos

Localizado em .\tessellation_parallax\fs.glsl

Conteúdo:

​>>

​#version 120

// #define ALG_NORMAL_DIRECTX
​#define ALG_NORMAL_OPENGL

​#ifdef ALG_NORMAL_DIRECTX
// #define FLIP_NORMAL_X
​#define FLIP_NORMAL_Y
// #define FLIP_NORMAL_Z
​#endif //#ifdef ALG_NORMAL_DIRECTX

​#ifdef ALG_NORMAL_OPENGL
// #define FLIP_NORMAL_X
​#define FLIP_NORMAL_Y
// #define FLIP_NORMAL_Z
​#endif //#ifdef ALG_NORMAL_OPENGL

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

Lâmpada vec3 uniforme0Pos = vec3(0.0f,0.0f,70.0f);
Lâmpada vec30Color uniforme = vec3(1.0f,1.0f,1.0f);
Lâmpada vec3 uniforme1Pos = vec3(70.0f,0.0f,0.0f);
Lâmpada vec3 uniforme1Color = vec3(0.198f,0.198f,0.198f);
flipNormal bool uniforme = true;
uniformemente float TilingDetail = 3.0f;
SpecExpon de flutuação uniforme = 50,0;
flutuador uniforme Ks = 1,0;
uniforme int parallax_mode = 0;
tessellationFactor de flutuador uniforme = 4,0;
heightMapScale de flutuação uniforme = 1.0f;
uniformemente float Profundidade_detail = 0.5f;
flutuador uniforme Kr = 0,5f;
uniforme int KF_on = 1;
flutuador uniforme KFs = 1.0f;
vec3 AmbiColor uniforme = vec3(0.07f,0.07f,0.07f);
revestimento de flutuador uniforme = 1.0f;
uniforme int enableTilingInFS = 0;

sampler2D heightMap uniforme;
sampler2D normalMap uniforme;
sampler2D uniforme detailNormalMap;
sampler2D emissiveMap uniforme;
sampler2D diffuseMap uniforme;
sampler2D specularMap uniforme;
sampler2D opacityMap uniforme;
samplerCube environmentMap uniforme;

uniforme mat4 worldMatrix;
uniforme mat4 worldInverseTransposeMatrix;
MatrizInversauniforme de visualização mat4;

vec4 litFct(float NdotL, float NdotH, float specExp)
{
ambiente flutuante = 1,0;
float diffuse = max(NdotL, 0.0);
specular flutuante = step(0.0, NdotL) &#42; pow(max(0.0, NdotH), specExp);
return vec4(ambiente, difuso, specular, 1.0);
}

vec3 lerpFct(vec3 v0, vec3 v1, porcentagem de flutuação)
{
retornar v0 + (v1-v0) &#42; por cento;
}

// Phong Sombreamento
void phong_sombreamento(
em vec3 LightColor,
em vec3 normalWS,
em vec3 pointToLightDirWS,
em 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 de 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);

// ------------------------------------------
// Verifique se o TBN está Orthonormalizado
binormalOS = normalize(cross(normalOS, tangentOS));
tangentOS = normalize(cross(binormalOS, normalOS));

vec3 cumulatedNormalOS = normalOS;

// ------------------------------------------
// Atualizar UV
float a = dot(normalOS,-pointToCameraDirWS);
vec3 s = vec3(dot(pointToCameraDirWS,tangentOS), dot(pointToCameraDirWS,binormalOS), a);
vec2 uv = enableTilingInFS == 0 ? iFS_UV : (iFS_UV &#42; lado a lado);
float height = 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; paralaxe) ;

// ------------------------------------------
// Adicionar Normal a partir de normalMap
vec3 normalTS = textura2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x&#42;tangentOS + normalTS.y&#42;binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);

// ------------------------------------------
// Adicionar o mapa normal detalhado
vec3 normalDetailTS = textura2D(detailNormalMap,uv&#42;TilingDetail).xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
variável vec3NormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,Profundidade_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);

// ------------------------------------------
// Calcular Difusão e Specular

// Contribuição clara 0
vec3 diffContrib = vec3(0, 0, 0);
vec3 specContrib = vec3(0, 0, 0);
phong_sombreamento(Lamp0Color, cumulatedNormalWS, pointToLight0DirWS, pointToCameraDirWS, diffContrib, specContrib);

// Contribuição Light 1
vec3 diffContrib2 = vec3(0, 0, 0);
vec3 specContrib2 = vec3(0, 0, 0);
phong_sombreamento(Lamp1Color, cumulatedNormalWS, pointToLight1DirWS, pointToCameraDirWS, diffContrib2, specContrib2);

diffContrib += diffContrib2;
specContrib += specContrib2;

vec4 diffuseColor = texture2D(diffuseMap,uv);

vec3 specularColor = textura2D(specularMap,uv).rgb;
vec3 R = reflect(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;
senão
FallofRefl = (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;

// ------------------------------------------
emissivo vec3 = textura2D(emissiveMap,uv).xyz;

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

// Cor final
vec4 finalColor4 = vec4(finalcolor, textura 2D(opacityMap,uv));

gl_FragColor = finalColor4;
}

Arquivo GLSLFX

O arquivo glslfx define duas técnicas para renderizar a geometria:

  • Utiliza-se a técnica de mosaico de hardware
  • O outro, baseado em um efeito de paralaxe que será usado como substituto se o hardware do usuário não for compatível com o mosaico.

Localizado em .\tessellation_parallax\fs.glsl

Conteúdo:

<?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