PDA

Pogledaj cijelu verziju : Kreiranje 3D Engine-a



cerberi
22-08-2007, 14:32
Zašto ne? Vidim ovdje na forumu ima ljudi sa C++ znanjem i znanjem čak i o enginima. Mislio sam..., zašto ne? Da, znam to nije lagano, nije nabrzinu, znaaam sve to.

Mislio sam 3D engine sa Directx9 u C++.

Krenut ćemo od osnova-kreiranje,registriranje windowa(prozora), inicijaliziranje D3D-a, te rendanje npr. za početak trokuta. Sve to bi trebalo biti nekako lijepo i pomno isplanirano i poslagano po headerima... Ja ću početi....

Ja radim u VisualStudiu.NET 2003

cerberi
22-08-2007, 14:47
Ovako, evo početka, optimizirajte ako znate pa pošaljite optimiziranu verziju koda.

U CROAT Engine.h -> jel dobro ime, ha?možda


#include <d3d9.h>
#pragma warning( disable : 4996 ) // disable deprecated warning
#include <strsafe.h>
#pragma warning( default : 4996 )

#include "CROAT VertexBuffer.h"

#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

int SCREEN_WIDTH = 300;
int SCREEN_HEIGHT = 300;

void Render();
void Cleanup();
void Draw_Triangle();

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold Vertices

//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}

// Device state would normally be set here

return S_OK;
}
HRESULT InitVB()
{
// Initialize three Vertices for rendering a triangle
CUSTOMVERTEX Vertices[]S=
{
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};

// Create the vertex buffer. Here we are allocating enough memory
// (from the default pool) to hold all our 3 custom Vertices. We also
// specify the FVF, so the vertex buffer knows what data it contains.
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
{
return E_FAIL;
}

// Now we fill the vertex buffer. To do this, we need to Lock() the VB to
// gain access to the Vertices. This mechanism is required becuase vertex
// buffers may be in device memory.
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(Vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, Vertices, sizeof(Vertices) );
g_pVB->Unlock();

return S_OK;
}
//-----------------------------------------------------------------------------
//
// Draw_Triangle()
//
//-----------------------------------------------------------------------------
void Draw_Triangle()
{
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
void Render()
{
// Clear the backbuffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
Draw_Triangle();

// End the scene
g_pd3dDevice->EndScene();
}

// Present the backbuffer contents to the display
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
void Cleanup()
{
if( g_pVB != NULL )
g_pVB->Release();

if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();

if( g_pD3D != NULL)
g_pD3D->Release();
}

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}

return DefWindowProc( hWnd, msg, wParam, lParam );
}

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"CROAT Engine", NULL };
RegisterClassEx( &wc );

// Create the application's window
HWND hWnd = CreateWindow( "CROAT Engine", "CROAT Engine",
WS_OVERLAPPEDWINDOW, 100, 100,
SCREEN_WIDTH,
SCREEN_HEIGHT,
NULL, NULL, wc.hInstance, NULL );

if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Create the vertex buffer
if( SUCCEEDED( InitVB() ) )
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );

// Enter the message loop
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(); // RENDERING

if(KEY_DOWN(VK_ESCAPE))
PostMessage(hWnd, WM_QUIT, 0, 0);
}
}

}
UnregisterClass( "CROAT Engine", wc.hInstance );
return 0;
}


zatim u CROAT VertexBuffer.h


struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag
DWORD color; // from the D3DFVF_DIFFUSE flag
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)



te, u Starter.cpp koji ne radi ništa nit ičem služi


#include "CROAT Engine.h"

void main()
{

return;
}

AJMO LJUDI UKLJUČITE SE !!!!!!!!

RayDX
22-08-2007, 14:50
Ja radim na svom top secret engineu koji će sjediti na DX9 APIju, ne dam ništa... Škrt sam :rotfl: :)

cerberi
22-08-2007, 15:07
svaka čast. jel može kakav demo tog tvog enginea, da vidimo što je sposoban, ak nije baš tolika tajna da će postati revolucija 3d grafike.

ej rekao si da radiš na nekim projektima na modeliranju i animaciji, pa me zanima jel su to projekti vezani uz taj engine???znatiželja me ubija

Ripaz
22-08-2007, 15:12
Dobra ideja ali ne vjerujem da će uspjeti.
Jedino ako ne skupiš ekipu u RL ali da ti netko sa foruma pomaže. Jedino ako su dovoljno uporni a tih malo ima.

cerberi
22-08-2007, 15:19
ma ne vjerujem ni ja da će napraviti bogzna što?al se može napraviti,... nešto. ako sam sa opnegl-om za ni tjedan dana slijedeći tutoriajale uspio napraviti šetnju kroz quake mapu sa dinamičnim sjenama, bumpnappingom, efektima itd. može se i iz ovoga nešto izvući. nego si ti među onim što su voljni pomoći ili ne

Ripaz
22-08-2007, 15:53
nego si ti među onim što su voljni pomoći ili ne

Ne hvala. Još se mučim kako napraviti mini kalkulator u C++-u.

SkunK
22-08-2007, 17:42
Ripaz ako ti treba pomoc oko tog kalkulatora, ja sam ih napravio par pa ako zelis javi se na PM pa cu ti poslat sourc code.

RayDX
22-08-2007, 18:44
ma ne vjerujem ni ja da će napraviti bogzna što?al se može napraviti,... nešto. ako sam sa opnegl-om za ni tjedan dana slijedeći tutoriajale uspio napraviti šetnju kroz quake mapu sa dinamičnim sjenama, bumpnappingom, efektima itd. može se i iz ovoga nešto izvući. nego si ti među onim što su voljni pomoći ili ne

Heheh, ma već ima jedan screen tamo u galeriji ali nije crysis :D, daleko :)
a engine je one-man army job... Jer jedino tako nešto kvalitetno možeš napraviti...

[_[_[Sk8man]_]_]
22-08-2007, 19:56
Najbolje ti je da za to kontaktiras Bureka.Oni ima puno iskustva sa enginima.
Ja ti bas ne mogu pomoc jer tek ucim C++ tako da...

Burek_fr0m_SPACE
23-08-2007, 09:47
Burek u ovome ne učestvuje iz više razloga, od onih očiglednih, do onih manje očiglednih. Za početak, moram vam navesti očigledne nedostatke koje primjećujem ovdje... Oslanjate se na tutoriale, a po njima se ne može napraviti engine. Ako želite imati neki svoj engine, onda morate u potpunosti razumjeti stvari koje se tu događaju, tj. najmanje bar biti u stanju da sami uradite bez dokumentacije sve ono što piše u tutorialima iz kojih crpite informacije. Ti tutoriali su zavaravajući - npr. nije teško upaliti bump-mapping na jednoj rotirajućoj kocki, ali da bi imali dobru implementaciju bump-mappinga u igri/engineu, trebaće vam mnogo više znanja i iskustva od onoga što ćete steći u tutorialima. Drugi, i možda i najveći nedostatak - nemate nikakav plan. I to će vas pokopati, pogotovo s obzirom na to da bi na tome trebalo raditi više ljudi. Dakle, jednostavno se mora znati šta i kako treba biti u engineu i ko šta radi.

Ok, pošto sam možda sad zvučao okrutno, probaću reći i par pozitivnih stvari, te dati konstruktivan prijedlog. Jako dobra stvar je što se trudite naučiti, i svaka vam čast na tome. Biće teško, ali ne gubite nadu, jer ćete kasnije uvidjeti da vam je svaka sekunda provedena mučeći se - dragocjeno iskustvo. A sada i konstruktivan prijedlog - napravite space-shooter. Dakle, vozite se nekim spaceshipom i napucavate se sa ostalim spaceshipovima u okolini. Zašto? Zato što je relativno jednostavno za izvesti - nekog levela ni nema, dovoljan je jedan skybox, eventualno pokoja planeta, asteroid ili nešto; spaceshipovi mogu biti neanimirani modeli; upravljanje i kretanje je jedostavno (taman uvježbate malo koordinatni sistem); dovoljan je najrudimentarniji collision; osvjetljenje krajnje jednostavno (samo od najbliže zvijezde, i eventualno od eksplozija), itd. Dakle, s grafičke strane vam treba skybox, učitavanje i iscrtavanje modela, nešto malo osvjetljenja, te pokoji efekat eksplozije. Mislim da bi takvo nešto bilo ponajbolje za početnike, jer zalijetanje s tutoriala na FPS engine sa fancy dinamičkim osvjetljenjem i parallax mapama će završiti gadno. Prvo probajte napraviti nešto poput onoga što sam ovdje opisao i završitiSto, ispolirati, i najvažnije - shvatiti, pa tek onda krenuti na nešto složenije. Toliko od mene, happy coding.

cerberi
23-08-2007, 10:19
Osjećam se staro(neka me nitko ne oslovljava sa vi). Hvala na informacijama, bacit ću se onda na neki space sim, a ionako nisam planirao radit fps, bilo bi prejeb..., a izgubio bih i sve do zadnjeg živca. Nego ja kužim dosta tih stvari, kako i šta rade. Problem je kao što i možeš vidjeti u gornjem kodu da nema nekakvog designa sve je porazbacano, nema reda.

Pa jel zna tko nekakav dx9 tutorial osim onih na MSDN-u???

RayDX
23-08-2007, 22:33
Burek u ovome ne učestvuje iz više razloga, od onih očiglednih, do onih manje očiglednih. Za početak, moram vam navesti očigledne nedostatke koje primjećujem ovdje... Oslanjate se na tutoriale, a po njima se ne može napraviti engine. Ako želite imati neki svoj engine, onda morate u potpunosti razumjeti stvari koje se tu događaju, tj. najmanje bar biti u stanju da sami uradite bez dokumentacije sve ono što piše u tutorialima iz kojih crpite informacije. Ti tutoriali su zavaravajući - npr. nije teško upaliti bump-mapping na jednoj rotirajućoj kocki, ali da bi imali dobru implementaciju bump-mappinga u igri/engineu, trebaće vam mnogo više znanja i iskustva od onoga što ćete steći u tutorialima. Drugi, i možda i najveći nedostatak - nemate nikakav plan. I to će vas pokopati, pogotovo s obzirom na to da bi na tome trebalo raditi više ljudi. Dakle, jednostavno se mora znati šta i kako treba biti u engineu i ko šta radi.

Ok, pošto sam možda sad zvučao okrutno, probaću reći i par pozitivnih stvari, te dati konstruktivan prijedlog. Jako dobra stvar je što se trudite naučiti, i svaka vam čast na tome. Biće teško, ali ne gubite nadu, jer ćete kasnije uvidjeti da vam je svaka sekunda provedena mučeći se - dragocjeno iskustvo. A sada i konstruktivan prijedlog - napravite space-shooter. Dakle, vozite se nekim spaceshipom i napucavate se sa ostalim spaceshipovima u okolini. Zašto? Zato što je relativno jednostavno za izvesti - nekog levela ni nema, dovoljan je jedan skybox, eventualno pokoja planeta, asteroid ili nešto; spaceshipovi mogu biti neanimirani modeli; upravljanje i kretanje je jedostavno (taman uvježbate malo koordinatni sistem); dovoljan je najrudimentarniji collision; osvjetljenje krajnje jednostavno (samo od najbliže zvijezde, i eventualno od eksplozija), itd. Dakle, s grafičke strane vam treba skybox, učitavanje i iscrtavanje modela, nešto malo osvjetljenja, te pokoji efekat eksplozije. Mislim da bi takvo nešto bilo ponajbolje za početnike, jer zalijetanje s tutoriala na FPS engine sa fancy dinamičkim osvjetljenjem i parallax mapama će završiti gadno. Prvo probajte napraviti nešto poput onoga što sam ovdje opisao i završitiSto, ispolirati, i najvažnije - shvatiti, pa tek onda krenuti na nešto složenije. Toliko od mene, happy coding.

As always, words of wisdom... Ja nastojim napraviti engine koji ima sve tri osi za početak :) Pa ću neku racing igru brzu na njemu sagraditi