Avatar billede quiw Nybegynder
15. marts 2009 - 14:54 Der er 2 kommentarer

OpenGL - Compile error.

Hejsa eksperter.
Jeg er nu sprunget ud i OpenGl, og benytter mig af følgende tutorial:
http://www.euclideanspace.com/software/games/threed/openglcpp/texture/index.htm

- Men, jeg har dog et problem, selvom jeg har fulgt tutorialen til punkt og prikke, så får jeg nogle compile errors, nemlig:

-------------------------
Line 33: expected constructor, destructor, or type conversion before '*' token.
Line 33: expected `,' or `;' before '*' token
Line 53: `TextureImage' undeclared (first use this function)
Line 57: `LoadBMP' undeclared (first use this function)
-------------------------

Er der nogle som kan hjælpe mig, med at løse problemet?
Jeg har følgende sourcecode:

/*
  Tutorial fra: http://www.euclideanspace.com/software/games/setup/openglcpp/first/index.htm
  Husk at linke til libopengl32.a, libglaux.a, libglu32.a, libglut32.a, libglut.a ..
*/


#include <windows.h> // Include windows, som altid, da vi er under windows OS.
#include <gl/gl.h> //OpenGL include
#include <gl/glu.h> //OpenGL include
#include <gl/glext.h> //OpenGL include


using namespace std;


HGLRC hRC = NULL;// Rendering Context, openGL relateret
HDC hDC = NULL; //Device Context, openGL relateret
HWND hWnd = NULL; // Windows relateret, et windows vinduehandle
HINSTANCE hInstance; // Windows relateret, en instance af vinduet vi vil lave.

bool keys[256];    // Antal keys på keyboardet vi bruger.
bool active = TRUE; // Om vinduet er aktivt eller ej.
bool fullscreen = TRUE; // Fullscreen eller ej.

GLfloat    rquad; // Vores firkants rotation
GLuint texture[1]; // Texturen til vores firkant.

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Windows relateret.

//Funktion til at indlæse bitmap
LRESULT    CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

AUX_RGBImageRec *LoadBMP(char *Filename){
  FILE *File=NULL;

  if (!Filename){ // Tjekker om filnavn er specificeret eller ej.
      return NULL;
  }

  File=fopen(Filename,"r");  // Åbner bitmap med read-only

  if (File){ // Hvis filen blev loaded, returner bitmap.
      fclose(File);
      return auxDIBImageLoad(Filename);
  }
  return NULL;
}

//Funktion til at loade bitmap ind som texture:
int LoadGLTextures(){
  int Status=FALSE;
 
  AUX_RGBImageRec *TextureImage[1];

  memset(TextureImage,0,sizeof(void *)*1); // Imagerecord som vi kan gemme vores billede i.
 
  if (TextureImage[0]=LoadBMP("Data/image1.bmp")){ // Derefter loader vi image.bmp ved at kalde loadBMP
      Status=TRUE;

      glGenTextures(1, &texture[0]);
      glBindTexture(GL_TEXTURE_2D, texture[0]);
      glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  }

  if (TextureImage[0]){
      if (TextureImage[0]->data){
        free(TextureImage[0]->data);
  }

  free(TextureImage[0]);
  }

  return Status;
}

// Nu intialisere vi openGl:
int InitGL(GLvoid){
  if (!LoadGLTextures()){ //Loader textures.
      return FALSE;
  }
  glEnable(GL_TEXTURE_2D); // Slår textures til.
  glShadeModel(GL_SMOOTH); // Vi fortæller opengl, at vi vil have smooth og glatte linjer og fades.
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Når skærmen skal resættes, bruger vi clearcolor, og den farve vi vil resette med. R,G,B,ALPHA
  glEnable(GL_DEPTH_TEST); //Slår Depth test til.
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //
  return TRUE; // Vi returnere true uanset hvad, indsæt selv en fejlhandler her
}

//Funktion til at tegne på skærmen her:
int DrawGLScene(GLvoid){
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Denne linje clears skærmen med den foregivne farve i glClearColor.
  glLoadIdentity(); // Denne linje resetter skærmen til matrix modelview mode.
 
  // Her tegner vi et objekt, en firkant:
  glTranslatef(0.0f,0.0f,-5.0f);
  glRotatef(30.0f,0.0f,1.0f,0.0f);
  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glBegin(GL_QUADS);
  // Front Face
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left
  // Back Face
  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  // Top Face
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  // Bottom Face
  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  // Right face
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
  // Left Face
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
  glEnd();
  rquad-=1.15f;
  return TRUE; // Vi returnere true uanset hvad, indsæt selv en fejlhandler her
}

//Funktionen til at resize scenen efter vinduets størrelse (Er ikke nødvendig, men en god idé!)
GLvoid ReSizeGLScene(GLsizei width, GLsizei height){ //Variablerne bredde og højde
  glViewport(0,0,width,height); //Resetter viewport efter bredde og højde angivet som argument.
 
  glMatrixMode(GL_PROJECTION); // Fortæller at vi gerne vil bruge projection matrix (Giver ægte 3deffekt (men ikke sikker))
  glLoadIdentity(); // Vi resetter vores projection matrix, som vi tidligere kaldte.

  gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // Vores perspektiv

  glMatrixMode(GL_MODELVIEW); // vi vælger modelview matrix, det er der hvor vores objekter er gemt.
  glLoadIdentity(); // Og nu resetter vi vores modelview matrix.
}

