GLSLFX着色器

GLSLFX文件是应用程序与glsl着色器文件之间的桥梁。
它允许使用任意的glsl着色器,而无需修改代码。

文件格式

GLSLFX文件格式为XML文件。 支持注释。

标头和根节点

XML根节点元素名为glslfx。

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

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

    <!-- BODY -->

    <!-- ... -->

</glslfx>

正文

方法

描述方法的XML元素。 技术就是当前外汇的变动。 GLSLFX可以包含多种技术,但必须至少定义一种技术。

几何将使用应用程序定义的技术之一进行渲染。

XML元素定义 名称:方法

属性:

  • name:用于命名技术的任何字符串

XML元素可以有多个子级。 在技术中定义的元素覆盖全局定义的元素。

例如,它用于覆盖某些统一值并获取此技术的FX变化。

渲染通道

描述渲染通道的XML元素。 渲染刀路描述几何的渲染。

一种技术可以包含将按顺序执行的多个渲染刀路。 不包含渲染通道的技术与包含“屏幕上”渲染通道的技术等效。

渲染通道中定义的元素会覆盖父技术中定义的元素。

XML元素定义 名称:次

属性:

  • 输出

  • 屏外:渲染将完成到用户定义的渲染目标中

  • 屏幕上:渲染将导入默认渲染目标

着色器

设置每种类型的GLSL着色器文件。

XML元素定义:

XML元素定义 名称:着色器

属性:

  • 类型:GLSL着色器类型;

  • filename:glsl着色器文件的路径。 可以是绝对的,也可以是相对于GLSLFX文件的;

  • primitiveType:呈现基元的方法。

table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2
“类型”值 描述
顶点 着色器
几何 几何着色器
tess_control 曲面细分控制着色器
tess_eval 曲面细分评估着色器
碎片 碎片着色器
table 0-row-2 1-row-2 2-row-2 3-row-2
“primitiveType”值 描述
点 渲染为点
lineloop 渲染为线条循环
patch[1…N] 渲染为具有[1…N]顶点的修补程序

属性

允许设置OpenGL状态的某些部分。

XML元素定义 名称:属性

属性:

  • 名称:要设置的属性的名称。 该名称基于OpenGL函数或glEnum名称:

    • 枚举语法:不带“GL_”前缀(小写)。 示例: glEnable(GL_BLEND_ENABLE) => “”", glDisable(GL_CULL_FACE) => “”
    • 函数语法:不带“gl”前缀、小写和所有用“_”字符分隔的单词。 示例:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”
  • 枚举语法:不带“GL_”前缀(小写)。 示例: glEnable(GL_BLEND_ENABLE) => “”", glDisable(GL_CULL_FACE) => “”

  • 函数语法:不带“gl”前缀、小写和所有用“_”字符分隔的单词。 示例:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”

  • value:属性的值。

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
“名称”值 “值”值 描述
blend_enabled 布尔值 启用/禁用混合模式
true
假连翘
混合_func 字符串,字符串 设置源和目标混合函数
零 对于OpenGL枚举GL_ZERO
一 对于OpenGL枚举GL_ONE
src_color 对于OpenGL枚举GL_SRC_COLOR
one_minus_src_color 用于OpenGL枚举GL_ONE_MINUS_SRC_COLOR
dst_color 对于OpenGL枚举GL_DST_COLOR
one_minus_dst_color 用于OpenGL枚举GL_ONE_MINUS_DST_COLOR
src_alpha 对于OpenGL枚举GL_SRC_ALPHA
one_minus_src_alpha 用于OpenGL枚举GL_ONE_MINUS_SRC_ALPHA
dst_alpha 对于OpenGL枚举GL_DST_ALPHA
one_minus_dst_alpha 用于OpenGL枚举GL_ONE_MINUS_DST_ALPHA
constant_color 对于OpenGL枚举GL_CONSTANT_COLOR
one_minus_constant_color 用于OpenGL枚举GL_ONE_MINUS_CONSTANT_COLOR
constant_alpha 用于OpenGL枚举GL_CONSTANT_ALPHA
one_minus_constant_alpha 用于OpenGL枚举GL_ONE_MINUS_CONSTANT_ALPHA
src_alpha_saturate 用于OpenGL枚举GL_SRC_ALPHA_SATURATE
src1_color 对于OpenGL枚举GL_SRC1_COLOR
one_minus_src1_color 用于OpenGL枚举GL_ONE_MINUS_SRC1_COLOR
src1_alpha 对于OpenGL枚举GL_SRC1_ALPHA
one_minus_src1_alpha 用于OpenGL枚举GL_ONE_MINUS_SRC1_ALPHA
cull_face_enabled 布尔值 启用/禁用人脸剔除
true
假连翘
cull_face_mode 字符串 设置人脸剔除模式
前面 对于OpenGL枚举GL_FRONT
背面 对于OpenGL枚举GL_BACK
front_and_back 用于OpenGL枚举GL_FRONT_AND_BACK
深度_func 字符串 设置深度比较函数
从不 对于OpenGL枚举GL_NEVER
视图中 用于OpenGL枚举GL_LESS
勒卡尔 对于OpenGL枚举GL_LEQUAL
相等 对于OpenGL枚举GL_EQUAL
notequal 对于OpenGL枚举GL_NOTEQUAL
gequal 对于OpenGL枚举GL_GEQUAL
更大 用于OpenGL枚举GL_GREATER
总是 对于OpenGL枚举GL_ALWAYS

