X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
リビジョン | 357 (tree) |
---|---|
日時 | 2023-07-01 12:17:23 |
作者 | xops-mikan |
DirectXのシェーダーでフォグが描画されない問題の改善、2D描画の処理を修正
@@ -58,7 +58,13 @@ | ||
58 | 58 | hVSDiffuse = NULL; |
59 | 59 | pPixelShader = NULL; |
60 | 60 | pPSConstantTable = NULL; |
61 | + hPSViewPos = NULL; | |
61 | 62 | hPSEnableTexture = NULL; |
63 | + hPSEnableFog = NULL; | |
64 | + hPSFogColor = NULL; | |
65 | + hPSFogStart = NULL; | |
66 | + hPSFogEnd = NULL; | |
67 | + hPSEnable2DRender = NULL; | |
62 | 68 | #endif |
63 | 69 | |
64 | 70 | BlockDataIF = NULL; |
@@ -237,8 +243,20 @@ | ||
237 | 243 | if( FAILED(hr) ){ return 1; } |
238 | 244 | |
239 | 245 | //ピクセルシェーダーの関連変数 |
246 | + hPSViewPos = pPSConstantTable->GetConstantByName(NULL, "ViewPos"); | |
247 | + //if( hPSViewPos == NULL ){ return 1; } | |
240 | 248 | hPSEnableTexture = pPSConstantTable->GetConstantByName(NULL, "EnableTexture"); |
241 | 249 | 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; } | |
242 | 260 | |
243 | 261 | D3DXMatrixIdentity(&VSWorldPosMatrix); |
244 | 262 | D3DXMatrixIdentity(&VSViewPosMatrix); |
@@ -1230,6 +1248,7 @@ | ||
1230 | 1248 | //フォグ |
1231 | 1249 | float fog_st = 100; |
1232 | 1250 | float fog_end = 800; |
1251 | +#if GRAPHIC_ENGINE == 0 | |
1233 | 1252 | pd3dDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); |
1234 | 1253 | pd3dDevice->SetRenderState(D3DRS_FOGCOLOR, D3DCOLOR_RGBA(0, 0, 0, 0)); |
1235 | 1254 | pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR); |
@@ -1236,6 +1255,13 @@ | ||
1236 | 1255 | pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE); |
1237 | 1256 | pd3dDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD*)(&fog_st)); |
1238 | 1257 | 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 | |
1239 | 1265 | } |
1240 | 1266 | |
1241 | 1267 | D3DCOLOR skycolor; |
@@ -1251,12 +1277,21 @@ | ||
1251 | 1277 | } |
1252 | 1278 | |
1253 | 1279 | //フォグを設定 |
1280 | +#if GRAPHIC_ENGINE == 0 | |
1254 | 1281 | 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 | |
1255 | 1286 | |
1256 | 1287 | EnableFogFlag = true; |
1257 | 1288 | } |
1258 | 1289 | else{ |
1290 | +#if GRAPHIC_ENGINE == 0 | |
1259 | 1291 | pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); |
1292 | +#else | |
1293 | + pPSConstantTable->SetBool(pd3dDevice, hPSEnableFog, false); | |
1294 | +#endif | |
1260 | 1295 | EnableFogFlag = false; |
1261 | 1296 | } |
1262 | 1297 | } |
@@ -1310,6 +1345,11 @@ | ||
1310 | 1345 | #else |
1311 | 1346 | hVSConstantTable->SetMatrix(pd3dDevice, hVSWorldViewPos, &matView); |
1312 | 1347 | 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 | + } | |
1313 | 1353 | #endif |
1314 | 1354 | |
1315 | 1355 | //カメラ設定(射影変換行列)viewangle |
@@ -1974,6 +2014,19 @@ | ||
1974 | 2014 | |
1975 | 2015 | //深度バッファ比較関数を設定 |
1976 | 2016 | 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 | |
1977 | 2030 | } |
1978 | 2031 | |
1979 | 2032 | //! @brief テクスチャフォントサイズ計算 |
@@ -2441,6 +2494,21 @@ | ||
2441 | 2494 | |
2442 | 2495 | //深度バッファ比較関数を元に戻す |
2443 | 2496 | 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 | |
2444 | 2512 | } |
2445 | 2513 | |
2446 | 2514 | //! @brief 画面のスクリーンショットを保存 |
@@ -196,7 +196,13 @@ | ||
196 | 196 | D3DXHANDLE hVSDiffuse; //!< 頂点シェーダーのディフューズ色 |
197 | 197 | LPDIRECT3DPIXELSHADER9 pPixelShader; //!< ピクセルシェーダー |
198 | 198 | LPD3DXCONSTANTTABLE pPSConstantTable; //!< ピクセルシェーダーの定数テーブル |
199 | + D3DXHANDLE hPSViewPos; //!< ピクセルシェーダーのカメラ座標 | |
199 | 200 | D3DXHANDLE hPSEnableTexture; //!< ピクセルシェーダーのテクスチャフラグ |
201 | + D3DXHANDLE hPSEnableFog; //!< ピクセルシェーダーのフォグ有効フラグ | |
202 | + D3DXHANDLE hPSFogColor; //!< ピクセルシェーダーのフォグ色 | |
203 | + D3DXHANDLE hPSFogStart; //!< ピクセルシェーダーのフォグの開始深度 | |
204 | + D3DXHANDLE hPSFogEnd; //!< ピクセルシェーダーのフォグの終了深度 | |
205 | + D3DXHANDLE hPSEnable2DRender; //!< ピクセルシェーダーの2D描画フラグ | |
200 | 206 | D3DXMATRIX VSWorldPosMatrix; //!< 頂点シェーダーに与えた変換行列 |
201 | 207 | D3DXMATRIX VSViewPosMatrix; //!< 頂点シェーダーに与えた変換行列 |
202 | 208 | D3DXMATRIX VSViewProjMatrix; //!< 頂点シェーダーに与えた変換行列 |