//Funktionen til at dræbe openGl på en pæn måde.
GLvoid KillGLWindow(GLvoid){ // Måden at lukke vinduet ordenligt på.
  if (fullscreen){ // Først tjekker vi om skærmen er fullscreen
      ChangeDisplaySettings(NULL,0); // Vi prøver at skifte til windows skærmen, hvis den er fuldscreen .. Så kan vi destroy den.
      ShowCursor(TRUE); //Vis cursor.
  }

  if (hRC){ // Vi tjekker først om redering objects eksisterer.
      if (!wglMakeCurrent(NULL,NULL)){ //
          MessageBox(NULL,"Release Of DC And RC Failed.","Shutdown Error",MB_OK | MB_ICONINFORMATION);
      }
      if (!wglDeleteContext(hRC)){ // Vi forsøger at destroye Rendering objects.
          MessageBox(NULL,"Release Rendering Context Failed.","Shutdown Error",MB_OK | MB_ICONINFORMATION);
      }
      hRC=NULL;
  }

  if (hDC && !ReleaseDC(hWnd,hDC)){ // Her forsøger vi at frigive vinduet
      MessageBox(NULL,"Release Device Context Failed.","Shutdown Error",MB_OK | MB_ICONINFORMATION);
      hDC=NULL;
  }

  if (hWnd && !DestroyWindow(hWnd)){ // Her forsøger vi at destroye vinduet
      MessageBox(NULL,"Could Not Release hWnd.","Shutdown Error",MB_OK | MB_ICONINFORMATION);
      hWnd=NULL;
  }

  if (!UnregisterClass("OpenGL",hInstance)){ // Vi frigiver vores instance af vinduet
      MessageBox(NULL,"Could Not Unregister Class.","Shutdown Error",MB_OK | MB_ICONINFORMATION);
      hInstance=NULL;
  }
}

