/
Sys_Shader.cpp
177 lines (160 loc) · 5.49 KB
/
Sys_Shader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
//=======================================================================================
//
// シェーダ処理
//
//=======================================================================================
//-------- ヘッダ
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NON_CONFORMING_SWPRINTFS
#include "Sys_Shader.h"
//-------- 定数
#define PATH_FXTEST _T("data/Sys_File/Lighting.fx")
#define MAX_TECHNIQUE 4
//-------- グローバル変数
LPD3DXEFFECT g_pFX; // エフェクト オブジェクト
D3DXHANDLE g_hMatWVP; // ワールド×ビュー×射影
D3DXHANDLE g_hMatW; // ワールド マトリックス
D3DXHANDLE g_hCamera; // 視点座標
D3DXHANDLE g_hLight; // 光源ベクトル
D3DXHANDLE g_hDiffuse; // (マテリアル)拡散色
D3DXHANDLE g_hSpecular;// (マテリアル)鏡面反射色
D3DXHANDLE g_hPower; // (マテリアル)鏡面反射指数
D3DXHANDLE g_hAmbient; // (マテリアル)環境色
D3DXHANDLE g_hTexture; // テクスチャ
D3DXHANDLE g_hTexEnable;// テクスチャ有無
D3DXHANDLE g_hTech[MAX_TECHNIQUE]; // テクニック
static D3DXVECTOR3 g_vLight;
static D3DXVECTOR3 g_vCamera;
static D3DXMATRIX g_mView;
static D3DXMATRIX g_mProj;
//---------------------------------------------------------------------------------------
// シェーダ初期化
//---------------------------------------------------------------------------------------
HRESULT InitShader()
{
// シェーダ読み込み
HRESULT hr = D3DXCreateEffectFromFile(g_pD3DDevice,
PATH_FXTEST, NULL, NULL, 0, NULL, &g_pFX, NULL);
if (FAILED(hr)) {
TCHAR szMsg[1024];
_stprintf(szMsg, _T("シェーダ(%s)読み込みエラー"),
PATH_FXTEST);
MessageBox(g_hWnd, szMsg, _T("error"), MB_OK);
return hr;
}
// ハンドル取得
struct _param {
LPCSTR pszName;
D3DXHANDLE* pHandle;
} param[] = {
{"WORLDVIEWPROJECTION", &g_hMatWVP},
{"WORLD", &g_hMatW},
{"CAMERAPOSITION", &g_hCamera},
{"MATERIALDIFFUSE", &g_hDiffuse},
{"MATERIALSPECULAR", &g_hSpecular},
{"MATERIALPOWER", &g_hPower},
{"MATERIALAMBIENT", &g_hAmbient},
{"MATERIALTEXTURE", &g_hTexture},
{"MATERIALTEXTUREVALID", &g_hTexEnable},
};
for (int i = 0; i < _countof(param); i++) {
*param[i].pHandle =
g_pFX->GetParameterBySemantic(NULL,
param[i].pszName);
}
g_hLight = g_pFX->GetParameterByName(NULL, "light");
for (int i = 0; i < MAX_TECHNIQUE; ++i) {
g_hTech[i] = g_pFX->GetTechnique(i);
}
return hr;
}
//---------------------------------------------------------------------------------------
// カメラ情報設定
//---------------------------------------------------------------------------------------
void SetCameraShader(LPD3DXVECTOR3 pCamera,
LPD3DXMATRIX pView, LPD3DXMATRIX pProj)
{
g_vCamera = *pCamera;
g_mView = *pView;
g_mProj = *pProj;
}
//---------------------------------------------------------------------------------------
// 光源ベクトル設定
//---------------------------------------------------------------------------------------
void SetLightShader(LPD3DXVECTOR3 pLight)
{
g_vLight = *pLight;
}
//---------------------------------------------------------------------------------------
// シェーダ開始
//---------------------------------------------------------------------------------------
void BeginShader(int nTechnique)
{
if (nTechnique < 0 || nTechnique >= MAX_TECHNIQUE) {
nTechnique = 0;
}
// テクニック設定
g_pFX->SetTechnique(g_hTech[nTechnique]);
g_pFX->Begin(NULL, 0);
// パス開始
g_pFX->BeginPass(0);
}
//---------------------------------------------------------------------------------------
// ワールド変換行列設定(&シェーダへ設定)
//---------------------------------------------------------------------------------------
void SetWorldMatrixShader(LPD3DXMATRIX pWorld)
{
g_pFX->SetMatrix(g_hMatWVP,
&(*pWorld * g_mView * g_mProj));
g_pFX->SetMatrix(g_hMatW, pWorld);
g_pFX->SetFloatArray(g_hLight, &g_vLight.x, 4);
g_pFX->SetFloatArray(g_hCamera, &g_vCamera.x, 3);
}
//---------------------------------------------------------------------------------------
// マテリアル設定(&コミット)
//---------------------------------------------------------------------------------------
void SetMaterialShader(D3DMATERIAL9* pMaterial,
LPDIRECT3DTEXTURE9 pTexture)
{
if (pMaterial) {
g_pFX->SetVector(g_hDiffuse,
(LPD3DXVECTOR4)&pMaterial->Diffuse);
g_pFX->SetVector(g_hSpecular,
(LPD3DXVECTOR4)&pMaterial->Specular);
g_pFX->SetFloat(g_hPower, pMaterial->Power);
g_pFX->SetVector(g_hAmbient,
(LPD3DXVECTOR4)&pMaterial->Ambient);
}
if (pTexture) {
g_pFX->SetTexture(g_hTexture, pTexture);
g_pFX->SetBool(g_hTexEnable, TRUE);
} else {
g_pFX->SetBool(g_hTexEnable, FALSE);
}
g_pFX->CommitChanges();
}
//---------------------------------------------------------------------------------------
// シェーダ終了
//---------------------------------------------------------------------------------------
void EndShader()
{
// パス終了
g_pFX->EndPass();
// テクニック終了
g_pFX->End();
}
//---------------------------------------------------------------------------------------
// シェーダ解放
//---------------------------------------------------------------------------------------
void FinShader()
{
SAFE_RELEASE(g_pFX);
}
// テクスチャ設定
void SetTexture(D3DXHANDLE hTexture, LPDIRECT3DTEXTURE9 pTexture)
{
g_pFX->SetTexture(hTexture, pTexture);
}
//=======================================================================================
// End of File
//=======================================================================================