制服

允许覆盖某些全局定义或父技术中定义的制式。 这允许更改此技术或渲染通道的着色器行为。

有关其定义的更多详细信息,请参阅下面的 制服 部分。

+++示例

+++

渲染目标

对于“屏外”渲染通道,必须在渲染通道中定义渲染目标。

XML元素定义 名称:输出

属性:

  • 附件:OpenGL附件点,灵感来自OpenGL名称:
    GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
    GL_深度_附件=> ‘深度’

附件:OpenGL附件点,灵感来自OpenGL名称:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_深度_附件=> ‘深度’

  • 名称:渲染目标的名称。
    可在稍后的渲染通道中使用它将此渲染目标绑定为取样器。

名称:渲染目标的名称。
可在稍后的渲染通道中使用它将此渲染目标绑定为取样器。

  • 格式:渲染目标的内部格式。

格式:渲染目标的内部格式。

  • 清除:定义清除值的可选属性。
    如果存在,渲染目标将在渲染通道开始处被清除为此值。
    如果缺失,渲染目标将保留其以前的内容。
NOTE
“屏幕”渲染通道中禁止使用深度渲染目标,但颜色渲染目标可以与任何渲染通道共享(但在场景中混合多个材料时,可能会中断渲染)。

关于格式

对于深度格式,支持所有仅深度(无模板)的OpenGL格式:

  • GL_深度_组件16 => ‘深度26’
  • GL_深度_组件24 => ‘深度34’
  • GL_深度_组件32 => ‘深度42’
  • GL_深度_组件32F => ‘深度42f’

对于颜色格式,该名称基于OpenGL枚举名称,不带“GL_”前缀(使用小写)。
不支持三种声道格式(RGB),请改用RGBA格式。
支持的每个渠道的位深度:

  • 规范化无符号整数: 8, 16
  • 浮点: 16, 32

这些规则的一个例外是受支持的GL_R11F_G11F_B10F格式:

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

采样器

如果允许覆盖某些全局定义的取样器,则无法在某个技术中定义它们。 这允许为此渲染通道定义取样器用法,或从上一个渲染通道的渲染目标进行读取。

请参阅 取样器 部分以了解有关其定义的更多详细信息。

+++示例

+++

输入顶点格式

这允许定义在顶点着色器中定义的每个属性的语义。

XML元素定义:

名称: ‘vertexformat’

属性:

  • “name”:在顶点着色器中定义的属性的名称。
  • “semantic”:属性的语义。
“语义”值
描述
位置
顶点位置(float3)
正常
顶点法向(float3)
texcoord[0…N]
顶点纹理坐标缓冲区N (float2)
tangent[0…N]
顶点切线缓冲区N (float4)
二正则[0…N]
顶点双正规缓冲区N (float4)

示例:

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

采样器

这允许定义每个取样器的用法。
应用程序使用它来了解要在指定取样器中设置哪种纹理。

XML元素定义:

名称: ‘sampler’

属性:

  • ‘name’:着色器文件中取样器变量的名称。
  • ‘usage’:取样器的用法。 它匹配在图形的输出节点中指定的用法。
“使用情况”值
描述
扩散
漫射图
不透明度
不透明度图
自发光
发射图
环境包容
环境遮蔽图
氛围
环境图
mask
蒙版图
细节正常
细节法线图
正常
法线图
隆起物
凹凸图
Height
Height图
位移
位移图
specularlevel
Specular level图
specularcolor
Specular彩图
Specular
Specular图
光泽度
光泽度图
粗糙度
粗糙度图
各向异性
异嗜性水平图
各向异性
各向异性角映射
传输
透射图
反射
反射图
折射
折射图
环境
环境映射(多维数据集映射)
全景图
全景图(经纬度图)
蓝橡胶
256x256抖动纹理
  • 支持多种用途。
    • 示例:
   <!-- SAMPLERS -->

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

     <!-- ... -->

