DxLibを使いつつシェーダーを併用した際に、法線方向の整合性が取れないことがあります。
今回はDxLibModelViewerの機能を利用して、法線を再計算する方法を紹介します。
前提知識
-
DxLibで3Dゲーム開発をしたことがある -
DxLibModelViewerの基本を理解している
DxLibModelViewerの使用方法はこちらから👇
トラブル
ps_model.hlsl
//----------------------------------------------------------------------------
//! @file ps_model.hlsl
//! @brief MV1モデルピクセルシェーダー
//----------------------------------------------------------------------------
#include "dxlib_ps.h"
// 頂点シェーダーの出力
struct VS_OUTPUT_MODEL
{
float4 position_ : SV_Position; //!< 座標 (スクリーン空間)
float4 curr_position_ : CURR_POSITION; //!< 現在の座標 (スクリーン空間)
float3 world_position_ : WORLD_POSITION; //!< ワールド座標
float3 normal_ : NORMAL0; //!< 法線
float4 diffuse_ : COLOR0; //!< Diffuseカラー
float2 uv0_ : TEXCOORD0; //!< テクスチャ座標
float4 prev_position_ : PREV_POSITION; //!< 1フレーム前の座標 (スクリーン空間) ※末尾に追加されているため注意
};
typedef VS_OUTPUT_MODEL PS_INPUT_MODEL;
//---------------------------------------------------
// 定数バッファ
// CPUから受け渡される値。ReadOnly。
//---------------------------------------------------
cbuffer CameraInfo : register(b10)
{
matrix mat_view_; //!<ビュー行列
matrix mat_proj_; //!<投影行列
float3 eye_position_; //!<カメラ位置
};
//----------------------------------------------------------------------------
// メイン関数
//----------------------------------------------------------------------------
PS_OUTPUT main(PS_INPUT_MODEL input)
{
PS_OUTPUT output;
float2 uv = input.uv0_;
float3 N = normalize(input.normal_); // 法線
//法線デバッグ
output.color0_ = float4(N, 1);
// 出力パラメータを返す
return output;
}
ピクセルシェーダーで、法線デバッグをしてみます。
法線の向きでピクセルの色が決まり、x+方向が赤、y+方向が緑方向が緑、z+方向が青になっています。
左のネズミが正しい法線、馬のモデルは法線の方向がおかしくなっています。
解決方法
手順1 DxLibModelViewerを開く
exeファイルを起動して、DxLibModelViewerを開きます。
![DxLibModelViewer [ DxLib ver3.22d ] 2026_02_03 18_19_06.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3943148%2F2631dc25-0de6-4e4a-91a5-3f0e15aa3875.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a3a38563a25a0e3bc27c978238eb9a1c)
手順2 法線再計算オプションをONにする
読み込みオプション->法線再計算を左クリックし、法線再計算オプションをONにします。
モデルを読み込んでからでは無く、モデルを読み込む前に法線再計算設定をONにしてください。
モデルを読み込んで保存
D&Dでモデルを読み込んで、ファイル->メッシュをつけて保存でモデルを保存してください。

法線が正しくなっているかを確認する
もう一度プログラムを実行して、法線が正しくなっていることを確認して下さい。

総括
-
DxLibとシェーダーを併用している際に法線の整合性が取れないときは、DxLibModelViewerの法線再計算オプションをONにしてモデルを読み込むことで改善することがある。

