Zad nejde to OpenGL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zad nejde to OpenGL – C / C++ – Fórum – Programujte.comZad nejde to OpenGL – C / C++ – Fórum – Programujte.com

 

Adam
~ Anonymní uživatel
176 příspěvků
13. 2. 2012   #1
-
0
-

Zdravím,

Nevím co už dělat, ale stále jsem ještě nespustil ani jednu aplikaci opengl. Prošel jsem snad stovky zdrojových kódu, návodu a už nevím čeho všeho. Avšak poslední kód který teď mám rozjetý v dev cpp není vyjímkou. Píše mi to tyhle chyby:

 D:\Knihovny\Plocha\main.cpp In function `GLvoid KillGLWindow()': 

77 D:\Knihovny\Plocha\main.cpp a function-definition is not allowed here before '{' token 

77 D:\Knihovny\Plocha\main.cpp expected `,' or `;' before '{' token

252 D:\Knihovny\Plocha\main.cpp a function-definition is not allowed here before '{' token

252 D:\Knihovny\Plocha\main.cpp expected `,' or `;' before '{' token

309 D:\Knihovny\Plocha\main.cpp a function-definition is not allowed here before '{' token

309 D:\Knihovny\Plocha\main.cpp expected `,' or `;' before '{' token

369 D:\Knihovny\Plocha\main.cpp `msg' undeclared (first use this function)

(Each undeclared identifier is reported only once for each function it appears in.)

369 D:\Knihovny\Plocha\main.cpp return-statement with a value, in function returning 'void'

D:\Knihovny\Plocha\Makefile.win [Build Error]  [main.o] Error 1

Už toho mám plné zuby. Začíná mi to připadat jak v linuxu. Věčně tomu něco chybí k tomu aby to běželo. Nemám nejmenší tušení co s tím je. Tady je kód:

#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glaux.lib")

#include <windows.h>// Hlavi?kový soubor pro Windows
#include <gl\gl.h>// Hlavi?kový soubor pro OpenGL32 knihovnu
#include <gl\glu.h>// Hlavi?kový soubor pro Glu32 knihovnu
#include <gl\glaux.h>// Hlavi?kový soubor pro Glaux knihovnu

HDC hDC = NULL;// Privátní GDI Device Context
HGLRC hRC = NULL;// Trvalý Rendering Context
HWND hWnd = NULL;// Obsahuje Handle našeho okna
HINSTANCE hInstance;// Obsahuje instanci aplikace

bool keys[256];// Pole pro ukládání vstupu z klávesnice
bool active = TRUE;// Ponese informaci o tom, zda je okno aktivní
bool fullscreen = TRUE;// Ponese informaci o tom, zda je program ve fullscreenu
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// Deklarace procedury okna (funk?ní prototyp)

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// Zm?na velikosti a inicializace OpenGL okna
{
     
      if (height==0)// Zabezpe?ení proti d?lení nulou
      {               
                 height=1;// Nastaví výšku na jedna
      }
     
      glViewport(0,0,width,height);// Resetuje aktuální nastavení
      glMatrixMode(GL_PROJECTION);// Zvolí projek?ní matici
      glLoadIdentity();// Reset matice
      gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);// Výpo?et perspektivy
      glMatrixMode(GL_MODELVIEW);// Zvolí matici Modelview
      glLoadIdentity();// Reset matice
}

int InitGL(GLvoid)// Všechno nastavení OpenGL
{
    glShadeModel(GL_SMOOTH);// Povolí jemné stínování
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);// ?erné pozadí
    glClearDepth(1.0f);// Nastavení hloubkového bufferu
    glEnable(GL_DEPTH_TEST);// Povolí hloubkové testování
    glDepthFunc(GL_LEQUAL);// Typ hloubkového testování
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Nejlepší perspektivní korekce
    return TRUE;// Inicializace prob?hla v po?ádku
}

int DrawGLScene(GLvoid)// Vykreslování
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Smaže obrazovku a hloubkový buffer
glLoadIdentity();// Reset matice
// Sem m?žete kreslit

return TRUE;// Vykreslení prob?hlo v po?ádku
}

GLvoid KillGLWindow(GLvoid)// Zavírání okna
{
       if (fullscreen)// Jsme ve fullscreenu?
       {
                         ChangeDisplaySettings(NULL,0);// P?epnutí do systému
                         ShowCursor(TRUE);// Zobrazí kurzor myši
       }
      
       if (hRC)// Máme rendering kontext?
       {
                  if (!wglMakeCurrent(NULL,NULL))// Jsme schopni odd?lit kontexty?
                  {
                        MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                  }
                  if (!wglDeleteContext(hRC))// Jsme schopni smazat RC?
                  {
                        MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                  }
                  hRC=NULL;// Nastaví hRC na NULL
       }
       BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
       {
            GLuint PixelFormat;// Ukládá formát pixel?
            WNDCLASS wc;// Struktura Windows Class
            DWORD dwExStyle;// Rozší?ený styl okna
            DWORD dwStyle;// Styl okna
            RECT WindowRect;// Obdélník okna

            WindowRect.left = (long)0;// Nastaví levý okraj na nulu
            WindowRect.right = (long)width;// Nastaví pravý okraj na zadanou hodnotu
            WindowRect.top = (long)0;// Nastaví horní okraj na nulu
            WindowRect.bottom = (long)height;// Nastaví spodní okraj na zadanou hodnotu
           
            fullscreen = fullscreenflag;// Nastaví prom?nnou fullscreen na správnou hodnotu
            hInstance = GetModuleHandle(NULL);// Získá instanci okna

            wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;// P?ekreslení p?i zm?n? velikosti a vlastní DC
            wc.lpfnWndProc = (WNDPROC) WndProc;// Definuje proceduru okna
            wc.cbClsExtra = 0;// Žádná extra data
            wc.cbWndExtra = 0;// Žádná extra data
            wc.hInstance = hInstance;// Instance
            wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);// Standardní ikona
            wc.hCursor = LoadCursor(NULL, IDC_ARROW);// Standardní kurzor myši
            wc.hbrBackground = NULL;// Pozadí není nutné
            wc.lpszMenuName = NULL;// Nechceme menu
            wc.lpszClassName = "OpenGL";// Jméno t?ídy okna
           
            if (!RegisterClass(&wc))// Registruje t?ídu okna
            {
                                       MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                       return FALSE;// P?i chyb? vrátí false
            }
           
            if (fullscreen)// Budeme ve fullscreenu?
            {
                              DEVMODE dmScreenSettings;// Mód za?ízení

                              memset(&dmScreenSettings,0,sizeof(dmScreenSettings));// Vynulování pam?ti
                              dmScreenSettings.dmSize=sizeof(dmScreenSettings);// Velikost struktury Devmode
                              dmScreenSettings.dmPelsWidth= width;// Ší?ka okna
                              dmScreenSettings.dmPelsHeight= height;// Výška okna
                              dmScreenSettings.dmBitsPerPel= bits;// Barevná hloubka
                              dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
                             
                              // Pokusí se použít práv? definované nastavení
                              if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
                              {
                                      // Nejde-li fullscreen, m?že uživatel spustit program v okn? nebo ho opustit
                                      if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|
                                      MB_ICONEXCLAMATION)==IDYES)
                                      {
                                            fullscreen=FALSE;// B?h v okn?
                                      }
                              else
                                  {
                                      // Zobrazí uživateli zprávu, že program bude ukon?en
                                      MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
                                      return FALSE;// Vrátí FALSE
                                  }                             
                              }
             }
             if (fullscreen)// Jsme stále ve fullscreenu?
             {
                               dwExStyle=WS_EX_APPWINDOW;// Rozší?ený styl okna

                               dwStyle=WS_POPUP;// Styl okna

                               ShowCursor(FALSE);// Skryje kurzor

             }
             else
                 {
                               dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;// Rozší?ený styl okna
                               dwStyle=WS_OVERLAPPEDWINDOW;// Styl okna   
                 }
             AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);// P?izp?sobení velikosti okna
            
             // Vytvo?ení okna
             if (!(hWnd=CreateWindowEx(dwExStyle,// Rozší?ený styl
                  "OpenGL",// Jméno t?ídy
                  title,// Titulek
                  dwStyle |// Definovaný styl
                  WS_CLIPSIBLINGS |// Požadovaný styl
                  WS_CLIPCHILDREN,// Požadovaný styl
                  0, 0,// Pozice
                  WindowRect.right-WindowRect.left,// Výpo?et ší?ky
                  WindowRect.bottom-WindowRect.top,// Výpo?et výšky
                  NULL,// Žádné rodi?ovské okno
                  NULL,// Bez menu
                  hInstance,// Instance
                  NULL)))// Nep?edat nic do WM_CREATE
             {
                  KillGLWindow();// Zruší okno
                  MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                  return FALSE;// Vrátí chybu
             }
            
             static PIXELFORMATDESCRIPTOR pfd=// Oznámíme Windows jak chceme vše nastavit
             {
                    sizeof(PIXELF ORMATDESCRIPTOR),// Velikost struktury
                    1,// ?íslo verze
                    PFD_DRAW_TO_WINDOW |// Podpora okna
                    PFD_SUPPORT_OPENGL |// Podpora OpenGL
                    PFD_DOUBLEBUFFER,// Podpora Double Bufferingu
                    PFD_TYPE_RGBA,// RGBA Format
                    bits,// Zvolí barevnou hloubku
                    0, 0, 0, 0, 0, 0,// Bity barev ignorovány
                    0,// Žádný alpha buffer
                    0,// Ignorován Shift bit
                    0,// Žádný akumula?ní buffer
                    0, 0, 0, 0,// Akumula?ní bity ignorovány
                    16,// 16-bitový hloubkový buffer (Z-Buffer)
                    0,// Žádný Stencil Buffer
                    0,// Žádný Auxiliary Buffer
                    PFD_MAIN_PLANE,// Hlavní vykreslovací vrstva
                    0,// Rezervováno
                    0, 0, 0// Maska vrstvy ignorována

              };
             
              if (!(hDC=GetDC(hWnd)))// Poda?ilo se p?ipojit kontext za?ízení?
              {
                 KillGLWindow();// Zav?e okno
                 MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                 return FALSE;// Ukon?í program
              }
             
              if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))// Poda?ilo se najít Pixel Format?
              {
                 KillGLWindow();// Zav?e okno
                 MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                 return FALSE;// Ukon?í program
              }
             
              if(!SetPixelFormat(hDC,PixelFormat,&pfd))// Poda?ilo se nastavit Pixel Format?
              {
                 KillGLWindow();// Zav?e okno
                 MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                 return FALSE;// Ukon?í program
              }
             
              if (!(hRC=wglCreateContext(hDC)))// Poda?ilo se vytvo?it Rendering Context?
              {
                 KillGLWindow();// Zav?e okno
                 MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                 return FALSE;// Ukon?í program
              }
             
              if(!wglMakeCurrent(hDC,hRC))// Poda?ilo se aktivovat Rendering Context?
              {
                  KillGLWindow();// Zav?e okno
                  MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                  return FALSE;// Ukon?í program
              }
             
              ShowWindow(hWnd,SW_SHOW);// Zobrazení okna
              SetForegroundWindow(hWnd);// Do pop?edí
              SetFocus(hWnd);// Zam??í fokus
              ReSizeGLScene(width, height);// Nastavení perspektivy OpenGL scény
             
              if (!InitGL())// Inicializace okna
              {
                 KillGLWindow();// Zav?e okno
                 MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                 return FALSE;// Ukon?í program
              }
             
              return TRUE;// Vše prob?hlo v po?ádku

       }
      
       LRESULT CALLBACK WndProc(HWND hWnd,// Handle okna
               UINT uMsg,// Zpráva pro okno
               WPARAM wParam,// Dopl?kové informace
               LPARAM lParam)// Dopl?kové informace

               {
                      switch (uMsg);// V?tvení podle p?íchozí zprávy
                      {
                             case WM_ACTIVATE:// Zm?na aktivity okna
                             {
                                  if (!HIWORD(wParam))// Zkontroluje zda není minimalizované
                                  {
                                     active=TRUE;// Program je aktivní
                                  }
                                  else{
                                       active=FALSE;// Program není aktivní
                                       }
                                  return 0;// Návrat do hlavního cyklu programu
                             }
                            
                             case WM_SYSCOMMAND:// Systémový p?íkaz
                             {
                                  switch (wParam)// Typ systémového p?íkazu
                                  {
                                         case SC_SCREENSAVE:// Pokus o zapnutí šet?i?e obrazovky
                                         case SC_MONITORPOWER:// Pokus o p?echod do úsporného režimu?
                                         return 0;// Zabrání obojímu
                                  }
                                  break;// Návrat do hlavního cyklu programu
                             }
                            
                             case WM_CLOSE:// Povel k ukon?ení programu
                             {
                                  PostQuitMessage(0);// Pošle zprávu o ukon?ení
                                  return 0;// Návrat do hlavního cyklu programu
                             }
                            
                             case WM_KEYDOWN:// Stisk klávesy
                             {
                                  keys[wParam] = TRUE;// Oznámí to programu
                                  return 0;// Návrat do hlavního cyklu programu
                             }
                            
                             case WM_KEYUP:// Uvoln?ní klávesy
                             {
                                  keys[wParam] = FALSE;// Oznámí to programu
                                  return 0;// Návrat do hlavního cyklu programu
                             }
                            
                             case WM_SIZE:// Zm?na velikosti okna
                             {
                                  ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Ší?ka, HiWord=Výška
                                  return 0;// Návrat do hlavního cyklu programu
                             }
                      }
                      return DefWindowProc(hWnd, uMsg, wParam, lParam);// P?edání ostatních zpráv systému
               }

        int WINAPI WinMain(HINSTANCE hInstance,// Instance
            HINSTANCE hPrevInstance,// P?edchozí instance
            LPSTR lpCmdLine,// Parametry p?íkazové ?ádky
            int nCmdShow)// Stav zobrazení okna
            {
                MSG msg;// Struktura zpráv systému
                BOOL done=FALSE;// Prom?nná pro ukon?ení programu
               
                // Dotaz na uživatele pro fullscreen/okno
                if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?", MB_YESNO | MB_ICONQUESTION) == IDNO)
                {
                   fullscreen=FALSE;// B?h v okn?
                }
               
                if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))// Vytvo?ení OpenGL okna
                {
                   return 0;// Konec programu p?i chyb?
                }
               
                while(!done)// Hlavní cyklus programu
                {
                               if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))// P?išla zpráva?
                               {
                                    if (msg.message==WM_QUIT)// Obdrželi jsme zprávu pro ukon?ení?
                                    {
                                       done=TRUE;// Konec programu
                                    }
                                    else// P?edáme zprávu procedu?e okna
                                    {
                                           TranslateMessage(&msg);// P?eloží zprávu
                                           DispatchMessage(&msg);// Odešle zprávu
                                    }
                               }
                               else
                               {
                                   if (active)// Je program aktivní?
                                   {
                                      if (keys[VK_ESCAPE])// Byl stisknut ESC?
                                      {
                                         done=TRUE;// Ukon?íme program
                                      }
                                   }
                                   else// P?ekreslení scény
                                   {
                                          DrawGLScene();// Vykreslení scény
                                          SwapBuffers(hDC);// Prohození buffer? (Double Buffering)
                                   }
                                  
                                   if (keys[VK_F1])// Byla stisknuta klávesa F1?
                                   {
                                      keys[VK_F1]=FALSE;// Ozna? ji jako nestisknutou
                                      KillGLWindow();// Zruší okno
                                      fullscreen=!fullscreen;// Negace fullscreen
                                      // Znovuvytvo?ení okna
                                      if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
                                      {
                                         return 0;// Konec programu pokud nebylo vytvo?eno
                                      }
                                   }
                               }
                }
            }
           
        KillGLWindow();// Zav?e okno
        return (msg.wParam);// Ukon?ení programu
}

Nahlásit jako SPAM
IP: 46.174.59.–
zlz
~ Anonymní uživatel
634 příspěvků
13. 2. 2012   #2
-
+2
-
Zajímavé

Vypadá to na kód některé lekce ze série NeHe toturiálů. Jak sis asi všiml, ke každé lekci jsou zdrojáky v několika verzích. Toto je pravděpodobně kód pro MS Visual C++, protože obsahuje Microsoftí #pragmy. Dev-C++ tyto pragmy nezná, takže si stáhni MSVC nebo projekt pro Dev-C++ (nebo ty knihovny přidej do projektu v nastavení projektu).

Co se týče tvých plných zubů, tak já mám zase plné zuby chytráků, kteří o programování ví kulový a rovnou se hrnou do 3D, někde zkopírujou kus kódu, nerozumí ani řádku a držkujou, že to nejde.

Nahlásit jako SPAM
IP: 213.211.51.–
_tomas0
Duch
13. 2. 2012   #3
-
0
-

Funkcia KillGLWindow je zle ozátvorkovana, v tele tejto funkcie máš definovanú ďalšiu funkciu

Nahlásit jako SPAM
IP: 147.175.178.–
Adam
~ Anonymní uživatel
176 příspěvků
14. 2. 2012   #4
-
0
-

#2 zlz
1) Z nehe článků to je, to máte pravdu

2)Už je to nějaký ten pátek co se programování zabývám, takže moc dobře vím co je to programování a co to obnáší.

3)Vrhl jsem se na 3D grafiku teď neboť kvůli toho jsem taky začal programovat a tak jsem se tedy rozhodnul po nějakých doporučeních jak od kamarádů tak z rad na internetu, že vyzkouším OpenGL.

4)Ten kód, který jsem zde uvedl je hned první jaký na nehe článcích byl, takže je to pro začátečníka programování počítačové grafiky kapku složitější.

5)Mimochodem s programováním a vykreslováním mám malé zkušenosti z GDI

Nahlásit jako SPAM
IP: 46.174.59.–
yaqwsx+9
Posthunter
14. 2. 2012   #5
-
0
-

#4 Adam
Na NeHe bych se už dnes nespoléhal. Jsou značně archaické a spousta věcí se dnes dělá úplně jinak. A není to jen můj pohled - tvrdí to i sami překladatelé NeHe do češtiny.

Nahlásit jako SPAM
IP: 85.160.54.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Adam
~ Anonymní uživatel
176 příspěvků
15. 2. 2012   #6
-
0
-

A nemůžete mi poradit, kde sehnat kvalitní turotiály, protože vždy jak něco na internetu seženu, tak mi vždy někdo řekne, že je to buď napsané nějakým amatérem, nebo je to staré (což je častější)

Nahlásit jako SPAM
IP: 46.174.59.–
yaqwsx+9
Posthunter
15. 2. 2012   #7
-
0
-
Nahlásit jako SPAM
IP: 85.160.42.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Adam
~ Anonymní uživatel
176 příspěvků
15. 2. 2012   #8
-
0
-

#7 yaqwsx
Aspoň že tak, jinak díky

Nahlásit jako SPAM
IP: 46.174.59.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 138 hostů

Podobná vlákna

Čau nejde mi C++/OpenGL kód — založil Dominik Rozporka

C++, OpenGL, SDL /// C++, OpenGL — založil Kolemjdouci

C++ opengl — založil opengl

OpenGL — založil Miro1701

OpenGL — založil Datlik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý