DXライブラリにて、ピクセルシェーダーのロードができない
Posted: 2017年2月11日(土) 17:18
現在、DXライブラリを利用して、3Dアクションゲームのステージを作成するための、ステージエディタ「ActionStageEditor」を作成しているのですが、モデル等をそのまま描画すると何か寂しいので、技術評価プログラムを作成し、シェーダーを勉強し始めました。
hart_edsf様http://qiita.com/hart_edsf/items/799b0af6d63f9e200853を参考にし、fxファイルの記述・コンパイルを行い、「test.pso」を生成しました。
本体を記述、いざ実行すると、画面が真っ暗です。
・本体プログラム
それぞれの機能等でクラス分けをしているため、描画クラスの定義部分を示します。
また、構造体「StageData」「StageTemplateData」は、構造体「ObjectData」の配列を保持し、「ObjectData」は、モデルデータの場所、位置、回転、縮尺などのデータを持ちます。「StageData」は「StageTemplateData」を保持します。
・ログ
問題のある場所(25行目、MessageBoxが表示されている時点)で出力されるデバッグ情報を示します。
・環境
[OS]:Windows 10 Pro (x64)
[コンパイラ]:Visual C++ 2015(x64/x86)
[IDE]:Visual Studio 2015 Community
ピクセルシェーダーファイルをフルパスで指定してみたり、ピクセルシェーダーのコンパイル時にバージョンを変えてコンパイルしてみたりと努力しましたが、解決までたどり着くことはできませんでした。
C++の知識についてですが、始めてから大体1、2年立つでしょうか。クラス、構造体やポインタ等、基本的なことは理解しているつもりです。
しかしながらまだまだ初心者ですので、分からない部分もあるかもしれませんが、それに関しては上乗せで質問させていただきます。
汚いコードで申し訳ないです。
この現象について、何か分かる方はどうかご教授お願い致します。
初質問ですので、(理解したつもりですが)ルールに従っていない/ふさわしくない事柄があればお申し付けください。速やかに修正・改善に努めます。
hart_edsf様http://qiita.com/hart_edsf/items/799b0af6d63f9e200853を参考にし、fxファイルの記述・コンパイルを行い、「test.pso」を生成しました。
本体を記述、いざ実行すると、画面が真っ暗です。
・本体プログラム
それぞれの機能等でクラス分けをしているため、描画クラスの定義部分を示します。
#include "GV.h"
GameDrawer::GameDrawer(StageData* stgData) {
Stage = stgData;
}
GameDrawer::GameDrawer(StageTemplateData* stgTemplateData) {
Stage_TemplateData = stgTemplateData;
StageTemplateOnly = true;
}
void GameDrawer::Initialize() {
if (StageTemplateOnly) {
EntityMgr = new EntityManager(Stage_TemplateData);
StgMgr->StageTemplateData_Initialize(Stage_TemplateData);
}else{
EntityMgr = new EntityManager(Stage);
StgMgr->StageData_Initialize(Stage);
}
shaderhandle = LoadPixelShader("test.pso");
if (shaderhandle == -1) {
printfDebugMessage("利用可能なプログラマブルシェーダー:%d\n", GetValidShaderVersion());
MessageBox(GetMainWindowHandle(), "ピクセルシェーダーの作成に失敗しました。", "ERROR", MB_OK);
}
thirdscreen = MakeScreen(Window_SizeX, Window_SizeY);
//頂点の設定
for (int i = 0; i < 4; i++)
{
vertex[i].pos = VGet((i % 2)*Window_SizeX, (i / 2)*Window_SizeY, 0);
vertex[i].rhw = 1.0f;
vertex[i].dif = GetColorU8(255, 255, 255, 255);
vertex[i].spc = GetColorU8(0, 0, 0, 0);
vertex[i].u = vertex[i].su = (float)(i % 2);
vertex[i].v = vertex[i].sv = (float)(i / 2);
}
}
void GameDrawer::Finalize() {
if (StageTemplateOnly) {
StgMgr->StageTemplateData_Finalize(Stage_TemplateData);
}
else {
StgMgr->StageData_Finalize(Stage);
}
delete(EntityMgr);
}
void GameDrawer::Process() {
//エンティティ情報を更新
EntityMgr->Update();
// カメラの位置と角度を更新
SetCameraPositionAndAngle(Camera_Position, Camera_Rotation.x, Camera_Rotation.y, Camera_Rotation.z);
}
void GameDrawer::Draw() {
SetDrawScreen(thirdscreen);
ClearDrawScreen();
VECTOR LightPos = GetLightPosition();
SetLightPosition(VAdd(LightPos, VGet(0, 10, 0)));
SetUseLighting(FALSE);
DrawSphere3D(GetLightPosition(), 1000.0f, 100, GetColor(255, 255, 255), GetColor(255, 255, 255), TRUE);
SetUseLighting(TRUE);
//ステージモデルを描画
if (StageTemplateOnly) {
DrawStageTemplate();
}
else {
DrawStageTemplate();
DrawStage();
}
//エンティティを描画
EntityMgr->Draw();
//描画対象をバックスクリーンに戻してシェーダを使って描画
SetDrawScreen(DX_SCREEN_BACK);
//シェーダで使うテクスチャは先ほど作った描画可能画像
SetUseTextureToShader(0, thirdscreen);
//ピクセルシェーダのセット
SetUsePixelShader(shaderhandle);
DrawPrimitive2DToShader(vertex, 4, DX_PRIMTYPE_TRIANGLESTRIP);
//ScreenFlip();
//ステージモデルを描画
if (StageTemplateOnly) {
DrawStageTemplate();
}
else {
DrawStageTemplate();
DrawStage();
}
//エンティティを描画
EntityMgr->Draw();
}
void GameDrawer::DrawStageTemplate() {
for (int i = 0; i < Stage_TemplateData->objectNum; i++) {
MV1DrawModel(Stage_TemplateData->objects[i].modelHandle);
}
}
void GameDrawer::DrawStage() {
for (int i = 0; i < Stage->objectNum; i++) {
MV1DrawModel(Stage->userObjects[i].modelHandle);
}
}
・ログ
問題のある場所(25行目、MessageBoxが表示されている時点)で出力されるデバッグ情報を示します。
[ActionStageEditor_DEBUG] ファイル"\stage\test\test.cfstgt"を正常に読み込みました。(1944324byte)
[ActionStageEditor_DEBUG] ステージテンプレートデータ"test"の読み込みを開始します...
[ActionStageEditor_DEBUG] ステージテンプレートデータ"test"の読み込み最適化を開始します...
[ActionStageEditor_DEBUG] オブジェクト"stage/test/models/盆地~海.x"の読み込み最適化を開始します...
[ActionStageEditor_DEBUG] オブジェクト"stage/test/models/盆地~海.x"の読み込み最適化完了
[ActionStageEditor_DEBUG] ステージテンプレートデータ"test"の読み込み最適化完了
[ActionStageEditor_DEBUG] オブジェクトモデル"stage/test/models/盆地~海.x"の読み込みを開始...
[ActionStageEditor_DEBUG] オブジェクトモデル"stage/test/models/盆地~海.x" 正常に読み込み
[ActionStageEditor_DEBUG] ステージテンプレートデータ"test" 正常に読み込みました。
0x00007FF9D58E7788 で例外がスローされました (ActionStageEditor.exe 内): Microsoft C++ の例外: _com_error (メモリの場所 0x000000B1BBDACDF0)。
3939:ピクセルシェーダーの作成に失敗しました
[ActionStageEditor_DEBUG] 利用可能なプログラマブルシェーダー:500
(ここでエラーダイアログ表示)
・環境
[OS]:Windows 10 Pro (x64)
[コンパイラ]:Visual C++ 2015(x64/x86)
[IDE]:Visual Studio 2015 Community
ピクセルシェーダーファイルをフルパスで指定してみたり、ピクセルシェーダーのコンパイル時にバージョンを変えてコンパイルしてみたりと努力しましたが、解決までたどり着くことはできませんでした。
C++の知識についてですが、始めてから大体1、2年立つでしょうか。クラス、構造体やポインタ等、基本的なことは理解しているつもりです。
しかしながらまだまだ初心者ですので、分からない部分もあるかもしれませんが、それに関しては上乗せで質問させていただきます。
汚いコードで申し訳ないです。
この現象について、何か分かる方はどうかご教授お願い致します。
初質問ですので、(理解したつもりですが)ルールに従っていない/ふさわしくない事柄があればお申し付けください。速やかに修正・改善に努めます。