Eli siis monissa oppaissa mitkä liittyvät OpenGL on kirjoitettu esim näin:
bool keys[256]; bool active=TRUE; bool fullscreen=TRUE; bool blend; bool bp; bool fp;
mutta kun itse kirjoitan noin tulee erroreita. Mitähän nämä tarkoittaa:
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\
g++ 4.5.2 käyttäen kääntyy ainakin:
int main() { bool keys[256]; bool active=true; bool fullscreen=true; bool blend; bool bp; bool fp; }
Mitä kääntäjää käytät?
Olisiko mahdollista nähdä koodia ennen näitä rivejä?
Veikkaan että käytät vahingossa tai tarkoituksella C-kääntäjää, josta ei löydy bool-tietotyyppiä. Lisää rivien yläpuolelle:
typedef unsigned char bool; #define FALSE 0 #define TRUE 1
Käytän CodeBlocksia.
Tosiaan C kääntäjä oli käytössä. Oli tullut käyttöön kun otin OpenGL projektin. Tein uuden projektin ja nyt käytössä on console application.
Tein taas lisää säätöjä ja nyt törmäsin toiseen ongelmaan.
main.cpp:262: error: too few arguments to function 'GLvoid KillGLWindow(<type error>)'
main.cpp:693: error: at this point in file
Tuo ylempi errori ilmaantui alapuolella olevan koodin ensimmäisestä rivistä eli:
int InitGL(GLvoid)
alimmainen errori rivi on:
KillGLWindow();
mutta pistin koko funktion siihen. Ja kuten näkyy se on suorakopio oppaasta josta sitä luin koska opin parhaiten (kokemusta on) niin että saan jonkun lähdepohjan toimimaan jota muokkailen ja haluan tämän toimimaan.
int InitGL(GLvoid) // All Setup For OpenGL Goes Here { if (!LoadGLTextures()) // Jump To Texture Loading Routine { return FALSE; // If Texture Didn't Load Return FALSE } glEnable(GL_TEXTURE_2D); // Enable Texture Mapping glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Set The Blending Function For Translucency glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black glClearDepth(1.0); // Enables Clearing Of The Depth Buffer glDepthFunc(GL_LESS); // The Type Of Depth Test To Do glEnable(GL_DEPTH_TEST); // Enables Depth Testing glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations SetupWorld(); return TRUE; // Initialization Went OK }
Postaamassasi koodissa ei näy kohtaa, jossa 'GLvoid KillGLWindow(<type error>)' -funktiota kutsutaan, joten emme voi auttaa. Etsipä ensin tuo kohta :)
Hups. anteeksi pieni ajatuskatkos :D
GLvoid KillGLWindow(GLvoid) // Properly Kill The Window { if (fullscreen) // Are We In Fullscreen Mode? { ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop ShowCursor(TRUE); // Show Mouse Pointer } if (hRC) // Do We Have A Rendering Context? { if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts? { MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC? { MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } hRC=NULL; // Set RC To NULL } if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC { MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hDC=NULL; // Set DC To NULL } if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window? { MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hWnd=NULL; // Set hWnd To NULL } if (!UnregisterClass("OpenGL",hInstance)) // Are We Able To Unregister Class { MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hInstance=NULL; // Set hInstance To NULL } }
Juu, tässä on nyt siis itse funktio. Virhe johtuu siitä, että funktiota kutsuttaessa sille annetaan liian vähän parametreja (tässä tapauksessa ei yhtään, koska funktio vaatii yhden GLvoid-parametrin). Eli nyt pitäisi nähdä se kohta, jossa kyseistä funktiota kutsutaan. Se näyttänee tältä:
KillGLWindow ();
Sen tulisi varmaankin näyttää tältä:
KillGLWindow (GLvoid);
Edit: Ko. funktiokutsu on siis saamasi virheviestin perusteella tiedostossa main.cpp rivillä 262.
Mahtaako minulta puuttua jotain? Nimittäin sain 50 erroria. Laitan muutaman errorin tähän jos niistä käy selväksi että jotain puuttuu.
main.cpp:138: undefined reference to `glGenTextures@8'
main.cpp:141: undefined reference to `glBindTexture@8'
main.cpp:142: undefined reference to `glTexParameteri@12'
main.cpp:143: undefined reference to `glTexParameteri@12'
main.cpp:144: undefined reference to `glTexImage2D@36'
main.cpp:147: undefined reference to `glBindTexture@8'
//Rivi 138: glGenTextures(3, &texture[0]); //rivi 141: glBindTexture(GL_TEXTURE_2D, texture[0]); //Rivi 142: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
Olen includettanut kyllä:
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
ja:
codebolock/MinGW/gl/
kansiosta löytyy kyseiset tiedostot.
Edelleen, jos sinulta puuttuu funktio kutsusta parametreja -> ei toimi.
Et ole linkannut tarpeellisia kirjastoja -opengl32(?)
Ihan alkeita taas. Kääntäjä kertoo virheilmoituksilla missä mättää. Tässä tapauksessa kysyjän korvien välissä.
En sano yhtyväni ylläolevaan viestiin, mutta suosittelen opettelemaan ja sisäistämään C ja/tai C++ perusteet ja sitten alkaa vasta katella muita juttuja :)
No tarkistin GLAUX.h tiedoston jossa kyseinen funktio esitellään, että onko parametrit väärin, mutta ymmärtääkseni ei ole?
Tässä suoraan GLAUX.h tiedostosta otettu kohta yhteen funktioista liittyvään asiaan.
AUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR); AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR);
Tässä itse ohjelmasta miten sitä käytetään:
return auxDIBImageLoadA(Filename); // Tässä on ainoastaan yksi 50 errori rivistä. //Tässä vielä funktio jossa kyseinen koodi on: AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image { FILE *File=NULL; // File Handle if (!Filename) // Make Sure A Filename Was Given { return NULL; // If Not Return NULL } File=fopen(Filename,"r"); // Check To See If The File Exists if (File) // Does The File Exist? { fclose(File); // Close The Handle return auxDIBImageLoadA(Filename); // Load The Bitmap And Return A Pointer } return NULL; // If Load Failed Return NULL }
Ja funktiota haetaan:
if (TextureImage[0]=LoadBMP("Data/tekstuuri.bmp")) //Ja tässä vielä funktio jossa tuo on: int LoadGLTextures() // Load Bitmaps And Convert To Textures { int Status=FALSE; // Status Indicator AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit if (TextureImage[0]=LoadBMP("Data/Mud.bmp")) { Status=TRUE; // Set The Status To TRUE glGenTextures(3, &texture[0]); // Create Three Textures // Create Nearest Filtered Texture glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); // Create Linear Filtered Texture glBindTexture(GL_TEXTURE_2D, texture[1]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); // Create MipMapped Texture glBindTexture(GL_TEXTURE_2D, texture[2]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } if (TextureImage[0]) // If Texture Exists { if (TextureImage[0]->data) // If Texture Image Exists { free(TextureImage[0]->data); // Free The Texture Image Memory } free(TextureImage[0]); // Free The Image Structure } return Status; // Return The Status }
Keskustelun kulusta päätellen toisi kai enemmän informaatiota jos copy-pasteaisit myös kaikki kääntäjälle antamasi parametrit.
main.cpp:138: undefined reference to `glGenTextures@8'
Tuo virhe kai edelleen tarkoittaa ettei kääntäjä löydä koko funktiota mistään tiedostosta mitä olet sille antanut.
Ja muuten vaan... en ymmärrä miksi luot 3 versiota yhdestä tekstuurista. Jos aiot käyttää linear ja mipmap, sinulle riittää ladata vain se.
Parametrithän näkyvät tuossa.
esim:
glGenTextures(3, &texture[0]); // siinä on kolme ja texture[0]
eli minulta mitä ilmeisemmin puuttuu jotain jos kyseistä funktiota ei löydy kääntäjältä? Onko jotain pakettia netissä josta saa kaikki openGL liittyvät jutut? Itse en ole vielä löytänyt. Eli .dll kirjastot .libit yms. Ilmeisesti CodeBlocksissa ei ole valmiina näitä kaikkia vaikkakin OpenGL on mahdollista aloittaa projektina.
Linkkaa opengl32.lib mukaan (-lopengl32)
Aihe on jo aika vanha, joten et voi enää vastata siihen.