table of contents
other versions
- wheezy 4.1.0.20011224-6
GLXINTRO() | GLXINTRO() |
名前¶
glXIntro - X ウィンドウシステムで OpenGL を使う方法の解説概要¶
OpenGL(他のページでは GL と呼ぶ)は、高性能な 3 次元指向レンダラである。 OpenGL は GLX 機能拡張を通じて X ウィンドウシステムで利用することがで きる。 X サーバが GLX 機能拡張をサポートしているかどうかを確かめる場合や、 サポートしている場合にそのバージョンを確かめるには、 glXQueryExtension と glXQueryVersion を用いること。 GLX 機能拡張に対応したサーバは、OpenGL のレンダリングに使うことができ るビジュアルを、全体のビジュアルのサブセットとして生成する。 このようなビジュアルを使って生成されたドロウアブルは、コアの X レンダラ を使ってレンダリングすることや、コアの X ビジュアル全てと互換である任 意の機能拡張のレンダラを使ってレンダリングすることができる。 GLX は、標準のカラーバッファ以外にいくつかのバッファを追加してドロウア ブルを拡張する。 これらのバッファには、背面カラーバッファや補助カラーバッファ、 デプスバッファ、 ステンシルバッファ、 カラーアキュームレーションバッファが含まれる。 これらの一部あるいは全ては、OpenGL をサポートしているそれぞれの X ビジュ アルに含まれる。 OpenGL を用いて X のドロウアブルをレンダリングするにはまず、必要とされ る OpenGL バッファを定義するビジュアルを選択しなければならない。 glXChooseVisual を使うと、条件に合うビジュアルの選択を簡単に行う ことができる。 選択処理をもっと細かく制御する必要があれば、 XGetVisualInfo と glXGetConfig を用いて、利用可能な全ての ビジュアルの中から選択を行うこと。 GLX コンテクストと X のドロウアブルのどちらを作るにも、選択したビジュ アルを使うこと。 GLX コンテクストは glXCreateContext を使って生成し、ドロウアブル は XCreateWindow か glXCreateGLXPixmap を使って生成する。 最後に、 glXMakeCurrent を使ってコンテクストとドロウアブルを関連 付けること。 このコンテクストとドロウアブルのペアは現在のコンテクストと現在の ドロウアブルになり、他の引き数を指定して glXMakeCurrent を呼び出 すまでは、全ての OpenGL のコマンドはこれを用いる。 コアの X コマンドを使っても、OpenGL のコマンドを使っても現在のドロウアブル を操作することができる。 しかし、X と OpenGL のコマンドストリームは同期していない( glXWaitGL, glXWaitX, XSync, glFlush を呼び出し て両者の境界を明示的に生成した場合は除く)。例¶
以下に示すのは、RGBA 形式であり OpenGL と互換な X のウィンドウを生成し、 これを黄色でクリアするための最小限のコードである。 これは正しいコードであるが、エラーチェックは全く入っていない。 本来は返り値の dpy, vi, cx, cmap, win は 全てチェックすべきである。 #include <GL/glx.h> #include <GL/gl.h> #include <unistd.h>return (e->type == MapNotify) && (e->xmap.window == (Window)arg); }
Display *dpy;
XVisualInfo *vi;
Colormap cmap;
XSetWindowAttributes swa;
Window win;
GLXContext cx;
XEvent event;
int swap_flag = FALSE;
dpy = XOpenDisplay(0);
vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeListSgl);
if (vi == NULL) {
vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeListDbl);
swap_flag = TRUE;
}
cx = glXCreateContext(dpy, vi, 0, GL_TRUE);
cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
swa.colormap = cmap;
swa.border_pixel = 0;
swa.event_mask = StructureNotifyMask;
win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 100, 100,
0, vi->depth, InputOutput, vi->visual,
CWBorderPixel|CWColormap|CWEventMask, &swa);
XMapWindow(dpy, win);
XIfEvent(dpy, &event, WaitForNotify, (char*)win);
glXMakeCurrent(dpy, win, cx);
glClearColor(1,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
if (swap_flag) glXSwapBuffers(dpy,win);
sleep(10); }