0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【DxLib】3Dモデルの法線の方向を再計算する方法

0
Posted at

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;
}

ピクセルシェーダーで、法線デバッグをしてみます。

BaseProject2025 2026_02_03 17_56_09.png

法線の向きでピクセルの色が決まり、x+方向が赤、y+方向が緑方向が緑、z+方向が青になっています。

左のネズミが正しい法線、馬のモデルは法線の方向がおかしくなっています。

解決方法

手順1 DxLibModelViewerを開く

exeファイルを起動して、DxLibModelViewerを開きます。
DxLibModelViewer [ DxLib ver3.22d ] 2026_02_03 18_19_06.png

手順2 法線再計算オプションをONにする

読み込みオプション->法線再計算を左クリックし、法線再計算オプションをONにします。

スクリーンショット (254).png

モデルを読み込んでからでは無く、モデルを読み込む前に法線再計算設定をONにしてください。

モデルを読み込んで保存

D&Dでモデルを読み込んで、ファイル->メッシュをつけて保存でモデルを保存してください。
スクリーンショット (255).png

法線が正しくなっているかを確認する

もう一度プログラムを実行して、法線が正しくなっていることを確認して下さい。
BaseProject2025 2026_02_03 18_44_23.png

総括

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?