» »

C++ programirane v Open GL oz. Direct x

C++ programirane v Open GL oz. Direct x

ulms ::

C++ Programiranje v Open GL & Direct X
:)) Ali že kdo programira v Open GL-ju ali pa v DirectX?
Če ja, potem me zanima kakšen projekt načrtujete in ali se kdo ukvarja z programiranjem za igre?


Andrej

Monster ::

mislim da jih kr dosti programira v gl in dx .. drugace pa mal bol cekiraj www.slogamedev.net :)
Ka zaboga...

Vesoljc ::

@smlu

koliko pa znaš?

ps: programiranje ZA igre? :\
Abnormal behavior of abnormal brain makes me normal...

SasoS ::

Jaz sem ravno spisal OpenGL 3D engine za fax :D. Ga objavim ko oddam če koga zanima :)

Vesoljc ::

itaq!
Abnormal behavior of abnormal brain makes me normal...

ulms ::

Ja itak objav!:))

Lord_Rand ::

Ja no jst sm tut pocas zacel v opengl aja kok cajta si pa delu un engine???
What now?

SasoS ::

Zečel sem nekje v marcu...samo sem večino aprila zabušaval :D. Bom verjetno zdaj čez vikend kaj uredil kodo, potem pa dam link...

Nerdor ::

Se priporočam, da vidim, kako izgleda opengl engine v kodi.
... for lifetime!

fx ::

#include <windows.h>
#include <gl/gl.h>

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;        
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;

    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "OpenGL";
    RegisterClass (&wc);
    
    hWnd = CreateWindow ("OpenGL", "OpenGL 3D3kotnik", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 640, 640, NULL, NULL, hInstance, NULL);

    EnableOpenGL (hWnd, &hDC, &hRC);


    while (!bQuit)
    {
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
        else
        {
            glClearDepth (1.0);            
            glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
            glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
            glEnable(GL_DEPTH_TEST);
            
            glPushMatrix ();
            glRotatef (theta, 0.0f, 1.0f, 1.0f);
            glBegin (GL_TRIANGLES);
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
            
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //
            
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //D            
            
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //D  
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
            glEnd ();

            
            glPopMatrix ();
            SwapBuffers (hDC);

            theta += 0.1f;
            Sleep (1);
        }
    }

    DisableOpenGL (hWnd, hDC, hRC);
    DestroyWindow (hWnd);
    return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage (0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
        }
        return 0;

    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;

    *hDC = GetDC (hWnd);

    ZeroMemory (&pfd, sizeof (pfd));
    pfd.nSize = sizeof (pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
    PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    iFormat = ChoosePixelFormat (*hDC, &pfd);
    SetPixelFormat (*hDC, iFormat, &pfd);
     
    *hRC = wglCreateContext( *hDC );
    wglMakeCurrent( *hDC, *hRC );

}

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);
}

Evo koda.

lp

SasoS ::

Evo moja stvaritev :D. Zadeva je spisana v C-ju, uporablja SDL knjižnico in je cross-platform - deluje tako v linuxu kot windowsih 8-). V sourcu sta priložena linux in mingw makefajla, načeloma bi se stvar kompajlala tudi v Visual Studiu ampak nisem šel delat projekta. Stvar mi je všeč ker je dokaj kompaktna (< 2000 vrstic) in še kar napredna :). Svet se naloži iz datoteke data.dat, source in programček ki tak file zgradi je v data poddirektoriju hkrati z vsemi modeli ki so v samplu. Kontrole so standard w s a d + miš za pogled, q je skok, f flashlight :D. S kurzorji (+home in end) se da en kvadrat in tisti koodrinatni sistem na sredini vrtet okoli vseh treh osi, g zriše še bound boxe od collision detectiona dočim je alt-enter fullscreen toggle. Koda je GPL tako da če kdo kaj pametnega pogrunta mora to objavit tu >:D. Še ena slikca...ja na stolpnico se da prit ;)



Linki:
Win32 binary (1 MB)
Source (15KB)

Zgodovina sprememb…

  • spremenilo: OwcA ()

fx ::

Kako dolgo si to delal?

lp

OwcA ::

Simpatično. :)

Sem dodal še v [C++] Galerija kode
Otroška radovednost - gonilo napredka.

Nerdor ::

Izvorno kodo sem si ogledal. Tudi vem kako si zgeneriral data1.dat. Samo nekaj mi ni jasno, s katerim programom si zmodeliral tiste *.m datoteke? Z Blender-jem mogoče!? Ali pa s PolyView programom!? Ker nikjer na googlu nisem našel formata *.m, ki bi se v grafiki uporabljal.

Drugače je pa izvrstno narejena naloga. Zelo kompaktna.:)
... for lifetime!

SasoS ::

ummm....z notepadom :D. Format je moja pogruntavščina. Sem mislil na začetku narest kak import iz grafičnih programov, ampak potem se mi je to zdelo še najbolj enostavno...

Nerdor ::

Cool! Zdej razumem. Jest sem pa iskal po googlu, kater format za 3D objekte je *.m
... for lifetime!

Mmm'Aah ::

Js programiram v OpenGL zdaj pol leta. Sicer programiram že deset let.

Kar se tiče OGL 3D grafike, trenutno delam portable 3D editor&animator (varjanta 3D Studio Max).

