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>
Body
テクニック
テクニックを説明するXMLエレメント。 技術は、電流FXの変化である。 GLSLFXには複数のテクニックを含めることができますが、少なくとも1つのテクニックを定義する必要があります。
ジオメトリは、アプリケーションで定義されたいずれかの手法を使用してレンダリングされます。
属性:
- 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 | |
|---|---|
| 'type’値 | 説明 |
| 頂 | 頂点シェーダ |
| 幾何学 | ジオメトリシェーダ |
| 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ステートの一部を設定できるようにします。
属性:
-
name:設定するプロパティの名前。 この名前は、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 | ||
| 擬似 | ||
| blend_func | 文字列、文字列 | ソースと出力先のブレンド機能の設定 |
| ゼロ | OpenGL列挙GL_ZERO | |
| 1 | (OpenGL列挙GL_ONE用) | |
| src_color | OpenGL列挙GL_SRC_COLOR用 | |
| one_minus_src_color | OpenGL enumの場合: GL_ONE_MINUS_SRC_COLOR | |
| dst_color | OpenGL列挙GL_DST_COLORの場合 | |
| one_minus_dst_color | OpenGL enumの場合: GL_ONE_MINUS_DST_COLOR | |
| src_alpha | OpenGL列挙GL_SRC_ALPHA | |
| one_minus_src_alpha | OpenGL enumの場合: GL_ONE_MINUS_SRC_ALPHA | |
| dst_α | OpenGL列挙GL_DST_ALPHA | |
| one_minus_dst_alpha | OpenGL enumの場合: GL_ONE_MINUS_DST_ALPHA | |
| constant_color | OpenGL列挙GL_CONSTANT_COLOR用 | |
| one_minus_constant_color | OpenGL enumの場合: GL_ONE_MINUS_CONSTANT_COLOR | |
| constant_alpha | OpenGL列挙GL_CONSTANT_ALPHA | |
| one_minus_constant_alpha | OpenGL enumの場合: GL_ONE_MINUS_CONSTANT_ALPHA | |
| src_alpha_saturate | OpenGL enumの場合: GL_SRC_ALPHA_SATURATE | |
| src1_color | OpenGL列挙GL_SRC1_COLOR用 | |
| one_minus_src1_color | OpenGL enumの場合: GL_ONE_MINUS_SRC1_COLOR | |
| src1_alpha | OpenGL列挙GL_SRC1_ALPHA | |
| one_minus_src1_alpha | OpenGL enumの場合: GL_ONE_MINUS_SRC1_ALPHA | |
| curl_面_enabled | ブール値 | 面カリングを有効/無効にする |
| true | ||
| 擬似 | ||
| curl_face_mode | 文字列 | 面のカリングモードの設定 |
| 前面 | OpenGL列挙GL_FRONT用 | |
| 裏 | OpenGL列挙GL_BACKの場合 | |
| front_and_back | OpenGL enumの場合: 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の場合 |
制服
グローバルまたは親のテクニックで定義された一部のユニフォームをオーバーライドできるようにします。 これにより、このテクニックまたはレンダーパスのシェーダーの動作を変更できます。
定義について詳しくは、以下の 制服 のセクションを参照してください。
+++例
+++
レンダーターゲット
「オフスクリーン」レンダーパスの場合、レンダーターゲットをレンダーパスで定義する必要があります。
属性:
- attachment: OpenGLの名前から着想を得たOpenGLのアタッチメントポイント。
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_深度_ATTACHMENT => ‘深度’
attachment: OpenGLの名前から着想を得たOpenGLのアタッチメントポイント。
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_深度_ATTACHMENT => ‘深度’
- 名前:レンダーターゲットの名前です。
後のレンダーパスでこのレンダーターゲットをサンプラーとしてバインドするために使用できます。
名前:レンダーターゲットの名前です。
後のレンダーパスでこのレンダーターゲットをサンプラーとしてバインドするために使用できます。
- 形式:レンダーターゲットの内部形式です。
形式:レンダーターゲットの内部形式です。
- clear: clear値を定義するオプション属性です。
存在する場合、レンダーターゲットはレンダーパスの開始時にこの値までクリアされます。
見つからない場合、レンダーターゲットは以前のコンテンツを保持します。
形式について
深度形式の場合、すべての深度のみ(ステンシルなし)のOpenGL形式がサポートされます。
- GL_深度_COMPONENT16 => ‘深度26’
- GL_深度_COMPONENT24 => ‘深度34’
- GL_深度_COMPONENT32 => ‘深度42’
- GL_深度_COMPONENT32F => ‘深度42f’
カラー形式の場合、名前はOpenGLの列挙名に基づいており、小文字の「GL_」接頭辞は付きません。
3つのチャンネル形式(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’: シェーダーファイル内のsampler変数の名前です。
- ‘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’: シェーダーファイル内のユニフォームの名前です。
「セマンティック」:制服のセマンティック。 (すべての行列は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
視差頂点シェーダーファイル
場所: .\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の変更;
均一mat4 worldMatrix;
均一mat4 worldViewProjMatrix;
void main()
{
gl_Position = worldViewProjMatrix * iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_Tangent = iVS_Tangent.xyz;
iFS_従法線 = iVS_従法線.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;
vec4 oVS_Normalの変更;
vec2 oVS_UVの変更;
vec4 oVS_正接の変更;
vec4 oVS_従法線の変更;
void main()
{
gl_Position = iVS_Position;
oVS_Normal = iVS_Normal;
oVS_UV = iVS_UV;
oVS_正接 = iVS_正接;
oVS_従法線 = iVS_従法線;
}
テセレーション制御シェーダーファイル
場所: .\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_Binormal[];
out vec4 oTCS_Normal[];
out vec2 oTCS_UV[];
out vec4 oTCS_Tangent[];
out vec4 oTCS_Binormal[];
均一フローティングテッセレーション係数;
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];
}
テッセレーション評価シェーダファイル
場所: .\tessellation_parallax\tessellation\tcs.glsl
コンテンツ:
>>
#version 400コア
layout(triangles, equal_spacing, ccw) in;
in vec4 oTCS_Normal[];
in vec2 oTCS_UV[];
in vec4 oTCS_Tangent[];
vec4 oTCS_従法線[];
均一mat4 worldMatrix;
均一mat4 worldViewProjMatrix;
uniform sampler2D heightMap;
均等浮動小数タイリング= 1.0f;
uniform float heightMapScale = 1.0f;
out vec3 iFS_Normal;
vec2 iFS_UV出力;
vec3 iFS_正接を出力します。
vec3 iFS_Binormal;
vec3 iFS_PointWSを出力しました。
vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2, vec3 uvw)
{
return uvw.x * v0 + uvw.y * v1 + uvw.z * v2;
}
vec2 interpolate2D(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_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 *タイリング).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 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
vec3 iFS_Normalの変更;
可変vec2 iFS_UV;
可変vec3 iFS_正接;
可変vec3 iFS_従法線;
vec3 iFS_PointWSの変更;
均一vec3 Lamp0Pos = vec3(0.0f,0.0f,70.0f);
均一vec3 Lamp0Color = vec3(1.0f,1.0f,1.0f);
均一vec3 Lamp1Pos = vec3(70.0f,0.0f,0.0f);
uniform vec3 Lamp1Color = vec3(0.198f,0.198f,0.198f);
uniform bool flipNormal = true;
uniform float TilingDetail = 3.0f;
uniform float SpecExpon = 50.0;
均一フロートKs = 1.0;
uniform int parallax_mode = 0;
uniform float tessellationFactor = 4.0;
uniform float 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;
uniform sampler2D emissiveMap;
uniform sampler2D diffuseMap;
uniform sampler2D specularMap;
uniform sampler2D opacityMap;
uniform samplerCube environmentMap;
均一mat4 worldMatrix;
均一mat4 worldInverseTransposeMatrix;
均一mat4 viewInverseMatrix;
vec4 litFct(float NdotL、float NdotH、float specExp)
{
float ambient = 1.0;
float diffuse = max(NdotL, 0.0);
float Specular = step(0.0, NdotL) * pow(max(0.0, NdotH), specExp);
return vec4(ambient, diffuse, Specular, 1.0);
}
vec3 lerpFct(vec3 v0, vec3 v1, float percent)
{
return v0 + (v1-v0) * percent;
}
//フォンシェーディング
void phong_シェーディング(
vec3 LightColorでは、
vec3 normalWSでは、
vec3 pointToLightDirWSでは、
vec3 pointToCameraDirWSでは、
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 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
結果を返す。
}
vec3 normalVecOSToWS(vec3 normal)
{
return 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_正接);
vec3 binormalOS = normalize(iFS_従法線);
// ------------------------------------------
// TBNが直交化されていることを確認します
binormalOS = normalize(cross(normalOS, tangentOS));
tangentOS = normalize(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 * タイリング);
浮動小数点Height= テクスチャ 2D(heightMap,uv).x * 2.0 - 1.0 ;
float parallax = parallax_mode == 0 ? (tessellationFactor / 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
uv += (Height * s.xy *視差) ;
// ------------------------------------------
// normalMapから法線を追加
vec3 normalTS = テクスチャ2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x*tangentOS + normalTS.y*binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);
// ------------------------------------------
//詳細ノーマルマップを追加
vec3 normalDetailTS = テクスチャ 2D(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)
cumulatedNormalOS = normalOS;
vec3 cumulatedNormalWS = normalVecOSToWS(cumulatedNormalOS);
// ------------------------------------------
// DiffuseとSpecularを計算
//ライト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 diffuseColor = テクスチャ2D(diffuseMap,uv);
vec3 specularColor = テクスチャ2D(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 = diffuseColor.rgb*AmbiColor;
// ------------------------------------------
vec3 emissive = テクスチャ2D(emissiveMap,uv).xyz;
vec3 finalcolor = Ambiant_final
+ specularColor*specContrib
+ diffuseColor.rgb*diffContrib
+ (reflColor*specularColor*FallofRefl)
+放射;
//最終的なカラー
vec4 finalColor4 = vec4(finalcolor, texture2D(opacityMap,uv));
gl_FragColor = finalColor4;
}
GLSLFXファイル
glslfxファイルは、ジオメトリをレンダリングする2つのテクニックを定義します。
- 1つはハードウェアのテッセレーション技術を使う
- もう1つは、ユーザハードウェアがテッセレーションをサポートしていない場合にフォールバックとして使用される視差効果に基づいています。
場所: .\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>