モデルの描画に SetUseVertexShader, SetUsePixelShader で指定したシェーダーを使用した際、モデルが描画されず行き詰まっています
どこら辺が間違っているなど教えてもらえるとありがたいです。よろしくお願いいたします。
<main.cpp>------------------------
#include <DxLib.h>
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
SetUseDirect3DVersion(DX_DIRECT3D_11);
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetBackgroundColor(200,200, 200);
SetDrawScreen(DX_SCREEN_BACK);
int modelHande = MV1LoadModel("./bin/grass.mv1");
// 頂点シェーダーを読み込む
int vshandle = LoadVertexShader("./bin/VertexShaderTestVS.vso");
// ピクセルシェーダーを読み込む
int pshandle = LoadPixelShader("./bin/VertexShaderTestPS.pso");
int vscbhandle = CreateShaderConstantBuffer(sizeof(float) * 4);
FLOAT4* f4;
int startTime= GetNowCount();
int processTime;
// モデルの見える位置にカメラを配置
SetCameraPositionAndTarget_UpVecY(VGet(100, 0, -500), VGet(0.0f, 0.0f, 0.0f));
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
processTime = GetNowCount() - startTime;
DrawFormatString(0,0,GetColor(0,0,0),"ProcessTime:%d",processTime);
// 頂点シェーダー用の定数バッファのアドレスを取得
f4 = (FLOAT4*)GetBufferShaderConstantBuffer(vscbhandle);
// 座標値を取得したアドレスに書き込み
f4->x = (float)processTime/1000.0f;
f4->y = 0.0f;
f4->z = 0.0f;
f4->w = 0.0f;
// 頂点シェーダー用の定数バッファを更新して書き込んだ内容を反映する
UpdateShaderConstantBuffer(vscbhandle);
// 頂点シェーダーの定数バッファを定数バッファレジスタ4にセット
SetShaderConstantBuffer(vscbhandle, DX_SHADERTYPE_VERTEX, 4);
// 使用する頂点シェーダーのセット
SetUseVertexShader(vshandle);
// 使用するピクセルシェーダーをセット
SetUsePixelShader(pshandle);
MV1SetPosition(modelHande, VGet(0, 0, 0));
MV1SetScale(modelHande, VGet(20, 20, 20));
MV1SetUseOrigShader(TRUE);
MV1DrawModel(modelHande);
MV1SetUseOrigShader(FALSE);
}
WaitKey(); // キー入力待ち
// 読み込んだ頂点シェーダーの削除
DeleteShader(vshandle);
DeleteShader(pshandle);
// 頂点シェーダー用定数バッファを削除
DeleteShaderConstantBuffer(vscbhandle);
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
<VertexShaderTestVS.fx>------------------------
// 基本パラメータ
struct DX_D3D11_VS_CONST_BUFFER_BASE
{
float4 AntiViewportMatrix[ 4 ] ; // アンチビューポート行列
float4 ProjectionMatrix[ 4 ] ; // ビュー → プロジェクション行列
float4 ViewMatrix[ 3 ] ; // ワールド → ビュー行列
float4 LocalWorldMatrix[ 3 ] ; // ローカル → ワールド行列
float4 ToonOutLineSize ; // トゥーンの輪郭線の大きさ
float DiffuseSource ; // ディフューズカラー( 0.0f:マテリアル 1.0f:頂点 )
float SpecularSource ; // スペキュラカラー( 0.0f:マテリアル 1.0f:頂点 )
float MulSpecularColor ; // スペキュラカラー値に乗算する値( スペキュラ無効処理で使用 )
float Padding ;
} ;
// 基本パラメータ
cbuffer cbD3D11_CONST_BUFFER_VS_BASE : register( b1 )
{
DX_D3D11_VS_CONST_BUFFER_BASE g_Base ;
} ;
// 頂点座標に加算する値
cbuffer cbTime : register( b4 )
{
float4 g_time ;
} ;
// 頂点シェーダーの入力
struct VS_INPUT
{
float3 Position : POSITION0 ; // 座標( ローカル空間 )
float4 SubPosition : POSITION1 ; // 補助座標
float3 Normal : NORMAL ; // 法線
float3 Tangent : TANGENT ; // 接線
float3 Binormal : BINORMAL ; // 従法線
float4 Diffuse : COLOR0 ; // ディフューズカラー
float4 Specular : COLOR1 ; // スペキュラカラー
float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標0
float2 TexCoords1 : TEXCOORD1 ; // テクスチャ座標1
} ;
// 頂点シェーダーの出力
struct VS_OUTPUT
{
float4 Position : SV_POSITION ; // 座標( プロジェクション空間 )
float4 Diffuse : COLOR0 ; // ディフューズカラー
float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標0
float2 TexCoords1 : TEXCOORD1 ; // テクスチャ座標1
} ;
// main関数
VS_OUTPUT main( VS_INPUT VSInput )
{
VS_OUTPUT VSOutput ;
float4 lWorldPosition ;
float4 lViewPosition ;
// 入力の頂点座標にC++プログラム側で設定した頂点座標を加算する
lWorldPosition.x = sin(g_time.x) * VSInput.Position.y * 0.3;
lWorldPosition.yz = VSInput.Position.yz;
lWorldPosition.w = 1.0f ;
// 頂点座標をビュー空間の座標に変換する
lViewPosition.x = dot( lWorldPosition, g_Base.ViewMatrix[ 0 ] ) ;
lViewPosition.y = dot( lWorldPosition, g_Base.ViewMatrix[ 1 ] ) ;
lViewPosition.z = dot( lWorldPosition, g_Base.ViewMatrix[ 2 ] ) ;
lViewPosition.w = 1.0f ;
// ビュー空間の座標を射影空間の座標に変換する
VSOutput.Position.x = dot( lViewPosition, g_Base.ProjectionMatrix[ 0 ] ) ;
VSOutput.Position.y = dot( lViewPosition, g_Base.ProjectionMatrix[ 1 ] ) ;
VSOutput.Position.z = dot( lViewPosition, g_Base.ProjectionMatrix[ 2 ] ) ;
VSOutput.Position.w = dot( lViewPosition, g_Base.ProjectionMatrix[ 3 ] ) ;
// テクスチャ座標はそのまま代入
VSOutput.TexCoords0 = VSInput.TexCoords0;
// 頂点カラーはそのまま代入
VSOutput.Diffuse = VSInput.Diffuse ;
// 関数の戻り値がピクセルシェーダーに渡される
return VSOutput ;
}
<VertexShaderTestPS.fx>-------------------------------
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 Diffuse : COLOR0; // ディフューズカラー
float4 Specular : COLOR1; // スペキュラカラー
float2 TexCoords0 : TEXCOORD0; // テクスチャ座標
};
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 Color0 : SV_TARGET0; // 色
};
// 定数バッファピクセルシェーダー基本パラメータ
struct DX_D3D11_PS_CONST_BUFFER_BASE
{
float4 FactorColor; // アルファ値等
float MulAlphaColor; // カラーにアルファ値を乗算するかどうか( 0.0f:乗算しない 1.0f:乗算する )
float AlphaTestRef; // アルファテストで使用する比較値
float2 Padding1;
int AlphaTestCmpMode; // アルファテスト比較モード( DX_CMP_NEVER など )
int3 Padding2;
float4 IgnoreTextureColor; // テクスチャカラー無視処理用カラー
};
// 基本パラメータ
cbuffer cbD3D11_CONST_BUFFER_PS_BASE : register(b1)
{
DX_D3D11_PS_CONST_BUFFER_BASE g_Base;
};
SamplerState g_DiffuseMapSampler : register(s0); // ディフューズマップテクスチャ
Texture2D g_DiffuseMapTexture : register(t0); // ディフューズマップテクスチャ
// main関数
PS_OUTPUT main(PS_INPUT PSInput)
{
PS_OUTPUT PSOutput;
float4 TextureDiffuseColor;
// テクスチャカラーの読み込み
TextureDiffuseColor = g_DiffuseMapTexture.Sample(g_DiffuseMapSampler, PSInput.TexCoords0);
// 出力カラー = テクスチャカラー
PSOutput.Color0 = TextureDiffuseColor;
// 出力アルファ = テクスチャアルファ * 不透明度
PSOutput.Color0.a = TextureDiffuseColor.a * g_Base.FactorColor.a;
// 出力パラメータを返す
return PSOutput;
}