Glede OGL 2D grafike pa: delam ShamnssyGUI, portable zbirko class-ov za hitro kodanje, ki trenutno vključuje String, sezname (Linked/Array/Cursor), Socket utilities, Drawing utilities, ter windowing system z zbirko tipičnih kontrol (Label, Button, TextBox, ListBox, ComboBox, CheckButton, Group CheckButton, ExtendFrame, HorizontalLayout, VerticalLayout...). Ta GUI system se lahko poganja brez hardverske podpore, ali pa tudi preko OpenGL-ja, možno ga je popolnoma skinnat s slikicami, deluje pa na vseh platformah (Linux, MacOSX, Windows...).

Ravnokar testiram (in preko tega se dopolnjujem ShamnssyGUI) na eni igrici, ki se imenuje NetShooter (vem da je brezveze...zacasno ime). V tej igrici ima vsak igralec svojo raketico in lahko z njo leti naokrog, "skace", strelja druge itd. Stvar se lahko igra preko neta, z več igralci. Trudim se uporabljat čimveč fansy trikov, ki jih omogoča ShamnssyGUI, t.j. prozornost GUIja, skinnanje, blurranje slikic, povecevanje/pomanjsevanje slikic v real time itd. in seveda socket utilities, ki omogočajo, da s cimbolj preproso kodo vse skupaj povežem preko net-a.

ulms ::

Zanima me kuk cajta si pa purabu, da si se naučil
najosnovnejše stvari pri programiranju v GL-ju.
Pa zanim me če hodš na kšno šolo kjer se učiš programirat?


Andrej

Gundolf ::

Osnov GLja se naučiš v enem dnevu. Njegov 'problem' je le v tem, da je tako enostaven, da nima vgrajenega nobenega načina za odpiranje slik in raznih 3D modelov.

Če nimaš težav z osnovami programiranja v tvojem najljubšem jeziku in nekaj malega vektorske matematike, potem se priučiš osnov OpenGLa v enem dnevu, naslednji dan si lahko pogledaš bolj podrobno področje, ki te bolj zanima, tretji dan pa že kaj začneš pisati. Če te pa zanimajo vertex in pixel shaderji potem boš pa rabil malo več časa in kar nekaj več znanja matematike.

Mmm'Aah ::

Nažalost v sloveniji ni uradne državne šole kjer bi se lahko učil programirat. Lahko greš študirat informatiko ampak brez samostojnega dela ne boš znal še vedno nič nardit potem ko boš diplomiral....taki so pač programi...žalostno..

ulms ::

Lahko pa bi se ustanovila računalniška oz. programerska podjetja, ki bi za svoje delo potrebovala programerje in bi jih tudi usposobljala, ali pa jim financirala stroške študiranja v tujini npr.: Podjetje, ki se ukvarja s 3D grafiko, bi jih pošiljali v Anglijo na študi C++ smer DirectX oz. Open GL. To bi bila po moje najboljša rešitev za slovenske programerje.

Andrej

Mmm'Aah ::

Mislim, da tako močna specializacija ne bi bla lih prava stvar...mogoče nasplošno študij programiranja grafike (bitmap grafika, vektorska grafika, 3D grafika, encoding barv...), ali študij programiranja baz podatkov (podatkovne strukture in algoritmi, kompresija podatkov...), ali študij programiranja vhodno-izhodnih enot (kamor bi spadal tudi speech recognition itd.). Uprabo posameznih knjižnic in specifičnih APIjev sem lahko potem vsak sam nauči iz dokumentacije.

Po moje ima še vedno preveč slovencev premalo samoiniciative. Poglej že samo kolko postov je na tem forumu, ki sprašujejo po osnovah nekega programskega jezika ali uporabe nekega IDE-ja ali določenih API-jev. Sam sem se naučil programiranja popolnoma sam, brez kakršnihkoli tečajev in brez kakršnegakoli spraševanja po forumih, enostavno sem brskal po netu, itak najdeš gor vse kar ti rabi. Problem je samo v tem, da so ljudje preveč leni in nimajo pravega zagona in želje da bi rešili določen problem. Pa še ko je treba kakšen algoritem si zmislit, iščejo že narjene stvari namesto da bi probali kaj nardit sami. Če bi imeli zares voljo, bi bilo v Sloveniji čisto dovolj ljudi s takim znanjem, da bi se lahko nardila ena močna firma, ki bi delal real professional programe, tudi na področju umetnosti (kot so Photoshop, 3DSMax itd.) in zabave (igre in podobno), ne pa samo poslovne programe za vodenje poslovanja, računov bank in podobno, kar je trenutno edino kar Slovenska podjetja znajo ustvarit.

64202 ::

> ne pa samo poslovne programe za vodenje poslovanja, računov bank in podobno, kar je trenutno edino kar Slovenska podjetja znajo ustvarit.

A mislis da je v tujini kej drugac? V povprecju firme povsod delajo povprecne stvari. Samo so pac vecinoma vecje drzave in na vsako naso firmo, ki se bavi s spili, pride v nemciji recimo 40 firm, ki delajo isto. Ne trdim seveda, da smo ravno neka oaza z velikim relativnim procentom...
I am NaN, I am a free man!

kivi113 ::

kdo v sloveniji sploh dela špile in kaj so že naredl?

Vesoljc ::

nekoč ArxelTribe, danes ZootFly
Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

tekstura [c++ opengl]

Oddelek: Programiranje
9919 (704) matej94
»

[c++]OpenGL izris kvadrata

Oddelek: Programiranje
81276 (1136) Mavrik
»

OpenGL problem

Oddelek: Programiranje
212491 (2057) Gundolf
»

OpenGL orr v ansi c

Oddelek: Programiranje
121646 (1434) igor12

Več podobnih tem