DX11エフェクトシステムの作成 Part1 FXファイル解析

投稿日:

DirectX11ではEffect関連の機能が削除されていて、使用するには別途公開されているEffects11ソースコードが必要なります。しかし、その説明には古いコードの移植支援とあるため、あまり推奨されているものではないようです。
そこで、EffectのFXファイルを使用した独自のエフェクトシステムを作成してみます。
まず最初はFXファイル(HLSL)の字句解析と構文解析を行い必要な情報を取得できるようにします。


エフェクトシステム概要

とりあえず名前を”zgFX”
必要最小限の機能のみ実装、エフェクトやシェーダコードの情報取得を主な目的とする。

対応機能

・各種ステート定義
・techniqueとpass
・passでのステート設定、コンパイル設定
・変数情報の取得(機能限定)


FXファイル(HLSL)の解析

FXファイル仕様 Effect Format (Direct3D 11)

検証用に使用したFXファイル

※一部の仕様のみに対応

//fxファイル解析サンプル
// (解析対象)
// 各種ステート定義
// techniqueとpass
// passでのステート設定、コンパイル設定

#include "test.h"//include処理検証用

// 構造体定義
struct CBuffScene
{
    matrix mtxProj;
    matrix mtxView;
    matrix mtxWorld;
};
//-------------
struct VS_INPUT
{
    float4 Pos : POSITION;
    float3 Nor : NORMAL;
    float2 Tex : TEXCOORD0;
};
//-------------
struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD0;
};

// 定数バッファ
cbuffer CB1 : register( b1 )
{
    CBuffScene Scene;
};

// 変数
Texture2D txDiffuse;
Texture2D<uint> txStencil : register( t9 );//オブジェクト型指定、register

// サンプラーステート(解析対象)
SamplerState samLinear {
    Filter = MIN_MAG_LINEAR_MIP_POINT;
    AddressU = Clamp;
    AddressV = Clamp;
};

// サンプラーステート 定義なし
SamplerState samNear : NEAR_SAMPLER;// セマンティクス指定
SamplerState samNear2 : register( s2 );// register


// 関数
//-------------------------
PS_INPUT vsBasic( VS_INPUT input)
{
    PS_INPUT output = (PS_INPUT)0;

    float4 pos = mul( input.Pos, Scene.mtxWorld );
    pos = mul( pos, Scene.mtxView );
    output.Pos = mul( pos, Scene.mtxProj );
    output.Tex = input.Tex;

    return output;
}

//----------------------------
float4 psBasic( PS_INPUT input ) : SV_Target0
{
    return txDiffuse.Sample( samLinear, input.Tex);
}

// ステート定義(解析対象)
BlendState NoBlend {
    BlendEnable[0] = FALSE;
};

DepthStencilState DepthTestOn {
    DepthEnable = TRUE;
};

RasterizerState rsWireframe {
    FillMode = WireFrame;
};

// テクニック(解析対象)
technique11 t0 {

    //パス(解析対象)
    pass p0 {

        // ステート設定(解析対象)
        SetBlendState( NoBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        SetDepthStencilState( DepthTestOn, 0 );
        SetRasterizerState( rsWireframe );
		
        // シェーダ(解析対象)
        SetVertexShader( CompileShader( vs_5_0, vsBasic() ) );
        SetPixelShader( CompileShader( ps_5_0, psBasic() ) );
    }
}

プロプロセス

コメントや#include、#defineなどはD3DPreprocessを使用。
使用方法は「D3DPreprocessでプリプロセス」

字句解析

特別な処理はありません。再利用できるように、字句解析とプリプロセスはzgFXから分離しておきます。
識別子(変数名など)、キーワード、数値、演算子を解析しそのID(enum定義)と文字列、数値を順次取得していきます。

構文解析

FXファイルの仕様に従って、必要な情報を取得します。シェーダ関数や構造体定義などはスキップするので複雑な解析処理はありません。定義された文字列や数値を取得するのみ。なので既存の構文解析ライブラリなどは使用しません。


サンプルプログラム

エフェクトシステム作成Part1 FXファイル解析

“DX11エフェクトシステムの作成 Part1 FXファイル解析” をダウンロード dx11Effect0.zip – 412 回のダウンロード – 18 KB

コメントを残す

メールアドレスが公開されることはありません。

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.