SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MikuMikuEffectで学ぶHLSL入門

「MikuMikuEffect」のエフェクトファイルの内部構成とシェーダコードの編集方法

MikuMikuEffectで学ぶHLSL入門(3)

ダウンロード simple.zip (1.6 KB)

ピクセルシェーダの編集

 ピクセルシェーダでは、スクリーン上に展開されたオブジェクトの各ピクセルの色を計算します。今度はこのピクセルシェーダを改変してみます。

simple.fx ピクセルシェーダ
float4 Basic_PS( float2 Tex : TEXCOORD1, float3 Normal : TEXCOORD2, float3 Eye : TEXCOORD3 ) : COLOR0
{
    float4 Color = 0;

    // ディフューズ色+アンビエント色 計算
    Color.rgb = saturate( max(0,dot( Normal, -LightDirection )) * DiffuseColor.rgb + AmbientColor );
    Color.a = DiffuseColor.a;

    // スペキュラ色計算
    float3 HalfVector = normalize( normalize(Eye) + -LightDirection );
    float3 Specular = pow( max(0,dot( HalfVector, normalize(Normal) )), SpecularPower ) * SpecularColor;

    if ( use_texture ) {
        // テクスチャ適用。テクスチャが指定されている場合のみ。
        Color *= tex2D( ObjTexSampler, Tex );
    }
    if ( use_toon ) {
        // トゥーン適用。トゥーンが指定されている場合のみ。
        float LightNormal = dot( Normal, -LightDirection );
        Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal * 16 + 0.5));
    }
    // スペキュラ適用
    Color.rgb += Specular;

    return Color;
}

色情報の改変

 ピクセルシェーダの末尾を以下のように編集してみます。

更新5
    // スペキュラ適用
    Color.rgb += Specular;

    Color = float4(1,0,0,1);    //この行を追加

    return Color;
}

 結果は以下のとおり、モデル全体が赤色で塗りつぶされます。これは、出力する色情報を赤色(R=100%,G=0%,B=0%,A=100%)に固定したためです。

図11 単色化
図11 単色化

 また、以下のように色のAlpha値だけ変更することもできます。

更新6
    // スペキュラ適用
    Color.rgb += Specular;

    Color.a = 0.5;    //この行を追加

    return Color;
}

 すると、以下のように モデル全体が半透明に成ります。

図12 半透明化
図12 半透明化

色情報の改変2

 以下のように編集すると、出力色のRGBが反転します。

更新7
    // スペキュラ適用
    Color.rgb += Specular;

    Color.rgb = float3(1,1,1) - Color.rgb;  //この行を追加

    return Color;
}
図13 色反転
図13 色反転

 また、以下のように編集すると、色のRGBが平均化され、グレースケールになります。

更新8
    // スペキュラ適用
    Color.rgb += Specular;

    float Gray = (Color.r + Color.g + Color.b ) / 3;  //この行を追加
    Color.rgb = float3(Gray, Gray, Gray);             //同上

    return Color;
}
図14 グレースケール
図14 グレースケール

ライティング改変

 次に、以下のように編集してみます。

更新9
    // スペキュラ適用
    // Color.rgb += Specular;      // この行をコメントアウト

    return Color;
}

 すると、以下のように反射光(スペキュラ)が失われ、光沢感がなくなります。

図15 スペキュラなし
図15 スペキュラなし

 また、以下のようにSpecularを10倍に編集すると、当然、光沢感が強調されます。

更新10
    // スペキュラ適用
    Color.rgb += Specular * 10;      // この行を編集

    return Color;
}
図16 スペキュラ強調
図16 スペキュラ強調

ライティング改変2

 次に以下のように編集してみましょう。

更新11
    if ( use_toon ) {
        // トゥーン適用。トゥーンが指定されている場合のみ。
        float LightNormal = dot( Normal, -LightDirection );
        //Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal * 16 + 0.5));  // この行をコメントアウト
        Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal));             // この行を追加
                  }

すると、トゥーン処理が失われ、トゥーンシェーダではなくフォンシェーダ風になります。

図17 フォンシェーダ風
図17 フォンシェーダ風

最後に

 今回は、エフェクトファイルの内部構成と、シェーダコードの簡単な改変について解説しました。次回はシェーダコードを解説する予定です。

参考資料

  1. MSDNライブラリ 『エフェクト フォーマット (Direct3D 9)
  2. MSDNライブラリ 『HLSL のリファレンス
修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
MikuMikuEffectで学ぶHLSL入門連載記事一覧

もっと読む

この記事の著者

舞力介入P(ブリョクカイニュウピー)

ニコニコ動画でMMD関連のツール開発者として活動中。代表作は「MikuMikuEffect」。我流のAPI Hookを常套手段とする、邪道プログラマです。ニコニコ動画マイリスト

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6122 2011/09/02 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー