前回はとりあえずウィンドウを表示してみたが、今回は真面目にOpenGLについて勉強。
まずは公式サイトを見てみる。
OpenGLの公式サイトはこちら
公式サイトのGetting Started 〜を見てみる。
主要なOSにはOpenGLが既に入っているが、ドライバーは最新に〜という内容が書かれてあるっぽい。
以下それぞれのプラットフォーム毎の説明
・Linux
Linuxのグラフィックスはほぼ "X Window”だ。LinuxでOpenGLをサポートするという事は
X WindowのGLX拡張を使用する事になる。
Direct Rendering Infrastructure(DRI)は簡単にハードウェアアクセラレーションを使える
ドライバーのフレームワーク。
DRIはXFree86の4.0からのサポートされているが、現在はXFree86からXorgが
主流となっている。
コンパイル時にはOpenGLのライブラリをリンクする為に「-lGL」を指定する必要がある。
・Windows
コンパイルする際は「OpenGL32.lib」をリンクする必要がある。
実際のプログラミング
1. 初期化
各プラットフォールで異なった書き方で初期化する必要がある。
初期化には2つのフェースがある。
1) OpenGL Context の作成
2) OpenGLを使用する為に必要な機能をロード
GLXContext glXCreateContext( | Display * | dpy, |
XVisualInfo * | vis, | |
GLXContext | shareList, | |
Bool | direct) ; |
上記関数を使用しContextを作成。
以下簡単なウィンドウ表示サンプル
// -- Written in C -- // #include<stdio.h> #include<stdlib.h> #include<X11/X.h> #include<X11/Xlib.h> #include<GL/gl.h> #include<GL/glx.h> #include<GL/glu.h> Display *dpy; Window root; GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; XVisualInfo *vi; Colormap cmap; XSetWindowAttributes swa; Window win; GLXContext glc; XWindowAttributes gwa; XEvent xev; void DrawAQuad() { glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1., 1., -1., 1., 1., 20.); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.); glBegin(GL_QUADS); glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.); glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.); glColor3f(0., 0., 1.); glVertex3f( .75, .75, 0.); glColor3f(1., 1., 0.); glVertex3f(-.75, .75, 0.); glEnd(); } int main(int argc, char *argv[]) { dpy = XOpenDisplay(NULL); if(dpy == NULL) { printf("\n\tcannot connect to X server\n\n"); exit(0); } root = DefaultRootWindow(dpy); vi = glXChooseVisual(dpy, 0, att); if(vi == NULL) { printf("\n\tno appropriate visual found\n\n"); exit(0); } else { printf("\n\tvisual %p selected\n", (void *)vi->visualid); /* %p creates hexadecimal output like in glxinfo */ } cmap = XCreateColormap(dpy, root, vi->visual, AllocNone); swa.colormap = cmap; swa.event_mask = ExposureMask | KeyPressMask; win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa); XMapWindow(dpy, win); XStoreName(dpy, win, "VERY SIMPLE APPLICATION"); glc = glXCreateContext(dpy, vi, NULL, GL_TRUE); glXMakeCurrent(dpy, win, glc); glEnable(GL_DEPTH_TEST); while(1) { XNextEvent(dpy, &xev); if(xev.type == Expose) { XGetWindowAttributes(dpy, win, &gwa); glViewport(0, 0, gwa.width, gwa.height); DrawAQuad(); glXSwapBuffers(dpy, win); } else if(xev.type == KeyPress) { glXMakeCurrent(dpy, None, NULL); glXDestroyContext(dpy, glc); XDestroyWindow(dpy, win); XCloseDisplay(dpy); exit(0); } } /* this closes while(1) { */ } /* this is the } which closes int main(int argc, char *argv[]) { */
コンパイル
gcc -o test test.c -lX11 -lGL -lGLU実行すると以下のグラフィックが表示される。
0 件のコメント:
コメントを投稿