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 元素可以有多個子節點。 技術中定義的元素會覆蓋全局定義的元素。
例如,它用來覆寫某些均勻值,並取得此技術的效果變異。
渲染通行證
XML 元素描述渲染通道。 渲染通行描述幾何圖形的渲染。
一個技術可以包含多個渲染過程,並依序執行。 包含不渲染通行的技術等同於包含「螢幕上」渲染通行的技術。
渲染通道中定義的元素會覆蓋母技術中定義的元素。
屬性:
-
輸出
-
畫面外:渲染會被設定成使用者定義的渲染目標
-
螢幕上:渲染會直接到預設的渲染目標
著色器
為每種類型設定 GLSL 著色器檔案。
XML 元素定義:
屬性:
-
類型:GLSL 著色器類型;
-
檔名:glsl 著色器檔案的路徑。 可以是絕對的,也可以是相對於 GLSLFX 檔案的;
-
primitiveType:渲染原始物件的方法。
| table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 | |
|---|---|
| 「類型」值 | 說明 |
| 頂點 | 頂點著色器 |
| 幾何 | 幾何著色器 |
| Tess_control | Tessellation Control 著色器 |
| Tess_eval | Tessellation Evaluation 著色器 |
| 碎片 | 片段著色器 |
| table 0-row-2 1-row-2 2-row-2 3-row-2 | |
|---|---|
| 「primitiveType」值 | 說明 |
| 點 | 以點形式渲染 |
| 線環 | 渲染為線迴圈 |
| 補丁[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) => “”
-
價值:財產的價值。
| 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 | 布林值 | 啟用/停用混合模式 |
| 沒錯 | ||
| 短柄 | ||
| 混合_func | 弦,弦 | 設定來源和目標混合函數 |
| 零 | 對於 OpenGL enum GL_ZERO | |
| 一 | 對於 OpenGL 則是 enum GL_ONE | |
| SRC_color | 對於 OpenGL enum 則是 GL_SRC_COLOR | |
| 一_minus_src_color | 對於 OpenGL enum 則是 GL_ONE_MINUS_SRC_COLOR | |
| 夏令時_color | 對於 OpenGL 則是列舉 GL_DST_COLOR | |
| 一_minus_dst_color | 對於 OpenGL enum GL_ONE_MINUS_DST_COLOR | |
| SRC_alpha | 對於 OpenGL enum GL_SRC_ALPHA | |
| 一_minus_src_alpha | 對於 OpenGL enum 則是 GL_ONE_MINUS_SRC_ALPHA | |
| 夏令時間_alpha | 對於 OpenGL enum GL_DST_ALPHA | |
| 一_minus_dst_alpha | 對於 OpenGL enum 來說,是 GL_ONE_MINUS_DST_ALPHA | |
| 持續_color | 對於 OpenGL enum GL_CONSTANT_COLOR | |
| 一_minus_constant_color | 對於 OpenGL enum 則是 GL_ONE_MINUS_CONSTANT_COLOR | |
| 持續_alpha | 對於 OpenGL enum 為 GL_CONSTANT_ALPHA | |
| 一_minus_constant_alpha | 對於 OpenGL enum 則是 GL_ONE_MINUS_CONSTANT_ALPHA | |
| SRC_alpha_saturate | 對於 OpenGL enum 則是 GL_SRC_ALPHA_SATURATE | |
| SRC1_color | 對於 OpenGL enum 則是 GL_SRC1_COLOR | |
| 一_minus_src1_color | 對於 OpenGL enum 則是 GL_ONE_MINUS_SRC1_COLOR | |
| SRC1_alpha | 對於 OpenGL enum GL_SRC1_ALPHA | |
| 一_minus_src1_alpha | 對於 OpenGL enum 則是 GL_ONE_MINUS_SRC1_ALPHA | |
| 卡爾_face_enabled | 布林值 | 啟用/停用面剔除 |
| 沒錯 | ||
| 短柄 | ||
| 卡爾_face_mode | 字串 | 設定臉部剔除模式 |
| 前面 | 對於 OpenGL enum GL_FRONT | |
| 退後/背面 | 對於 OpenGL enum GL_BACK | |
| 前_and_back | 對於 OpenGL enum GL_FRONT_AND_BACK | |
| 深度_func | 字串 | 設定深度比較函數 |
| 從來沒有 | 對於 OpenGL enum GL_NEVER | |
| 更少 | 對於 OpenGL enum GL_LESS | |
| 利考爾 | 對於 OpenGL enum GL_LEQUAL | |
| 相等 | 對於 OpenGL enum GL_EQUAL | |
| Notequal | 對於 OpenGL enum GL_NOTEQUAL | |
| Gequal | 對於 OpenGL enum GL_GEQUAL | |
| 更偉大 | 對於 OpenGL enum GL_GREATER | |
| 永遠 | 對於 OpenGL enum GL_ALWAYS |
制服
允許覆蓋部分全域定義或母技術中定義的統一。 這允許改變此技術或渲染通道的著色器行為。
請參閱下方制服章節,了解更多關於制服定義的細節。
+++範例
+++
渲染目標
對於「螢幕外」渲染通道,必須在渲染通道中定義渲染目標。
屬性:
- 附件:OpenGL 的連接點,靈感來自 OpenGL 名稱:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_DEPTH_ATTACHMENT => 「深度」
附件:OpenGL 的連接點,靈感來自 OpenGL 名稱:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_DEPTH_ATTACHMENT => 「深度」
- 名稱:渲染目標的名稱。
它可以在後續的渲染階段中用來綁定這個渲染目標作為取樣器。
名稱:渲染目標的名稱。
它可以在後續的渲染階段中用來綁定這個渲染目標作為取樣器。
- 格式:渲染目標的內部格式。
格式:渲染目標的內部格式。
- clear:可選屬性,定義一個清晰值。
如果有,渲染目標會在渲染通道開始時被清除到這個值。
若缺少,渲染目標將保留先前的內容。
關於格式
對於深度格式,支援所有僅深度(無模板)的 OpenGL 格式:
- GL_DEPTH_COMPONENT16 => ‘depth26’
- GL_DEPTH_COMPONENT24 => ‘depth34’
- GL_DEPTH_COMPONENT32 => ‘depth42’
- GL_DEPTH_COMPONENT32F => ‘depth42f’
對於色彩格式,名稱基於 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」:頂點著色器中定義的屬性名稱。
- 「語意」:屬性的語意。
範例:
<?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’:著色器檔案中取樣器變數的名稱。
- 「使用」:取樣器的使用。 它與圖中輸出節點所指定的使用量相符。
- 支援多種使用方式。
- 範例:
<!-- SAMPLERS -->
<sampler name="baseColorMap" usage="basecolor,diffuse"/>
<!-- ... -->
‘isHidden’:布林值,指示取樣器是否應該出現在圖形介面中
- 範例:
<!-- 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 元素定義:
名稱:「制服」
屬性:
「name」:著色器檔案中制服的名稱。
「語義」:制服的語義。 (所有矩陣皆為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 元素定義:
名稱:「制服」
屬性:
- 「name」:著色器檔案中制服的名稱。
- 「預設值」:統一的預設值
- 「最小」:效度範圍的最小值
- 「max」:有效性範圍的最大值
- 「guiName」:應用程式介面中制服的名稱
- ‘guiGroup’:將制服放入應用程式 GUI 的群組名稱
- ‘guiWidget’:用於編輯應用程式圖形介面中統一值的小工具名稱
- 「guiMin」:小工具的最小值
- ‘guiMax’:小工具的最大值
範例:鑲嵌/視差
視差頂點著色器檔案
位於 .\tessellation_parallax\parallax\vs.glsl
內容:
> #version 120
attribute vec4 iVS_Position;
attribute vec4 iVS_Normal;
attribute vec2 iVS_UV;
attribute vec4 iVS_Tangent;
屬性 vec4 iVS_Binormal;
變化 vec3 iFS_Normal;
變化的 vec² iFS_UV;
變化的 vec3 iFS_Tangent;
變化 vec3 iFS_Binormal;
變化 vec3 iFS_PointWS;
uniform mat4 worldMatrix;
uniform mat4 worldViewProjMatrix;
虛空主()
{
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;
}
鑲嵌頂點著色器檔案
位於 .\tessellation_parallax\tessellation\vs.glsl
內容:
>>
#version 120
attribute vec4 iVS_Position;
attribute vec4 iVS_Normal;
attribute vec2 iVS_UV;
attribute vec4 iVS_Tangent;
屬性 vec4 iVS_Binormal;
變化 vec4 oVS_Normal;
變化的 vec² oVS_UV;
變化的 vec4 oVS_Tangent;
變化的 vec4 oVS_Binormal;
虛空主()
{
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(頂點數 = 3)向外;
在 vec4 oVS_Normal[];
in vec2 oVS_UV[];
in vec4 oVS_Tangent[];
in vec4 oVS_Binormal[];
out vec4 oTCS_Normal[];
out vec2 oTCS_UV[];
out vec4 oTCS_Tangent[];
out vec4 oTCS_Binormal[];
均勻浮點鑲嵌因子;
虛空主()
{
gl_TessLevelOuter[0] = 鑲嵌因子;
gl_TessLevelOuter[1] = 鑲嵌因子;
gl_TessLevelOuter[2] = 鑲嵌因子;
gl_TessLevelInner[0] = 鑲嵌因子;
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];
}
Tessellation Evaluation 著色器檔案
位於 .\tessellation_parallax\tessellation\tcs.glsl
內容:
>>
#version 400 核心
佈局(三角形、等於_spacing、CCW)在內;
在 vec4 oTCS_Normal[];
在 vec2 oTCS_UV[];
in vec4 oTCS_Tangent[];
在 vec4 oTCS_Binormal[];
uniform mat4 worldMatrix;
uniform mat4 worldViewProjMatrix;
uniform sampler2D heightMap;
均勻浮子鋪磚 = 1.0f;
均勻浮點高度MapScale = 1.0f;
出 vec3 iFS_Normal;
出 vec2 iFS_UV;
出 vec3 iFS_Tangent;
出 vec3 iFS_Binormal;
出 vec3 iFS_PointWS;
vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2, vec3 uvw)
{
回傳 UVW.x * v0 + UVW.Y * v1 + UVW.z * V2;
}
vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2, vec3 uvw)
{
回傳 UVW.x * v0 + UVW.Y * v1 + UVW.z * V2;
}
虛空主()
{
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 = 插值2D(oTCS_UV[0], oTCS_UV[1], oTCS_UV[2], uvw);
float heightTexSample = texture(heightMap, newUV * tileling).x * 2.0 - 1.0;
newPos += newNormal * heightTexSample * heightMapScale;
vec4 obj_pos = vec4(newPos, 1);
gl_Position = worldViewProjMatrix * obj_pos;
iFS_UV = newUV * 平鋪;
iFS_Tangent = newTangent;
iFS_Binormal = 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 翻_NORMAL_X
#define 翻_NORMAL_Y
#define 翻_NORMAL_Z
#endif //#ifdef ALG_NORMAL_DIRECTX
#ifdef ALG_NORMAL_OPENGL
#define 翻_NORMAL_X
#define 翻_NORMAL_Y
#define 翻_NORMAL_Z
#endif //#ifdef ALG_NORMAL_OPENGL
變化 vec3 iFS_Normal;
變化的 vec² iFS_UV;
變化的 vec3 iFS_Tangent;
變化 vec3 iFS_Binormal;
變化 vec3 iFS_PointWS;
均勻 vec3 Lamp0Pos = vec3(0.0f, 0.0f, 70.0f);
均勻 vec3 燈泡色 = vec3(1.0f, 1.0f, 1.0f);
均勻 vec3 Lamp1Pos = vec3(70.0f, 0.0f, 0.0f);
均勻 vec3 燈泡1Color = vec3(0.198f, 0.198f, 0.198f);
均勻布爾翻轉法則 = 真;
均勻浮點 TilingDetail = 3.0f;
均勻浮點 SpecExpon = 50.0;
均勻浮點 Ks = 1.0;
均勻整數視差_mode = 0;
均勻浮點鑲嵌因子 = 4.0;
均勻浮點高度MapScale = 1.0f;
均勻浮子深度 = 0.5 f_detail;
均勻浮子 Kr = 0.5f;
uniform int KF_on = 1;
均勻浮子KFs = 1.0f;
均勻 vec3 AmbiColor = vec3(0.07f,0.07f,0.07f);
均勻浮子鋪磚 = 1.0f;
uniform int enableTilingInFS = 0;
uniform sampler2D heightMap;
uniform sampler2D normalMap;
uniform sampler2D detailNormalMap;
均勻取樣器2D 發射映射;
uniform sampler2D diffuseMap;
均勻取樣器2D specularMap;
uniform sampler2D 不透明度圖;
uniform samplerCube environmentMap;
uniform mat4 worldMatrix;
uniform mat4 worldInverseTransposeMatrix;
均勻 mat4 視圖逆矩陣;
vec4 litFct(float NdotL, float NdotH, float specExp)
{
浮點環境 = 1.0;
float diffuse = max(NdotL, 0.0);
float 鏡面 = step(0.0, NdotL) * pow(max(0.0, NdotH), specExp);
回傳 vec4(環境、漫射、鏡面、1.0);
}
vec3 lerpFct(vec3 v0, vec3 v1, float percent)
{
回放 V0 + (V1-V0) * 百分比;
}
蓬遮陽
虛空的 Phong_shading(
在 vec3 LightColor,
在 vec3 正規 WS 中,
在 vec3 pointToLightDirWS 中,
在 vec3 pointToCameraDirWS,
inout vec3 DiffuseContrib,
內含 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 翻_NORMAL_X
result.x = -result.x;
#endif // ifdef FLIP_NORMAL_X
#ifdef 翻_NORMAL_Y
result.y = -result.y;
#endif // ifdef FLIP_NORMAL_Y
#ifdef 翻_NORMAL_Z
result.z = -result.z;
#endif // 如果 def FLIP_NORMAL_Z
回傳結果;
}
vec3 normalVecOSToWS(vec3 normal)
{
返回正常;
}
虛空主()
{
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 = normalize(cross(binormalOS, normalOS));
vec3 累積NormalOS = 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 * 平鋪);
float height = texture2D(heightMap,uv).x * 2.0 - 1.0 ;
浮動視差 = 視差_mode == 0 ? (tessellationFactor / 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
UV +=(高度 * S.xy * 視差);
// ------------------------------------------
從法線貼圖新增法線
vec3 normalTS = texture2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x*tangentOS + normalTS.y*binormalOS;
累積NormalOS = 累積NormalOS + normalMapOS;
cumulatedNormalOS = normalize(curmulatedNormalOS);
// ------------------------------------------
新增細節法線貼圖
vec3 normalDetailTS = texture2D(detailNormalMap,uv*TilingDetail).xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
vec3 變數NormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,Depth_detail);
vec3 normalDetailOS = variableNormalDetailTS.x*tangentOS + variableNormalDetailTS.y*binormalOS;
累積正常OS = 累積正常OS + normalDetailOS;
cumulatedNormalOS = normalize(curmulatedNormalOS);
如果 (length(normalTS)<0.0001)
累積 NormalOS = normalOS;
vec3 累積NormalWS = normalVecOSToWS(累積NormalOS);
// ------------------------------------------
計算漫射與鏡面
光 0 貢獻
vec3 diffContrib = vec3(0, 0, 0);
vec3 specContrib = vec3(0, 0, 0);
phong_shading(Lamp0Color, cumulatedNormalWS, pointToLight0DirWS, pointToCameraDirWS, diffContrib, specContrib);
光 1 的貢獻
vec3 diffContrib2 = vec3(0, 0, 0);
vec3 specContrib2 = vec3(0, 0, 0);
phong_shading(Lamp1Color, cumulatedNormalWS, pointToLight1DirWS, pointToCameraDirWS, diffContrib2, specContrib2);
diffContrib += diffContrib2;
specContrib += specContrib2;
vec4 diffuseColor = texture2D(diffuseMap,uv);
vec3 specularColor = texture2D(specularMap,uv).rgb;
vec3 R = reflect(pointToCameraDirWS,累積NormalWS);
vec3 reflColor = Kr * textureCube(environmentMap,R.xyz).bgr;
FallofRefl 浮動;
若 (KFs >= 0.0)
FallofRefl = max((1-dot(pointToCameraDirWS/(KFs),累積NormalWS)),0)*KF_on;
否則
FallofRefl = (1-max(((1-dot(pointToCameraDirWS/(-KFs),累積NormalWS)),0))*KF_on;
如果 (KF_on == 0)
FallofRefl=1.0;
vec3 Ambiant_final = diffuseColor.rgb*AmbiColor;
// ------------------------------------------
vec3 emissive = texture2D(emissiveMap,uv).xyz;
VEC3 Finalcolor = 環境音_final
+ specularColor*specContrib
+ diffuseColor.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>