• R/O
  • SSH
  • HTTPS

コミット

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


コミットメタ情報

リビジョン357 (tree)
日時2023-07-01 12:17:23
作者xops-mikan

ログメッセージ

DirectXのシェーダーでフォグが描画されない問題の改善、2D描画の処理を修正

変更サマリ

差分

--- trunk/d3dgraphics-directx.cpp (revision 356)
+++ trunk/d3dgraphics-directx.cpp (revision 357)
@@ -58,7 +58,13 @@
5858 hVSDiffuse = NULL;
5959 pPixelShader = NULL;
6060 pPSConstantTable = NULL;
61+ hPSViewPos = NULL;
6162 hPSEnableTexture = NULL;
63+ hPSEnableFog = NULL;
64+ hPSFogColor = NULL;
65+ hPSFogStart = NULL;
66+ hPSFogEnd = NULL;
67+ hPSEnable2DRender = NULL;
6268 #endif
6369
6470 BlockDataIF = NULL;
@@ -237,8 +243,20 @@
237243 if( FAILED(hr) ){ return 1; }
238244
239245 //ピクセルシェーダーの関連変数
246+ hPSViewPos = pPSConstantTable->GetConstantByName(NULL, "ViewPos");
247+ //if( hPSViewPos == NULL ){ return 1; }
240248 hPSEnableTexture = pPSConstantTable->GetConstantByName(NULL, "EnableTexture");
241249 if( hPSEnableTexture == NULL ){ return 1; }
250+ hPSEnableFog = pPSConstantTable->GetConstantByName(NULL, "EnableFog");
251+ if( hPSEnableFog == NULL ){ return 1; }
252+ hPSFogColor = pPSConstantTable->GetConstantByName(NULL, "FogColor");
253+ if( hPSFogColor == NULL ){ return 1; }
254+ hPSFogStart = pPSConstantTable->GetConstantByName(NULL, "FogStart");
255+ if( hPSFogStart == NULL ){ return 1; }
256+ hPSFogEnd = pPSConstantTable->GetConstantByName(NULL, "FogEnd");
257+ if( hPSFogEnd == NULL ){ return 1; }
258+ hPSEnable2DRender = pPSConstantTable->GetConstantByName(NULL, "Enable2DRender");
259+ //if( hPSEnable2DRender == NULL ){ return 1; }
242260
243261 D3DXMatrixIdentity(&VSWorldPosMatrix);
244262 D3DXMatrixIdentity(&VSViewPosMatrix);
@@ -1230,6 +1248,7 @@
12301248 //フォグ
12311249 float fog_st = 100;
12321250 float fog_end = 800;
1251+#if GRAPHIC_ENGINE == 0
12331252 pd3dDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
12341253 pd3dDevice->SetRenderState(D3DRS_FOGCOLOR, D3DCOLOR_RGBA(0, 0, 0, 0));
12351254 pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
@@ -1236,6 +1255,13 @@
12361255 pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE);
12371256 pd3dDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD*)(&fog_st));
12381257 pd3dDevice->SetRenderState(D3DRS_FOGEND, *(DWORD*)(&fog_end));
1258+#else
1259+ float FogColor[4] = {0.0f, 0.0f, 0.0f, 0.0f};
1260+ pPSConstantTable->SetBool(pd3dDevice, hPSEnableFog, true);
1261+ pPSConstantTable->SetFloatArray(pd3dDevice, hPSFogColor, FogColor, 4);
1262+ pPSConstantTable->SetFloat(pd3dDevice, hPSFogStart, fog_st);
1263+ pPSConstantTable->SetFloat(pd3dDevice, hPSFogEnd, fog_end);
1264+#endif
12391265 }
12401266
12411267 D3DCOLOR skycolor;
@@ -1251,12 +1277,21 @@
12511277 }
12521278
12531279 //フォグを設定
1280+#if GRAPHIC_ENGINE == 0
12541281 pd3dDevice->SetRenderState(D3DRS_FOGCOLOR, skycolor);
1282+#else
1283+ float FogColor[4] = {(float)((skycolor>>16)&0xFF)/255.0f, (float)((skycolor>>8)&0xFF)/255.0f, (float)(skycolor&0xFF)/255.0f, 1.0f};
1284+ pPSConstantTable->SetFloatArray(pd3dDevice, hPSFogColor, FogColor, 4);
1285+#endif
12551286
12561287 EnableFogFlag = true;
12571288 }
12581289 else{
1290+#if GRAPHIC_ENGINE == 0
12591291 pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
1292+#else
1293+ pPSConstantTable->SetBool(pd3dDevice, hPSEnableFog, false);
1294+#endif
12601295 EnableFogFlag = false;
12611296 }
12621297 }
@@ -1310,6 +1345,11 @@
13101345 #else
13111346 hVSConstantTable->SetMatrix(pd3dDevice, hVSWorldViewPos, &matView);
13121347 VSViewPosMatrix = matView;
1348+
1349+ if( hPSViewPos != NULL ){
1350+ float Camera[4] = {camera_x, camera_y, camera_z, 1.0f};
1351+ pPSConstantTable->SetFloatArray(pd3dDevice, hPSViewPos, Camera, 4);
1352+ }
13131353 #endif
13141354
13151355 //カメラ設定(射影変換行列)viewangle
@@ -1974,6 +2014,19 @@
19742014
19752015 //深度バッファ比較関数を設定
19762016 pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
2017+
2018+ //フォグを一時的に無効にする
2019+#if GRAPHIC_ENGINE == 0
2020+ pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
2021+#else
2022+ pPSConstantTable->SetBool(pd3dDevice, hPSEnableFog, false);
2023+#endif
2024+
2025+#if GRAPHIC_ENGINE == 1
2026+ if( hPSEnable2DRender != NULL ){
2027+ pPSConstantTable->SetBool(pd3dDevice, hPSEnable2DRender, true);
2028+ }
2029+#endif
19772030 }
19782031
19792032 //! @brief テクスチャフォントサイズ計算
@@ -2441,6 +2494,21 @@
24412494
24422495 //深度バッファ比較関数を元に戻す
24432496 pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
2497+
2498+ //フォグを元に戻す
2499+ if( EnableFogFlag == true ){
2500+#if GRAPHIC_ENGINE == 0
2501+ pd3dDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
2502+#else
2503+ pPSConstantTable->SetBool(pd3dDevice, hPSEnableFog, true);
2504+#endif
2505+ }
2506+
2507+#if GRAPHIC_ENGINE == 1
2508+ if( hPSEnable2DRender != NULL ){
2509+ pPSConstantTable->SetBool(pd3dDevice, hPSEnable2DRender, false);
2510+ }
2511+#endif
24442512 }
24452513
24462514 //! @brief 画面のスクリーンショットを保存
--- trunk/d3dgraphics.h (revision 356)
+++ trunk/d3dgraphics.h (revision 357)
@@ -196,7 +196,13 @@
196196 D3DXHANDLE hVSDiffuse; //!< 頂点シェーダーのディフューズ色
197197 LPDIRECT3DPIXELSHADER9 pPixelShader; //!< ピクセルシェーダー
198198 LPD3DXCONSTANTTABLE pPSConstantTable; //!< ピクセルシェーダーの定数テーブル
199+ D3DXHANDLE hPSViewPos; //!< ピクセルシェーダーのカメラ座標
199200 D3DXHANDLE hPSEnableTexture; //!< ピクセルシェーダーのテクスチャフラグ
201+ D3DXHANDLE hPSEnableFog; //!< ピクセルシェーダーのフォグ有効フラグ
202+ D3DXHANDLE hPSFogColor; //!< ピクセルシェーダーのフォグ色
203+ D3DXHANDLE hPSFogStart; //!< ピクセルシェーダーのフォグの開始深度
204+ D3DXHANDLE hPSFogEnd; //!< ピクセルシェーダーのフォグの終了深度
205+ D3DXHANDLE hPSEnable2DRender; //!< ピクセルシェーダーの2D描画フラグ
200206 D3DXMATRIX VSWorldPosMatrix; //!< 頂点シェーダーに与えた変換行列
201207 D3DXMATRIX VSViewPosMatrix; //!< 頂点シェーダーに与えた変換行列
202208 D3DXMATRIX VSViewProjMatrix; //!< 頂点シェーダーに与えた変換行列