2011-07-14 2 views
3

私はOpenGLを学び始め、頂点バッファオブジェクトを使って回転キューブを作成しました。しかし、コードをコンパイルすると、gccは次の警告を発行します。次のgcc警告を修正するにはどうすればよいですか?

|| sdlogl.c: In function ‘initGL’: 
sdlogl.c|48| warning: implicit declaration of function ‘glGenBuffers’ 
sdlogl.c|50| warning: implicit declaration of function ‘glBindBuffer’ 
sdlogl.c|51| warning: implicit declaration of function ‘glBufferData’ 

これらの警告を修正するにはどうすればよいですか?

これは私のコードです。また

#include <SDL/SDL.h> 
#include <SDL/SDL_opengl.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glext.h> 

SDL_Surface *surface; 
float rquad=0.0f; 
GLuint vertexBuffer,colorBuffer; 

float vert[]={ 
    1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, 
    1,-1, 1, 1,-1,-1, -1,-1,-1, -1,-1, 1, 
    1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, 
    -1, 1, 1, -1,-1, 1, -1,-1,-1, -1, 1,-1, 
    1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, 
    1, 1,-1, -1, 1,-1, -1,-1,-1, 1,-1,-1 
}; 
float colors[]={ 
    1,0,0, 1,0,0, 1,0,0, 1,0,0, 
    0,1,0, 0,1,0, 0,1,0, 0,1,0, 
    0,0,1, 0,0,1, 0,0,1, 0,0,1, 
    1,1,0, 1,1,0, 1,1,0, 1,1,0, 
    1,0,1, 1,0,1, 1,0,1, 1,0,1, 
    0,1,1, 0,1,1, 0,1,1, 0,1,1 
}; 

Uint32 timerfunc(Uint32 interval,void* param){ 
    rquad+=0.8f; 
    return interval; 
} 

void initGL(){ 

    glViewport(0,0,640,480); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45,640.0/480.0,0.1,100); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glShadeModel(GL_SMOOTH); 
    glClearColor(0,0,0,0); 
    glClearDepth(1); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 

    glGenBuffers(1,&vertexBuffer); 
    glGenBuffers(1,&colorBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER,72*sizeof(float),vert, 
      GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER,colorBuffer); 
    glBufferData(GL_ARRAY_BUFFER,72*sizeof(float),colors, 
      GL_STATIC_DRAW); 
} 

void drawGLScene(){ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0,0,-6); 
    glRotatef(rquad,1,1,0.5); 

    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer); 
    glVertexPointer(3,GL_FLOAT,0,0); 
    glBindBuffer(GL_ARRAY_BUFFER,colorBuffer); 
    glColorPointer(3,GL_FLOAT,0,0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glDrawArrays(GL_QUADS,0,24); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER,0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 

    SDL_GL_SwapBuffers(); 
} 

int main(int argc, char** argv){ 
    int videoFlags=0; 
    videoFlags|=SDL_OPENGL; 
    videoFlags|=SDL_GL_DOUBLEBUFFER; 
    videoFlags|=SDL_HWPALETTE; 
    videoFlags|=SDL_HWSURFACE; 
    videoFlags|=SDL_HWACCEL; 

    int done=0; 
    SDL_Event event; 
    const SDL_VideoInfo* videoInfo; 

    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); 
    videoInfo=SDL_GetVideoInfo(); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); 

    SDL_WM_SetCaption("Hello OpenGL!",NULL); 
    surface=SDL_SetVideoMode(640,480,32,videoFlags); 

    initGL(); 
    SDL_AddTimer(10,timerfunc,NULL); 
    while(!done){ 
     while(SDL_PollEvent(&event)){ 
      if(event.type==SDL_QUIT){ 
       done=1; 
      } 
     } 
     drawGLScene(); 
    } 
    SDL_Quit(); 
    return 0; 
} 

、私は、次のコマンドを使用して、私のコードをコンパイル:gcc sdlogl.c -g -Wall -lSDL -lGL -lGLU

答えて

4

上記の関数のプロトタイプが正しく宣言されておらず、コンパイラがデフォルトのC関数シグネチャint()を想定しているという警告が表示されます。

glext.hを含めても(さまざまな理由で)宣言はできませんが、それらの識別子を自分で紹介するための適切なtypedefがあります。それは時間が経つにつれて面倒になる。そのため、ラッパーライブラリが実装されています。私はGLEWまたはGLEEを勧めます。 GLEEを使用すると、GL/gl.hの代わりにGL/glee.hが含まれます。

+0

私はGLEEがGLEWほど積極的に維持されていなかったという印象を受けました。これは間違っていますか?また、GLEWを使用すると、も含まれていますが、そうではありませんか? – ssell

+0

@ssell:GLEWは、作成された描画コンテキストごとにglewInit()を使って初期化する必要があります。 3Dエンジンでは独自の拡張ラッパーを使用しているため、GLEWとGLEEの両方のメンテナンス状況は実際には最新の状態ではありません。具体的には、OpenGLがOpenGLを検出することができるように、OpenGL32.dllまたはlibGL.soをLoadLibrary/dlopenで動的にロードします。またX11では、このコードはlibGL.soが接続されたDISPLAYと一致するかどうかをチェックし、一致しなければ警告を発行します。拡張ラッパーはこれのほんの一部です。 – datenwolf

+0

ああ、私は各コ​​ンテキストに対してglewInit()を呼び出すことを忘れていました。 – ssell

3

これらの拡張機能は、glXGetProcAddressを使用するか、GLEW(簡単に)を使用してロードする必要があります。そうしないとプログラムがクラッシュすることを警告しなければなりません。

関連する問題