// Den vigtigste af alle, den funktion som laver opengl winduet
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag){ // Argumenterne: titel, bredde, højde, antal bits (16,24,32?), fullscreen
  GLuint PixelFormat; // Denne variable gemmer pixelformatet
  WNDCLASS wc; // Denne holder windows class strukturen.
  DWORD dwExStyle; // Windows style informationer (Extended style)
  DWORD dwStyle; // Windows style informationer (Normal style)
  RECT WindowRect; // Her, og de næste 4, definerer bundlinjerne af windows vinduet.
  WindowRect.left=(long)0;
  WindowRect.right=(long)width;
  WindowRect.top=(long)0;
  WindowRect.bottom=(long)height;

  fullscreen=fullscreenflag; // Vi sætter fullscreen

  hInstance = GetModuleHandle(NULL); // Herefter forsøger vi at tage en instans af vores vindue.
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  wc.lpfnWndProc = (WNDPROC) WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = NULL;
  wc.lpszMenuName = NULL;
  wc.lpszClassName = "OpenGL";

  if (!RegisterClass(&wc)){ //Hvis det fejler, får vi en besked.
      MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
  }
 
  if (fullscreen){ // Her tjekker vi, om vinduet er fullscren, hvis det er, så sætter vi den til fullscreen mode.
      DEVMODE dmScreenSettings;  // Vi definerer en device mode.
      memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Vi rydder noget memory, til at gemme vores video
      dmScreenSettings.dmSize=sizeof(dmScreenSettings);
      dmScreenSettings.dmPelsWidth = width; // Bredde af bits skærmen skal være, som vi fanger fra funktionens argumenter.
      dmScreenSettings.dmPelsHeight = height; // Højde af bits skærmen skal være, som vi fanger fra funktionens argumenter.
      dmScreenSettings.dmBitsPerPel = bits; // Antal bits skærmen skal være, (16,24,32?), som vi fanger fra funktionens argumenter.
      dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;


      if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL){ // Nu tjekker vi om fullscreen blev sat ordenligt.
        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;
        }else{
            MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
            return FALSE;
        }
      }
  }

  if (fullscreen){ // Her tjekker vi om vi stadig er i fullscreen
      dwExStyle=WS_EX_APPWINDOW; // Vi indstiller extended styles, efter fullscreen
      dwStyle=WS_POPUP; // Vi indstiller styles, efter fullscreen
      ShowCursor(FALSE); // Vi gemmer musen, da vi ikke vil se den i fullscreen
  }else{
      dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Vi indstiller extended styles, efter fullscreen
      dwStyle=WS_OVERLAPPEDWINDOW; // Vi indstiller styles, efter fullscreen
  }
  AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
 
  //Her laver vi et typisk windows_vindue, (kun windows relateret). følgende styles WS_CLIPSIBLINGS |WS_CLIPCHILDREN, forhindre andre programmer i at tegne indover vores vindue.
  if (!(hWnd=CreateWindowEx( dwExStyle,"OpenGL",title,dwStyle |WS_CLIPSIBLINGS |WS_CLIPCHILDREN,0, 0,WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL))){
        KillGLWindow();
        MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
  }
 
  //Følgende del beskriver pixel formatet:
              //Vi vælger et format der understøtter OpenGL og double buffering, RGBA (red, green, blue, alpha channel)
  static PIXELFORMATDESCRIPTOR pfd={
      sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
      1, // Version Number
      PFD_DRAW_TO_WINDOW | // Format Must Support Window
      PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
      PFD_DOUBLEBUFFER, // Must Support Double Buffering
      PFD_TYPE_RGBA, // Request An RGBA Format
      bits, // Select Our Color Depth
      0, 0, 0, 0, 0, 0, // Color Bits Ignored
      0, // No Alpha Buffer
      0, // Shift Bit Ignored
      0, // No Accumulation Buffer
      0, 0, 0, 0, // Accumulation Bits Ignored
      16, // 16Bit Z-Buffer (Depth Buffer)
      0, // No Stencil Buffer
      0, // No Auxiliary Buffer
      PFD_MAIN_PLANE, // Main Drawing Layer
      0, // Reserved
      0, 0, 0 // Layer Masks Ignored
  };
 
    if (!(hDC=GetDC(hWnd))){ // Får fat i Device Context
      KillGLWindow(); // Vi kalder funktionen som dræber openGL, hvis det ikke lykkedes
      MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); // Vi giver en fejl meddelse
      return FALSE;
    }

    if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){ //Vi finder et pixelformat som passer.
      KillGLWindow(); // Vi kalder funktionen som dræber openGL, hvis det ikke lykkedes
      MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
    }

  if(!SetPixelFormat(hDC,PixelFormat,&pfd)){ // Her sætter vi pixelformatet
      KillGLWindow(); // Vi kalder funktionen som dræber openGL, hvis det ikke lykkedes
      MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
  }

  if (!(hRC=wglCreateContext(hDC))){ //Får fat i Rendering Context.
      KillGLWindow(); // Vi kalder funktionen som dræber openGL, hvis det ikke lykkedes
      MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
  }

  if(!wglMakeCurrent(hDC,hRC)){ // Hvis alt lykkes, gør vi rendering context aktivt
      KillGLWindow(); // Vi kalder funktionen som dræber openGL, hvis det ikke lykkedes
      MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
  }
 
  ShowWindow(hWnd,SW_SHOW); // Vi viser nu vinduet.
  SetForegroundWindow(hWnd); // Vi sætter det til forgrunden
  SetFocus(hWnd); // Vi sætter fokus
  ReSizeGLScene(width, height); // Sætter bredde og højde.

  if (!InitGL()){ // Derefter initialisere vi openGL, hvis det fejler, dræber vi vinduet.
      KillGLWindow();
      MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
      return FALSE;
  }

  return TRUE; // Vi returnere true, med success!
}


//Windows relateret funktion:
LRESULT CALLBACK WndProc( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
  switch (uMsg){
    case WM_ACTIVATE:{
        if (!HIWORD(wParam)){
          active=TRUE;
        }else{
          active=FALSE;
        }
        return 0;
    }

    case WM_SYSCOMMAND:{
        switch (wParam){
          case SC_SCREENSAVE:
          case SC_MONITORPOWER:
          return 0;
      }
      break;
    }

    case WM_CLOSE:{
        PostQuitMessage(0);
        return 0;
    }

    case WM_KEYDOWN:{
        keys[wParam] = TRUE;
        return 0;
    }

    case WM_KEYUP:{
        keys[wParam] = FALSE;
        return 0;
    }

    case WM_SIZE:{
        ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
        return 0;
    }
}

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


// Windows main start funktion, udelukkende windows programmering.
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  MSG msg;
  BOOL done=FALSE;
  if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO){
      fullscreen=FALSE;
  }
  if (!CreateGLWindow("Lesson 1",800,600,32,fullscreen)){ // Opret vinduet, med 1440x900 med 32bit
      return 0;
  }

  while(!done){
      if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
        if (msg.message==WM_QUIT){
            done=TRUE;
        }else{
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
      }else{
        if (active){
            DrawGLScene();
            SwapBuffers(hDC);
        }
      }
  }
  KillGLWindow();
  return (msg.wParam);
}



----
Og som bonus spørgsmål, hvor jeg kan finde noget om import af 3d objekter?
Avatar billede bertelbrander Novice
15. marts 2009 - 16:36 #1
Det ser ud til at den har problemer med AUX_RGBImageRec, det er der også andre der har:

http://www.gamedev.net/community/forums/topic.asp?topic_id=143836

Jeg ved ikke noget om OpenGL
Avatar billede quiw Nybegynder
21. marts 2009 - 00:39 #2
Oh, okay, det ser faktisk også mere brugbart ud .. Men hvordan med directx? Hvad er fordelen/forskellen? Hvad er lettest?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester