Prikazujem rezultate 1 do 13 od 13

Tema: Kreiranje 3D Engine-a

  1. #1
    Senior Member Lord of The Fleas
    Datum registracije
    Aug 2007
    Postova
    494

    Kreiranje 3D Engine-a

    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

  2. #2
    Senior Member Lord of The Fleas
    Datum registracije
    Aug 2007
    Postova
    494

    Početak

    Ovako, evo početka, optimizirajte ako znate pa pošaljite optimiziranu verziju koda.

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

    Code:
    #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

    Code:
    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

    Code:
    #include "CROAT Engine.h"
    
    void main()
    {
    	
    	return;
    }
    AJMO LJUDI UKLJUČITE SE !!!!!!!!

  3. #3
    Senior Member Small step for mankind
    Datum registracije
    Aug 2007
    Lokacija
    Latitude:45.286° Longitude:18.688°
    Postova
    2.150
    Ja radim na svom top secret engineu koji će sjediti na DX9 APIju, ne dam ništa... Škrt sam
    Gdje je nestao mozak
    gdje se skriva on
    iz vagona pameti
    na tračnice ispao...

  4. #4
    Senior Member Lord of The Fleas
    Datum registracije
    Aug 2007
    Postova
    494

    škrti čovječe

    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

  5. #5
    Senior Member It lives by night
    Datum registracije
    Aug 2007
    Lokacija
    Prokleta LHC crna rupa me progutala. Di je sada onaj znak "Exit"
    Postova
    574
    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.

  6. #6
    Senior Member Lord of The Fleas
    Datum registracije
    Aug 2007
    Postova
    494
    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

  7. #7
    Senior Member It lives by night
    Datum registracije
    Aug 2007
    Lokacija
    Prokleta LHC crna rupa me progutala. Di je sada onaj znak "Exit"
    Postova
    574
    = Citat = Izvorno postao cerberi
    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.

  8. #8
    Senior Member My way or the highway
    Datum registracije
    Dec 2006
    Lokacija
    Behind the blue eyes
    Postova
    7.757
    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.

  9. #9
    Senior Member Small step for mankind
    Datum registracije
    Aug 2007
    Lokacija
    Latitude:45.286° Longitude:18.688°
    Postova
    2.150
    = Citat = Izvorno postao cerberi
    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 , daleko
    a engine je one-man army job... Jer jedino tako nešto kvalitetno možeš napraviti...
    Gdje je nestao mozak
    gdje se skriva on
    iz vagona pameti
    na tračnice ispao...

  10. #10
    Senior Member Lord of The Fleas [_[_[Sk8man]_]_]'s Avatar
    Datum registracije
    Jun 2006
    Lokacija
    pred komfjutorom
    Postova
    444
    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...
    God, you can suck my coc.

  11. #11
    Senior Member Giant leap for forum
    Datum registracije
    Oct 2006
    Lokacija
    Hostile universe
    Postova
    3.468
    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.

  12. #12
    Senior Member Lord of The Fleas
    Datum registracije
    Aug 2007
    Postova
    494
    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???

  13. #13
    Senior Member Small step for mankind
    Datum registracije
    Aug 2007
    Lokacija
    Latitude:45.286° Longitude:18.688°
    Postova
    2.150
    = Citat = Izvorno postao Burek_fr0m_SPACE
    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
    Gdje je nestao mozak
    gdje se skriva on
    iz vagona pameti
    na tračnice ispao...

Slične teme

  1. Kreiranje vlastite mape i servera + pitanja
    By Stranger in forum Wolfenstein
    Odgovora: 6
    Posljednji post: 20-01-2009, 16:47
  2. XNA Rpg Engine
    By in forum Programiranje i izrada igara
    Odgovora: 4
    Posljednji post: 07-01-2009, 15:30
  3. Kreiranje patricija na Win XP
    By Ripaz in forum Pomagaj brate!
    Odgovora: 4
    Posljednji post: 12-04-2008, 18:46
  4. Kreiranje foruma?
    By GODSKILLER in forum Software
    Odgovora: 12
    Posljednji post: 28-03-2008, 13:51

Pravila postanja

  • Ne možeš stvarati nove teme
  • Ne možeš odgovarati na postove
  • Ne možeš slati privitke
  • Ne možeš mijenjati svoje postove
  •