“isHidden”:指示取样器是否应显示在GUI中的布尔值

  • 示例:
     <!-- SAMPLERS -->

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

     <!-- ... -->

绕排模式:

名称
值
texture_wrap_s、texture_wrap_t、texture_wrap_r
clamp_to_edge
clamp_to_border
mirrored_repeat
重复

纹理滤镜

名称
值
texture_min_filter, texture_mag_filter
最接近的
线性
nearest_镜像转换_nearest
linear_mipmap_nearest
nearest_镜像转换_线性
linear_镜像转换_线性

示例:

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

制服

这允许您添加关于每种着色器制服的其他信息。

XML元素定义:

名称: ‘uniform’

属性:

‘name’:着色器文件中统一的名称。

“语义”值
描述
世界
世界矩阵(float16)
世界反转
全局反转置矩阵(float16)
worldviewprojection
“世界视图”投影矩阵(float16)
viewinverse
全局逆矩阵(float16)
worldview
“世界视图”矩阵(float16)
modelview
模型视图矩阵(float16)
投影
投影矩阵(float16)
氛围
场景环境色(float3)
lightposition[0…N]
场景第N个光的位置(float3)
lightcolor[0…N]
场景第N个光线的颜色(float3)
光照强度[0…N]
场景第N个光线的强度(浮点)
globaltime
当前时间(秒)(浮点)
分辨率
视口分辨率(int2)
鼠
鼠标位置(int2)
示例可发布大小
用于计算环境光照(int)的样本数
辐照食谱
球面谐波矢量的阵列(float3[10])
全景mamipmapheight
全景图中的多级渐远纹理级别数(浮点)
全景旋转
全景图的角度旋转角度(浮点)
全景维护
全景图的强度(浮点)
computebinormalinfragmentshader
是否对每个片段计算次法线? (如果不是,则按每个顶点)(bool)
isdirectxnormal
是DirectX吗? (bool)
uvwscale
u、v、w的缩放值(float3)
renderuvtile
仅渲染1个UV磁贴? (bool)
uvtilecoords
要渲染的UV拼贴坐标(int2)

“semantic”:统一的语义。 (所有矩阵均为float16)。

示例:

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

示例:

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

其他参数

其他附加信息可添加到每个制服,以便:

  • 定义默认值
  • 固定值
  • 控制统一在应用程序中的显示方式:
  • 设置标签
  • 设置用于在应用程序中编辑值的构件信息:
  • 构件名称、最小值、最大值、增量/递减步长
  • 组小组件中的组表单

由于可以覆盖每种技术的制服,因此允许显示每种技术的特定GUI设置。

XML元素定义:

名称: ‘uniform’

属性:

  • ‘name’:着色器文件中制服的名称。
  • ‘default’:统一的默认值
  • ‘min’:有效性范围的最小值
  • ‘max’:有效性范围的最大值
  • “guiName”:应用程序GUI中统一的名称
  • “guiGroup”:将统一放置在应用程序GUI中的组的名称
  • “guiWidget”:用于在应用程序的GUI中编辑统一值的小组件的名称
“guiWidget”值
描述
滑块
floatN的滑块构件
角度
浮点角度构件
颜色
float3、float4颜色的颜色构件
复选框
用于bool的CheckBox构件
  • “guiMin”:小组件的最小值
  • ‘guiMax’:小组件的最大值

示例:镶嵌/视差

视差顶点着色器文件

位于。\tessellation_parallax\parallax\vs.glsl

内容:

> #version 120

属性vec4 iVS_Position;
属性vec4 iVS_Normal;
属性vec2 iVS_UV;
属性vec4 iVS_Tangent;
属性vec4 iVS_Binormal;

改变vec3 iFS_Normal;
改变vec2 iFS_UV;
改变vec3 iFS_Tangent;
改变vec3 iFS_Binormal;
改变vec3 iFS_PointWS;

uniform mat4 worldMatrix;
uniform mat4 worldViewProjMatrix;

void main()
{
gl_Position = worldViewProjMatrix &#42; iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_正切= iVS_正切.xyz;
iFS_Binormal = iVS_Binormal.xyz;
iFS_PointWS = (worldMatrix &#42; iVS_Position)。xyz;
}

镶嵌顶点着色器文件

位于。\tessellation_parallax\tessellation\vs.glsl

内容:

​>>

​#version 120

属性vec4 iVS_Position;
属性vec4 iVS_Normal;
属性vec2 iVS_UV;
属性vec4 iVS_Tangent;
属性vec4 iVS_Binormal;

varying vec4 oVS_Normal;
改变vec2 oVS_UV;
改变vec4 oVS_Tangent;
改变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;
}

