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可以包含多种技术,但必须至少定义一种技术。
几何将使用应用程序定义的技术之一进行渲染。
属性:
- name:用于命名技术的任何字符串
XML元素可以有多个子级。 在技术中定义的元素覆盖全局定义的元素。
例如,它用于覆盖某些统一值并获取此技术的FX变化。
渲染通道
描述渲染通道的XML元素。 渲染刀路描述几何的渲染。
一种技术可以包含将按顺序执行的多个渲染刀路。 不包含渲染通道的技术与包含“屏幕上”渲染通道的技术等效。
渲染通道中定义的元素会覆盖父技术中定义的元素。
属性:
-
输出
-
屏外:渲染将完成到用户定义的渲染目标中
-
屏幕上:渲染将导入默认渲染目标
着色器
设置每种类型的GLSL着色器文件。
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状态的某些部分。
属性:
-
名称:要设置的属性的名称。 该名称基于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 |
制服
允许覆盖某些全局定义或父技术中定义的制式。 这允许更改此技术或渲染通道的着色器行为。
有关其定义的更多详细信息,请参阅下面的 制服 部分。
+++示例
+++
渲染目标
对于“屏外”渲染通道,必须在渲染通道中定义渲染目标。
属性:
- 附件:OpenGL附件点,灵感来自OpenGL名称:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_深度_附件=> ‘深度’
附件:OpenGL附件点,灵感来自OpenGL名称:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_深度_附件=> ‘深度’
- 名称:渲染目标的名称。
可在稍后的渲染通道中使用它将此渲染目标绑定为取样器。
名称:渲染目标的名称。
可在稍后的渲染通道中使用它将此渲染目标绑定为取样器。
- 格式:渲染目标的内部格式。
格式:渲染目标的内部格式。
- 清除:定义清除值的可选属性。
如果存在,渲染目标将在渲染通道开始处被清除为此值。
如果缺失,渲染目标将保留其以前的内容。
关于格式
对于深度格式,支持所有仅深度(无模板)的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”:属性的语义。
示例:
<?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’:取样器的用法。 它匹配在图形的输出节点中指定的用法。
- 支持多种用途。
- 示例:
<!-- SAMPLERS -->
<sampler name="baseColorMap" usage="basecolor,diffuse"/>
<!-- ... -->
“isHidden”:指示取样器是否应显示在GUI中的布尔值
- 示例:
<!-- SAMPLERS -->
<sampler name="bluenoiseMask" usage="bluenoisemask" ishidden="true"/>
<!-- ... -->
绕排模式:
纹理滤镜
示例:
<?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’:着色器文件中统一的名称。
“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中编辑统一值的小组件的名称
- “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 * iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_正切= iVS_正切.xyz;
iFS_Binormal = iVS_Binormal.xyz;
iFS_PointWS = (worldMatrix * 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 * v0 + uvw.y * v1 + uvw.z * v2;
}
vec2插值2D(vec2 v0、vec2 v1、vec2 v2、vec3 uvw)
{
return 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_正切[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 *拼贴)。x * 2.0 - 1.0;
newPos += newNormal * heightTexSample * heightMapScale;
vec4 obj_pos = vec4(newPos, 1);
gl_Position = worldViewProjMatrix * obj_pos;
iFS_UV= newUV *拼贴;
iFS_正切= newTangent;
iFS_次法线= newBinormal;
iFS_Normal = newNormal;
iFS_PointWS = (worldMatrix * 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) * pow(max(0.0, NdotH), specExp);
return vec4(环境,扩散,Specular,1.0);
}
vec3 lerpFct(vec3 v0, vec3 v1,浮动百分比)
{
返回v0 + (v1-v0) *百分比;
}
//冯着色
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 * LightColor;
SpecularContrib = litV.y * litV.z * Ks * 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 *平铺);
floatHeight= texture2D(heightMap,uv)。x * 2.0 - 1.0 ;
float parallax = parallax_mode == 0 ? (镶嵌系数/ 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
uv += (Height* s.xy *视差) ;
// ------------------------------------------
//从normalMap添加法线
vec3 normalTS = texture2D(normalMap,uv)。xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x*tangentOS + normalTS.y*binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);
// ------------------------------------------
//添加细节正常映射
vec3 normalDetailTS = detail2D(detailNormalMap,uv*TilingDetail)。xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
vec3 variableNormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,深度_detail);
vec3 normalDetailOS = variableNormalDetailTS.x*tangentOS + variableNormalDetailTS.y*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 * textureCube(environmentMap,R.xyz)。bgr;
float FallofRefl;
if (KF >= 0.0)
FallofRefl = max((1-dot(pointToCameraDirWS/(KFs),cumulatedNormalWS)),0)*KF_on;
else
FallofRefl = (1-max((1-dot(pointToCameraDirWS/(-KFs),cumulatedNormalWS))),0)*KF_on;
if (KF_on == 0)
FallofRefl=1.0;
vec3 Ambiant_final = spinderColor.rgb*AmbiColor;
// ------------------------------------------
vec3的发射率= texture2D(emissiveMap,uv)。xyz;
vec3 finalcolor = Ambiant_final
+ specularColor*specContrib
+ spinderColor.rgb*diffContrib
+ (reflColor*specularColor*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>