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つのテクニックを定義する必要があります。

ジオメトリは、アプリケーションで定義されたいずれかの手法を使用してレンダリングされます。

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
'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ステートの一部を設定できるようにします。

XML要素定義 Name:プロパティ

属性:

  • 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の場合

制服

グローバルまたは親のテクニックで定義された一部のユニフォームをオーバーライドできるようにします。 これにより、このテクニックまたはレンダーパスのシェーダーの動作を変更できます。

定義について詳しくは、以下の 制服 のセクションを参照してください。

+++例

+++

レンダーターゲット

「オフスクリーン」レンダーパスの場合、レンダーターゲットをレンダーパスで定義する必要があります。

XML要素定義 名前:の出力

属性:

  • 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値を定義するオプション属性です。
    存在する場合、レンダーターゲットはレンダーパスの開始時にこの値までクリアされます。
    見つからない場合、レンダーターゲットは以前のコンテンツを保持します。
NOTE
画面上のレンダーパスではカラーレンダーターゲットの使用は禁止されていますが、深度のレンダーターゲットは任意のレンダーパスで共用できます(ただし、シーンで複数のマテリアルをミックスすると、レンダリングが壊れる可能性があります)。

形式について

深度形式の場合、すべての深度のみ(ステンシルなし)の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’:属性のセマンティック。
「意味的」値
説明
位置
頂点の位置(float3)
法線
頂点法線(float3)
textcoord[0…N]
テクスチャ座標バッファーN (float2)
正接[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’: シェーダーファイル内のsampler変数の名前です。
  • ‘usage’:サンプラーの使用方法。 これは、グラフの出力ノードで指定された使用方法と一致します。
'usage’値
説明
拡散
Diffuse地図
不透明
不透明度マップ
発光
Emissive地図
環境閉塞
Ambient occlusion地図
周囲
アンビエントマップ
マスク
マスクマップ
詳細正常
詳細法線マップ
法線
法線マップ
マイクロ
バンプマップ
高さ
Height地図
ディスプレイスメント
ディスプレイスメント地図
specularlevel
Specular level地図
specularcolor
Specularカラーマップ
反射
Specular地図
光沢
光沢マップ
ラフネス
ラフネス地図
異方性ピレベル
異方性レベルの地図
異方性ピアングル
異方性の角度マップ
transmissive
透過地図
反射
反射マップ
屈折
屈折マップ
環境
環境マップ(立方体マップ)
パノラマ
パノラマの地図(緯度・経度の地図)
bluenoisemask
256 x 256のディザリングテクスチャ
  • 複数の用途がサポートされています。
    • 例:
   <!-- SAMPLERS -->

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

     <!-- ... -->

‘isHidden’:サンプラーをGUIに表示するかどうかを示すブーリアン

  • 例:
     <!-- SAMPLERS -->

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

     <!-- ... -->

ラッピングモード:

名前
値
テクスチャ_ラップ_s、テクスチャ_ラップ_t、テクスチャ_ラップ_r
clamp_to_edge
clamp_to_border
mirrored_repeat
繰り返し

テクスチャフィルター

名前
値
テクスチャ_min_filter, テクスチャ_mag_filter
nearest
線形
nearest_ミップマップ_nearest
linear_ミップマップ_nearest
nearest_ミップマップ_linear
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)
worldinversetranspose
ワールド逆転位行列(float16)
worldviewprojection
ワールドビュー投影行列(float16)
viewinverse
ワールド逆行列(float16)
worldview
ワールド表示行列(float16)
modelview
モデルビュー行列(float16)
投影
射影行列(float16)
周囲
シーンの周囲光カラー(float3)
lightposition[0…N]
シーンのN番目のライトの位置(float3)
lightcolor[0…N]
シーンのN番目のライトのカラー(float3)
lightintensity[0…N]
シーンのN番目のライトの強度(浮動小数点)
globaltime
現在の時間(秒単位)
解決策
ビューポート解像度(int2)
マウス
マウスの位置(int2)
samplespostablesize
環境照明(int)の計算に使用するサンプルの数
irradianceshcoefs
球面高調波ベクトルの配列(float3[10])
panoramipmapheight
パノラママップのミップマップレベル数(浮動小数点)
パノラマ変換
角度パノラママップの回転角度(float)
パノラマ性
パノラママップの強度(浮動小数点)
computebinormalinfragmentshader
バイナリはフラグメントごとに計算されますか? (頂点でない場合は頂点ごと) (bool)
isdirectxnormal
DirectXですか? (bool)
uvwscale
u、v、wのスケール値(float3)
renderuvtile
1つのUVタイルのみをレンダリングしますか? (bool)
uvtilecoords
レンダリングするUVタイル座標(int2)

「セマンティック」:制服のセマンティック。 (すべての行列は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カラーのカラーウィジェット
checkbox
boolのCheckBoxウィジェット
  • ‘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 &#42; iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_Tangent = iVS_Tangent.xyz;
iFS_従法線 = iVS_従法線.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;

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 &#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;タイリング).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_Tangent = newTangent;
iFS_Binormal = 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 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) &#42; 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) &#42; 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 &#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 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 &#42; タイリング);
浮動小数点Height= テクスチャ 2D(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;視差) ;

// ------------------------------------------
// normalMapから法線を追加
vec3 normalTS = テクスチャ2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x&#42;tangentOS + normalTS.y&#42;binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);

// ------------------------------------------
//詳細ノーマルマップを追加
vec3 normalDetailTS = テクスチャ 2D(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)
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 &#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 = diffuseColor.rgb&#42;AmbiColor;

// ------------------------------------------
vec3 emissive = テクスチャ2D(emissiveMap,uv).xyz;

vec3 finalcolor = Ambiant_final
​+ specularColor&#42;specContrib
​+ diffuseColor.rgb&#42;diffContrib
​+ (reflColor&#42;specularColor&#42;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>
recommendation-more-help
substance-3d-designer-help-guide