镶嵌控制着色器文件

位于。\tessellation_parallax\tessellation\tcs.glsl

内容:

​>>

​#version 400核心
​#extension GL_ARB_tessellation_shader :启用

layout(vertices = 3) out;

in vec4 oVS_Normal[];
in vec2 oVS_UV[];
in vec4 oVS_Tangent[];
in vec4 oVS_次法线[];

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

均匀浮点镶嵌因子;

void main()
{
gl_TessLevelOuter[0] = tesselationFactor;
gl_TessLevelOuter[1] = tesselationFactor;
gl_TessLevelOuter[2] = tesselationFactor;
gl_TessLevelInner[0] = tesselationFactor;
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_正切[gl_InvocationID] = oVS_正切[gl_InvocationID];
oTCS_次法线[gl_InvocationID] = oVS_次法线[gl_InvocationID];
}

曲面细分评估着色器文件

位于。\tessellation_parallax\tessellation\tcs.glsl

内容:

​>>

​#version 400核心

布局(三角形,等_间距,逆时针);

in vec4 oTCS_Normal[];
in vec2 oTCS_UV[];
in vec4 oTCS_Tangent[];
in vec4 oTCS_次法线[];

uniform mat4 worldMatrix;
uniform mat4 worldViewProjMatrix;

uniform sampler2D heightMap;

统一浮点拼贴= 1.0f;
统一浮点高度heightMapScale = 1.0f;

out vec3 iFS_Normal;
out vec2 iFS_UV;
out vec3 iFS_正切;
out vec3 iFS_次法线;
out vec3 iFS_PointWS;

vec3插值3D(vec3 v0、vec3 v1、vec3 v2、vec3 uvw)
{
return uvw.x &#42; v0 + uvw.y &#42; v1 + uvw.z &#42; v2;
}

