DXライブラリでシェーダーを作る方法と読み込む方法について説明してます。
※DirectX11を使う前提になります。
シェーダーの作り方
3Dゲームを作っていくと多くの人はシェーダーに手を出すことになるはず。シェーダーは3Dモデルの見栄えを決める大事なものだが、これがけっこうな曲者で何も知らないとつまづきやすい。
DXライブラリでシェーダーを作る場合、本家サイトからDLしたDXライブラリフォルダ内にある「ShaderCompiler」フォルダに必要なものが揃っているのでそこから作成していく。
まず最初にShaderCompiler内にある「***.fx」をコピーして2つ用意し、Visual Studioで開いて編集する。片方は頂点シェーダー(VS)、もう片方はピクセルシェーダー(PS)になる。使用する言語はC/C++ではなくHLSLになるが文法は大体同じ。実際にどんなコードを書くのかは別記事にて。
環境によってはHLSL Toolsコンポーネントを有効にするように促されるので横の「インストーラーに移動」をクリックしてインストールを進める。


編集したらコマンドプロンプトを起動する。タスクバーの検索欄に cmd と入力するとコマンドプロンプトが出てくるので「管理者として実行」を選択する。


コマンドプロンプトが立ち上がったらShaderCompiler.exeがあるフォルダに移動する。
移動したら次のコマンドを入力して.vso/.psoファイルを出力する。ShaderCompiler.exeを直接起動しても何も起こらないので注意。
頂点シェーダー(VS)の方がvsoファイル。
ShaderCompiler.exe /Tvs_4_0 (頂点シェーダ用のfx/HLSLファイルのパス)
ピクセルシェーダー(PS)の方がpsoファイル。
ShaderCompiler.exe /Tps_4_0 (ピクセルシェーダ用のfx/HLSLファイルのパス)
コードにエラーがなければ.vso/.psoファイルが出力される。あとはその2つのファイルを任意の場所に移動させる。
もしコマンドを実行したときに「使用できるD3DX dllがありません~」とエラー文が出たらDirectX End User Runtimesをダウンロードする。

シェーダーを読み込む
シェーダーを作成したら今度はコードからシェーダーを読み込んでいく。
冒頭に書いた通りDirectX11を使うので DxLib_Init() の前にDirectX11を使う宣言をする。
// 使用する Direct3D のバージョンを設定
SetUseDirect3DVersion(DX_DIRECT3D_11);
// DXライブラリ初期化処理
if (DxLib_Init() < 0) {
//エラーなら終了する
return -1;
}
シェーダーを扱う ShaderMng/cpp.h を追加して以下のコードを書いていく。
ShaderMng.h
#ifndef DEF_SHADERMNG_H #define DEF_SHADERMNG_H void ShaderMng_Initialize(); void ShaderMng_Update(); void ShaderMng_Draw(); void ShaderMng_Finalize(); #endif
ShaderMng.cpp
#include "DxLib.h"
#include "ShaderMng.h"
static int VertexShaderHandle; //頂点シェーダー
static int PixelShaderHandle; //ピクセルシェーダー
static bool ShaderLoadSuccess; //オリジナルシェーダーを正しく読み込めたかどうかのフラグ
//初期化
void ShaderMng_Initialize() {
ShaderLoadSuccess = true;
// 頂点シェーダーを読み込む
VertexShaderHandle = LoadVertexShader("読み込みたいvsoファイル");
// 頂点シェーダーを正しく読み込めたか
if (VertexShaderHandle == -1) ShaderLoadSuccess = false;
// ピクセルシェーダーを読み込む
PixelShaderHandle = LoadPixelShader("読み込みたいpsoファイル");
// ピクセルシェーダーを正しく読み込めたか
if (PixelShaderHandle == -1) ShaderLoadSuccess = false;
//オリジナルシェーダーを使うか分岐
if (ShaderLoadSuccess) {
//オリジナルシェーダーを正しく読み込めた場合
// モデルの描画にオリジナルシェーダーを使用する設定をONにする
MV1SetUseOrigShader(TRUE);
// 使用する頂点シェーダーをセット
SetUseVertexShader(VertexShaderHandle);
// 使用するピクセルシェーダーをセット
SetUsePixelShader(PixelShaderHandle);
}
else {
//ライティング処理をOFF
SetUseLighting(FALSE);
}
}
//更新
void ShaderMng_Update() {
}
//描画
void ShaderMng_Draw() {
}
//終了処理
void ShaderMng_Finalize() {
DeleteShader(VertexShaderHandle);
DeleteShader(PixelShaderHandle);
}
あとは Game.cpp にShaderMng.h をインクルードして関数を追加していく。今回は ShaderMng_Update() および ShaderMng_Draw() は何もしないので書かなくてもOK。
Game.cpp
//以下のヘッダーファイルをインクルード
#include "ShaderMng.h"
//略
//初期化
void Game_Initialize() {
//略
//シェーダーの情報初期化
ShaderMng_Initialize();
}
//略
//終了処理
void Game_Finalize() {
//略
ShaderMng_Finalize();
}
タイトル画面から3Dモデルを表示させるという場合は Menu.cpp にも同じようにヘッダーファイルをインクルードして関数を追加していく。
HLSLシェーダーについてきちんと学びたいという人はこの本を買うといいです。
注意事項
DXライブラリ本家にシェーダーのサンプルコードが載っているが、それらはDirectX9で動作するものなのでそのままでは使うことができないことに注意(アルゴリズムの参考にはなる)。
Directx11版のが見たい、という人はこちらの掲示板にサンプルコードが入ったzipファイルがあるのでそちらを参考に。

コメント