Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Init() Π²Π΅ΡΠ½ΡΠ»Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π³ΡΠ°ΡΠΈΠΊΡ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ DirectX. ΠΠ± ΡΡΠΎΠΌ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΠΎΠΊΠ°. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΠΎΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊ Π²ΡΡΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ, ΡΠ°Π· ΡΠΆ ΠΌΡ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½ΡΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±ΡΠ²Π°ΡΡ ΠΈΡ ΡΠ΄Π°Π»ΡΡΡ. ΠΠ±ΡΠ΅ΠΊΡΡ DirectX ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ COM ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Release(), Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²:
// ΡΡΠ½ΠΊΡΠΈΡ ReleaseAll ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ d3d device ΠΈ d3d
void ReleaseAll() {
// ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
if (pDevice) pDevice->Release();
if (pD3d) pD3d->Release();
}
ΠΠΎΠ²Π΅Π΄Π°Π»: ΠΠ°ΡΠΊΠΈΠ½.
ΠΠ΅ΡΠ²ΡΠ΅ ΡΠ°Π³ΠΈ ΠΏΠΎΠ΄ DirectX 8. (Π§Π°ΡΡΡ 2)
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π²ΡΠ²Π΅ΡΡΠΈ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠ±ΠΎΠΉ ΡΡΠ΅Ρ ΠΌΠ΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ²Π΅ΡΡΠΈ DirectX, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΡΡ. Π’ΠΎ Π΅ΡΡΡ Π»ΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ². Π’ΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ Π·Π°Π΄Π°ΡΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ Π²Π΅ΡΡΠΈΠ½Π°ΠΌΠΈ. ΠΠ΅ΡΡΠΈΠ½Ρ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ, ΡΠ²Π΅Ρ, ΡΠ΅ΠΊΡΡΡΡΠ½ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΈ Ρ.Π΄. ΠΠ΅ΡΡΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ Π½Π°ΠΌ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ΅ΠΊΡΡΡΡΠ½ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ. ΠΠ°Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½Ρ. Π£ Π²Π΅ΡΡΠΈΠ½Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° Π±ΡΠ΄ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΡΡΡ ΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈ ΡΠ²Π΅Ρ:
#define D3DFVF_MYVERT (D3DFVF_XYZ | D3DFVF_DIFFUSE)
Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
struct MyVert{
float x, y, z; // ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ
DWORD Color; // Π΄ΠΈΡΡΡΠ·Π½ΡΠΉ ΡΠ²Π΅Ρ
};
Π¦Π²Π΅Ρ Π²Π΅ΡΡΠΈΠ½Ρ Π·Π°Π΄Π°ΡΡΡΡ 32-Ρ Π±ΠΈΡΠΎΠ²ΡΠΌ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ. ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΡ D3DCOLOR_XRGB(r,g,b), Π³Π΄Π΅ r,g ΠΈ b β ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠ²Π΅ΡΠ°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΊΡΠ°ΡΠ½Π°Ρ, Π·Π΅Π»ΡΠ½Π°Ρ ΠΈ ΡΠΈΠ½ΡΡ, ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠ΅Π»ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ 0 Π΄ΠΎ 255-ΡΠΈ.
ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ device Π²Ρ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΡΡΠΎΠΌ, ΡΠΎ Π΅ΡΡΡ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ Π³ΡΠ°ΡΠΈΠΊΠΈ. Π§ΡΠΎΠ±Ρ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΡΠ²Π΅ΡΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΠ½ΠΈΠΌ, Π²ΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΡΠΎΡΡΡΡΠ°, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Clear():
DWORD dwBlue = D3DCOLOR_XRGB(0, 0, 128);
pDevice->Clear(0, NULL, D3DCLEAR_TARGET, dwBlue, 1.0f, 0);
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²ΡΠ²Π΅ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΡΡ DirectX ΠΎΠ± ΡΡΠΎΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ:
pDevice->BeginScene();
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ»Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π° ΠΏΡΠΎΡΡΠ΅Ρ, Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄:
pDevice->EndScene();
Π’ΠΎ Π΅ΡΡΡ ΠΏΡΠΎΡΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΠ± ΡΡΠΎΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ Π²ΡΠ²Π΅ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π²Π½Π΅ ΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, ΡΠΎ DirectX ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ Π²Π°Ρ.
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ. Π‘Π½Π°ΡΠ°Π»Π° ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΡΠΈΠΏΠΎΠΌ Π²Π΅ΡΡΠΈΠ½ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ.
pDevice->SetVertexShader(D3DFVF_MYVERT);
ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ DirectX Π·Π½Π°Π», ΠΊΠ°ΠΊ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²Π΅ΡΡΠΈΠ½Π΅ Π² ΡΡΡΡΠΊΡΡΡΠ΅ MyVert ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ.
Π’ΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π·Π°Π΄Π°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ Π²Π΅ΡΡΠΈΠ½, ΠΊΠ°ΠΊ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ (ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΡΠΉ) ΠΌΠ°ΡΡΠΈΠ². ΠΠ»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ° Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΡΠΈ Π²Π΅ΡΡΠΈΠ½Ρ:
MyVert v[3];
//ΠΠ°Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²Π΅ΡΡΠΈΠ½:
v[0].x =-0.5f; v[0].y =-0.5f; v[0].z = 0.5f;
v[1].x =-0.5f; v[1].y = 0.5f; v[1].z = 0.5f;
v[2].x = 0.5f; v[2].y = 0.5f; v[2].z = 0.5f;
//ΠΈ ΡΠ²Π΅Ρ:
v[0].Color = D3DCOLOR_XRGB(255,0,0); // ΠΊΡΠ°ΡΠ½ΡΠΉ
v[1].Color = D3DCOLOR_XRGB(0,255,0); // Π·Π΅Π»Π΅Π½ΡΠΉ
v[2].Color = D3DCOLOR_XRGB(0,0,255); // ΡΠΈΠ½ΠΈΠΉ
ΠΡΠ²ΠΎΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² DrawPrimitive ΠΈΠ½ΡΡΠ΅ΡΠ΅ΠΉΡΠ° IDirect3DDevice8. ΠΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠΌ Π·Π΄Π΅ΡΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½ ΡΠ°ΠΊΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π·Π΄Π΅ΡΡ ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠΌ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ DrawPrimitiveUP():
pDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 1, v, sizeof(MyVert));
ΠΠ΅ΡΠ²ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ Π·Π°Π΄Π°ΡΡΡΡ ΡΠΈΠΏ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ², Π²ΡΠΎΡΠΎΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ², ΡΡΠ΅ΡΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Π½Π° ΠΎΠ±Π»Π°ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π³Π΄Π΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²Π΅ΡΡΠΈΠ½Π°Ρ , Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½Π°Ρ ΠΌΠ°ΡΡΠΈΠ², ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π³Π° Π² Π±Π°ΠΉΡΠ°Ρ , Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠ΄ΡΡ Π²Π΅ΡΡΠΈΠ½Ρ ΠΎΠ΄Π½Π° Π·Π° Π΄ΡΡΠ³ΠΎΠΉ, Ρ Π½Π°Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° Π»Π΅ΠΆΠ°Ρ "ΠΏΠ»ΠΎΡΠ½ΠΎ", ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°Π³ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅Ρ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΠΉ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ, ΡΠΎ Π΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ MyVert.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅Π΄Π΅ΡΡΡ Π² Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡΡ ΡΠ°ΡΡΡ ΡΠΊΡΠ°Π½Π°, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ ΡΡΠΎ Π½Π° ΡΠΊΡΠ°Π½Π΅. ΠΡΠΈΠΌ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Present(). ΠΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°Ρ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡ, Π²ΡΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΈΡ Π² 0:
pDevice->Present(0, 0, 0, 0);
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΈ Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΡΠ°ΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°Π΄ΡΠ΅, Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ΅Π½Π΅, ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° EndScene().
Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΠΏΠΎΡΡΡΠΎΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Render(), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π½Π°Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π½Π° ΡΠΊΡΠ°Π½:
void Render() {
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° v ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ½Π΅ΡΡΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ
// ΡΡΠ½ΠΊΡΠΈΠΈ Render()
MyVert v[3];
v[0].x =-0.5f; v[0].y =-0.5f; v[0].z = 0.5f;
v[1].x =-0.5f; v[1].y = 0.5f; v[1].z = 0.5f;
v[2].x = 0.5f; v[2].y = 0.5f; v[2].z = 0.5f;
v[0].Color = D3DCOLOR_XRGB(255,0,0); // ΠΊΡΠ°ΡΠ½ΡΠΉ
v[1].Color = D3DCOLOR_XRGB(0,255,0); // Π·Π΅Π»Π΅Π½ΡΠΉ
v[2].Color = D3DCOLOR_XRGB(0,0,255); // ΡΠΈΠ½ΠΈΠΉ
// ΠΠ°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΡΠΊΡΠ°Π½ ΡΠΈΠ½ΠΈΠΌ ΡΠ²Π΅ΡΠΎΠΌ
DWORD dwBlue = D3DCOLOR_XRGB(0,0,128);
pDevice->Clear(0, NULL, D3DCLEAR_TARGET, dwBlue, 1.0f, 0);
pDevice->BeginScene();
// ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°,
// ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π΅Π³ΠΎ
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
// ΠΡΠΎΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π²ΡΠ΅Π³Π΄Π° ΠΌΠ΅ΠΆΠ΄Ρ BeginScene ΠΈ EndScene
pDevice->SetVertexShader(D3DFVF_MYVERT);
pDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, v, sizeof(MyVert));
pDevice->EndScene();
pDevice->Present(0, 0, 0, 0);
}
ΠΡΠ»ΠΈ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π½Π° ΡΠΊΡΠ°Π½, ΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ Render() ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ½Π΅ΡΡΠΈ Π·Π° Π΅Ρ ΠΏΡΠ΅Π΄Π΅Π»Ρ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° v, Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΡΠΈΠΏΠ° ΠΏΡΠΎΡΡΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π²Π΅ΡΡΠΈΠ½.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ windows-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π²Π΅Π΄ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ:
// ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) {
WNDCLASSEX wc = {
sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(0), 0, 0, 0, 0, "FirstDX_cl", 0
};
RegisterClassEx(&wc);
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
HWND hWnd = CreateWindow("FirstDX_cl", "FirstDX",
WS_OVERLAPPEDWINDOW, 100, 100, 160, 160,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
if (Init(hWnd)) {
ShowWindow (hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} else Render();
}
}
ReleaseAll();
UnregisterClass("FirstDX_cl", wc.hInstance);
return 0;
}
Π€ΡΠ½ΠΊΡΠΈΡ Render() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΠΎ Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠ° ΠΊΠ°Π΄ΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ. Π€ΡΠ½ΠΊΡΠΈΠΈ Init() ΠΈ ReleaseAll() ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΡΡΠΎΠΊΠ°.
Π’Π΅ΠΏΠ΅ΡΡ Π΅ΡΡΡ Π²ΡΡ, ΡΡΠΎΠ±Ρ Π²Ρ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ d3d8.lib Π² Π²Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠΎΠ±Ρ Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Direct3D.
ΠΠΎΠ²Π΅Π΄Π°Π»: ΠΠ°ΡΠΊΠΈΠ½.
GameDev.net
2D Rendering in DirectX 8
I have been reading alot of questions lately related to DirectX 8 and the exclusion of DirectDraw from the new API. Many people have fallen back to DX7. I can understand people using DX7 if they have alot of experience with that API, but many of the questions seem to be coming from people who are just learning DX, and they are stuck learning an old API. People have argued that many people don't have 3D hardware, and therefore D3D would be a bad alternative for DirectDraw. I don't believe this is true - 2D rendering in D3D requires very little vertex manipulation, and everything else boils down to fillrate. In short, 2D rendering in D3D on 2D hardware should have pretty much the same performance as DirectDraw, assuming decent fillrate. The advantage is that the programmer can learn the newest API, and performance on newer hardware should be very good. This article will present a framework for 2D rendering in DX8 to ease the transition from DirectDraw to Direct3D. In each section, you may see things that you don't like ("I'm a 2D programmer, I don't care about vertices!"). Rest assured, if you implement this simple framework once, you'll never think about these things again.
Getting StartedAssuming you have the DX8 SDK, there are a couple tutorials that present how to create a D3D device and set up a render loop, so I don't want to spend alot of time on that. For the purposes of this article, I'll talk about the tutorial found in [DX8SDK]\samples\Multimedia\Direct3D\Tutorials\Tut01_CreateDevice, although you can add it to anything. To that sample, I'll add the following functions:
void PostInitialize(float WindowWidth, float WindowHeight) β this function is called by the app after everything else is set up. You've created your device and initialized everything. If you're following along with the Tutorial code, WinMain looks like this:
β¦
if (SUCCEEDED(InitD3D(hWnd))) {