vec2插值2D(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_正切[0].xyz, oTCS_正切[1].xyz, oTCS_正切[2].xyz, uvw));
vec3 newBinormal = normalize(interpolate3D(oTCS_次法线[0].xyz, oTCS_次法线[1].xyz, oTCS_次法线[2].xyz, uvw);
vec2 newUV = interpolate2D(oTCS_UV[0], oTCS_UV[1], oTCS_UV[2], uvw);

float heightTexSample = 纹理(heightMap, newUV &#42;拼贴)。x &#42; 2.0 - 1.0;
newPos += newNormal &#42; heightTexSample &#42; heightMapScale;

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

iFS_UV= newUV &#42;拼贴;
iFS_正切= newTangent;
iFS_次法线= newBinormal;
iFS_Normal = newNormal;
iFS_PointWS = (worldMatrix &#42; obj_pos)。xyz;
}

片段着色器文件

位于。\tessellation_parallax\fs.glsl

内容:

​>>

​#version 120

// #define ALG_NORMAL_DIRECTX
​#define ALG_NORMAL_OPENGL

​#ifdef ALG_NORMAL_DIRECTX
//#define翻转_法向_X
​#define翻转_法向_Y
//#define翻转_法向_Z
​#endif //#ifdef ALG_NORMAL_DIRECTX

​#ifdef ALG_NORMAL_OPENGL
//#define翻转_法向_X
​#define翻转_法向_Y
//#define翻转_法向_Z
​#endif //#ifdef ALG_NORMAL_OPENGL

改变vec3 iFS_Normal;
改变vec2 iFS_UV;
改变vec3 iFS_Tangent;
改变vec3 iFS_Binormal;
改变vec3 iFS_PointWS;

uniform vec3 Lamp0Pos = vec3(0.0f、0.0f、70.0f);
统一vec3 Lamp0Color = vec3(1.0f、1.0f、1.0f);
uniform vec3 Lamp1Pos = vec3(70.0f、0.0f、0.0f);
uniform vec3 Lamp1Color = vec3(0.198f,0.198f,0.198f);
uniform bool flipNormal = true;
统一浮点TilingDetail = 3.0f;
统一浮点SpecExpon = 50.0;
均匀浮点Ks = 1.0;
uniform int parallax_mode = 0;
均匀浮点镶嵌因子= 4.0;
统一浮点高度heightMapScale = 1.0f;
统一浮点深度_detail = 0.5f;
均匀浮点Kr = 0.5f;
uniform int KF_on = 1;
统一浮点数KF = 1.0f;
uniform vec3 AmbiColor = vec3(0.07f,0.07f,0.07f);
统一浮点拼贴= 1.0f;
uniform int enableTilingInFS = 0;

uniform sampler2D heightMap;
uniform sampler2D normalMap;
uniform sampler2D detailNormalMap;
一致sampler2D emissiveMap;
均匀采样器2D漫射图;
均匀采样器2D specularMap;
uniform sampler2D opacityMap;
uniform samplerCube environmentMap;

uniform mat4 worldMatrix;
一致mat4 worldInverseTransposeMatrix;
统一mat4 viewInverseMatrix;

vec4 litFct(float NdotL、float NdotH、float specExp)
{
浮点环境变量= 1.0;
float spinder = max(NdotL, 0.0);
floatSpecular= step(0.0, NdotL) &#42; pow(max(0.0, NdotH), specExp);
return vec4(环境,扩散,Specular,1.0);
}

vec3 lerpFct(vec3 v0, vec3 v1,浮动百分比)
{
返回v0 + (v1-v0) &#42;百分比;
}

//冯着色
void phong_着色(
在vec3 LightColor中,
在vec3 normalWS,
在vec3 pointToLightDirWS中,
在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)
{
vec3结果= v - vec3(0.5,0.5,0.5);

​#ifdef翻转_法向_X
result.x = -result.x;
​#endif // ifdef FLIP_NORMAL_X
​#ifdef翻转_法向_Y
result.y = -result.y;
​#endif // ifdef FLIP_NORMAL_Y
​#ifdef翻转_法向_Z
result.z = -result.z;
​#endif // ifdef FLIP_NORMAL_Z

返回结果;
}

vec3 normalVecOSToWS(vec3 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);

// ------------------------------------------
//确保TBN正交归一化
binormalOS = normalize(cross(normalOS, tangentOS));
tangentOS =规范化(cross(binormalOS, normalOS));

vec3 cumulatedNormalOS = normalOS;

// ------------------------------------------
//更新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;平铺);
floatHeight= texture2D(heightMap,uv)。x &#42; 2.0 - 1.0 ;
float parallax = parallax_mode == 0 ? (镶嵌系数/ 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
uv += (Height&#42; s.xy &#42;视差) ;

// ------------------------------------------
//从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);

// ------------------------------------------
//添加细节正常映射
vec3 normalDetailTS = detail2D(detailNormalMap,uv&#42;TilingDetail)。xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
vec3 variableNormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,深度_detail);
vec3 normalDetailOS = variableNormalDetailTS.x&#42;tangentOS + variableNormalDetailTS.y&#42;binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalDetailOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);

if (length(normalTS)<0.0001)
累积正常操作系统=正常操作系统;

vec3 cumulatedNormalWS = normalVecOSToWS(cumulatedNormalOS);

// ------------------------------------------
//计算Diffuse和Specular

// Light 0贡献
vec3 diffContrib = vec3(0, 0, 0);
vec3 specContrib = vec3(0, 0, 0);
phong_着色(Lamp0Color, cumulatedNormalWS, pointToLight0DirWS, pointToCameraDirWS, diffContrib, specContrib);

//光源1的贡献
vec3 diffContrib2 = vec3(0, 0, 0);
vec3 specContrib2 = vec3(0, 0, 0);
phong_着色(Lamp1Color, cumulatedNormalWS, pointToLight1DirWS, pointToCameraDirWS, diffContrib2, specContrib2);

diffContrib += diffContrib2;
specContrib += specContrib2;

vec4 diaminstColor = diaminst2D(diaminstMap,uv);纹理2D(diaminstMap,uv);

vec3 specularColor = specular2D(specularMap,uv)。rgb纹理;
vec3 R = reflect(pointToCameraDirWS,cumulatedNormalWS);
vec3 reflColor = Kr &#42; textureCube(environmentMap,R.xyz)。bgr;

float FallofRefl;

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

if (KF_on == 0)
FallofRefl=1.0;

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

// ------------------------------------------
vec3的发射率= texture2D(emissiveMap,uv)。xyz;

vec3 finalcolor = Ambiant_final
​+ specularColor&#42;specContrib
​+ spinderColor.rgb&#42;diffContrib
​+ (reflColor&#42;specularColor&#42;FallofRefl)
+放射性;

//最终颜色
vec4 finalColor4 = vec4(finalcolor, texture2D(opacityMap,uv));

gl_FragColor = finalColor4;
}

GLSLFX文件

glslfx文件定义了两种渲染几何图形的技术:

  • 一种是采用硬件镶嵌技术
  • 另一种是基于视差效果,如果用户硬件不支持曲面细分,该效果将被用作回退。

位于。\tessellation_parallax\fs.glsl

内容:

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