2. はじめに

2.005  3Dグラフィックスの情報をどこで見つけることができますか?

comp.graphics.algorithms FAQはOpenGLに特有ではない3Dグラフィックス情報を含んでいます。

一般OpenGLと3Dグラフィックス情報のために、高度グラフィックスプログラミングテクニック使用OpenGLは情報のよいオンラインソースです。

優秀な一般的なコンピュータ・グラフィックステキストはコンピュータ・グラフィックスです: 原則と実行、ジェームズフォーリーなどによる第2版 ISBN 0-201-12110-7。 しかし、この本は、それを販売用に持つために、印刷を離れているかもしれません いくつかのオンラインの本小売店まだ思われ 。 amazon.comを試してください。 2001年1月にリリースのために計画された3番目の版があるかもしれません

基本的なベクトル、行列、および四つ一組操作を実行するためのDelphiコードは、ここで見つけられえます

ここにはリニアの代数学ソースコードのための別のソースがあります

2.010  どこで例、チュートリアル、ドキュメントや他の OpenGL 情報を見つけることができますか?

OpenGLは、日付に、最も広く文書化された3DグラフィックスAPIです。 情報はウェブと印刷の至る所であります。 OpenGL情報のすべてのソースを徹底的にリストすることが不可能です。 従って、このFAQは、他のOpenGLサイトへの多くのリンクを管理する情報とサイトの大きい倉庫へのリンクを提供します。

OpenGL組織Webページ

SGIのOpenGLウェブサイトおよび(見たところ)SGIの他のOpenGLウェブサイト

HP OpenGL主題インデックス 。

OpenGL基本FAQ

OpenGLゲーム開発者のFAQ。 OpenGLについての情報だけでなく、OpenGLゲーム開発者のFAQは、OpenGLゲーム開発者のメーリングリストに申し込むことについての情報を持っています。

EFnet #OpenGL FAQ

サミュエルPaikは、マイクロソフトウェブサイトについてのOpenGL情報にリンクの大きい宝庫を作成しました。

OpenGLorgウェブサイトは現在のOpenGL指定およびマニュアルのページを持っています。 OpenGLスペックv1.1をWebページとオンラインでみなすことができます。

いくつかのプラットフォームのためのOpenGLインプリメンテーションの宝庫

GLUTソースコード配布はいくつかの有益なOpenGL例とデモを含んでいます

Codeguruは小ささを管理するけれども、成長することは有益なOpenGLサンプルコードでリストしました。

http://www.wischik.com/lu/programmer/wingl.htmlのルシアンWischikのWebページは、マイクロソフトWindows OpenGLについての優秀な情報を3dfxハードウェアで特に含んでいます。

NeHe Webページは、他のサイトおよび多くの有益なチュートリアルへの多くのリンクを持っています。 多くの人々はこのサイトが有益なのを発見しました。

Win32OpenGLプログラミングについての情報のためのブレーンホッジのWebページを見てください

インタラクティブなOpenGLチュートリアルはここで見つけられえます

OpenGLチュートリアルと記事についてgamedev.netをチェックしてください

2.020  どんなOpenGL本が入手可能ですか?

OpenGLにいくつかの本があるけれども、最も尊敬された2は、「赤い」および「青色の」本です:

OpenGLプログラミングガイド、第3版、メーソン求婚
ISBN 0-201-60458-2(別名赤い本)

OpenGL参照マニュアル、第3版、デイブなどShreiner(エディタ
ISBN 0-201-65765-1(別名青い本)

これらの本の3番目の版は、OpenGL1.2を説明します。 オリジナルと再版は、1.0と1.1をそれぞれ説明します。

OpenGL赤本はオンラインです

ここのOpenGL参照マニュアルのために、2つのソースです:

HPウェブブラウズ可能なOpenGL参照マニュアル、第2版(OpenGL1.1のために)。
OpenGL参照マニュアルと同様なマニュアルのページ

赤と青い本だけでなく、Xウィンドウのための緑色の本で見てください プログラミングするおよび マイクロソフトWindowsプログラミングのための白書 。 www.opengl.orgを訪問してOpenGL本のより徹底的なリストにウェブサイトを得させることができます。

2.030  どんな OpenGL チャットルームとニュースグループが利用できますか?

ユーズネットニュースグループ〈OpenGLプログラミングに捧げられた〉はcomp.graphics.api.openglです。

#OpenGL IRCチャンネルはOpenGL議論に捧げられます。

2.040  ソースコードのある OpenGL 実装にはどのようなものがありますか?

岩石台地ライブラリはOpenGL相似物です。 それは同一のインタフェースをOpenGLに持っています。 それが「OpenGL」と呼ばれえない唯一の理由は、その創造者がOpenGL ARBからライセンスを購入しなかったからです。

OpenGLサンプルインプリメンテーションはまた入手可能です。

2.050  OpenGL を利用するにはどんなコンパイラが使用できますか?

OpenGLプログラムは一般に、CとC++によって書かれます。 OpenGLのプログラムを作ることができます Delphi(1パスカル似の言語)、基本的な, Fortran、エイダ、および他 。

Borland

BorlandコンパイラによってOpenGLをプログラミングすることは同じです 1つの例外を持つどのような他のコンパイラとでも : OpenGLアプリはランタイムでフローティングポイント例外を引き起こすかもしれません。 これらの無害なエラーを使用不可にするためには、OpenGL機能を呼ぶ前に、以下をアプリに追加してください:

_control87(MCW_EM、MCW_EM);

Borlandユーザーは、4.0バージョンがボックスの外のOpenGL1.0をサポートすることにだけ気づいている必要があります。 それが入手可能になる時には、OpenGL v1.1、またはv1.2を使うために、マイクロソフトからOpenGL SDKをダウンロードしてください。

Borland-対応を生成するために、Borlandのimplibユーティリティを使用してください。 LIB輸出ライブラリ から マイクロソフト対応である 。 DLLライブラリ。 もしマイクロソフトフォーマットによってaccidentlyにリンクするならば。 LIBファイル、あなたは、以下のようなリンカエラーを受け取ります:

C:\BORLAND\BCC55\LIB\GLUT32。 LIB'はinvalis OMFレコード、タイプ0x21を含んでいます
(ことによるとCOOF)

bornews.borland.comユーズネットニュースサーバーは、グラフィックスに付随している2ニュースグループを持っています: borland.public.delphi.graphicsとborland.public.cppbuilder.graphics。

Borlandコミュニティは、Borlandコンパイラ問題に対処するFAQのオンラインのソースです。

どのようにBorland C++ビルダーの商業用のバージョンを通してOpenGLを使うかの情報のために、スコットHeimanのWebページを訪問してください。 自由なバージョンについての情報のために、ここに行ってください

ジョンジェイコブズによるOpenGLへのDelphi開発者のガイドが入手可能な本。 作者はこの本のためのWebページを管理します

ここで、DelphiからOpenGLを使うことについての情報が見つけられうることとDelphi3D Webページで。 Delphiを通してOpenGLを使うためのコードとユーティリティは入手可能です

Visual Basic

ここには、どのようにVisual Basicを通じてOpenGLを使うかの情報を持つ3つのサイトがあります:

http://www.softoholic.bc.ca/opengl/down.htm
http://www.weihenstephan.de/~syring/ActiveX/
http://www.ieighty.net/~davepamn/colorcube.html

2.060  OpenGLプログラムをコンパイルして、実行するために何を必要としますか?

以下はC/C++用法に特にあてはまります。

OpenGLプログラムをコンパイルし、リンクするために、OpenGLヘッダーファイルとライブラリが必要です。 OpenGLプログラムあなたを実行するのには、機器に特有な共有されたまたは動的にロードされたOpenGLライブラリ、またはベンダ具体的なOpenGLインストール可能クライアントドライバー(ICD)が必要であるかもしれません。 また、GLUとGLUTライブラリのための包括ファイルとライブラリが必要であるかもしれません。 これらのファイルを得て、ライブラリが、どのOpenGLシステムプラットフォームを使っているかに依拠する所。

OpenGL組織はOpenGL開発者とエンドユーザーファイルにリンクのリストを管理します。 そこから必要なもののほとんどをダウンロードできます。

マイクロソフトWindows9x、NT、および2000の下で:

もしVisual C++を使っているならば、.libは、それによってリンクするためにファイルするだけでなく、編者はOpenGLとGLUのための包括ファイルによって来ます。

GLUTのために、これらのファイルをダウンロードしてください。 glut.hをコンパイラにインストールしてください ディレクトリ、コンパイラのlibディレクトリのglut32.lib、およびglut32.dllを、Windowsシステムディレクトリに含めている (Windows9xのためのc:\windows\system、またはWindowsNT/2000のためのc:\winnt\system32)。

要約において、完全にインストールされたWindows OpenGL開発環境はこれのように見えます:

ファイル 位置
gl.h
glut.h
glu.h
[コンパイラ]\include\gl
Opengl32.lib
glut32.lib
glu32.lib
[コンパイラ]\lib
Opengl32.dll
glut32.dll
glu32.dll
[システム]

[コンパイラ]がコンパイラディレクトリ(c:\Program Files\Microsoft Visual Studio\VC98などの)であり、[システム]がWindows9x/NT/2000システムディレクトリである所(c:\winnt\system32やc:\windows\systemなど)。

もしOpenGLを加速するハードウェアプラットフォームにいるならば、機器のためのICDをインストールする必要があるでしょう。 これはハードウェアで出荷したかもしれないか、またはハードウェアベンダのWebページからそれをダウンロードできます。 ベンダは置換または付加もgl.hに提供できて、それは定義と宣言をベンダ具体的なOpenGL拡張に提供します。 詳細については、このFAQにおいて拡張セクションを見てください。

もしopengl.libやglut.libなどのファイルを見るならば、これらは、マイクロソフトWindowsのためのSGIの未サポートであったライブラリです。 それらは使われるべきではありません。 ハードウェア加速を使うために、マイクロソフトライブラリは推奨されます。 SGIライブラリについてのより多くの情報は、ここで見つけられえます。 いつも、すべてのマイクロソフトライブラリ(例えば、glu32.lib、glut32.lib、opengl32.lib)またはすべてのSGIライブラリによってリンクしてください(例えば、glu.lib、glut.lib、およびopengl.lib)。 マイクロソフトlibariresとSGIライブラリの結合を使うことができません。 しかし、ライブラリの両方のセットを同じシステムにインストールできます。 もしSGIの.libファイルを使うならば、システムフォルダにインストールされた対応した.dllファイルが必要でしょう。 (すなわち、opengl.libに対してリンクするのには、ランタイムでopengl.dllがインストールされることが必要です)。

コンパイラに、OpenGL、GLU、およびGLUTライブラリによってリンクするのを指示する必要があります。 Visual C++6.0において、プロジェクトメニューの設定ダイアログボックスによってこれを遂行できます。 リンクタブにスクロールしてください。 オブジェクト/ライブラリモジュール編集ボックスにおいて、glut32.lib、glu32.lib、およびopengl32.libを、存在するどのようなテキストの終わりにでも追加してください。

UNIXまたはUNIX似のオペレーティングシステムのために:

もし標準の位置で使うために必要なヘッダーファイルとライブラリを見つけないならばコンパイラとリンカをそれらの位置に適切-私で向ける必要があることと-Lオプション。 リンクするライブラリは、リンク時間で-lオプションで指定されなければなりません; -lglut-lGLU-lGL-lXmu-lX11は典型的です。

もしGLUTを使いたいならば、それをダウンロードする必要があります。 もし前コンパイルされたバイナリを見つけることができないならば、ソースをダウンロードし、それをコンパイルしたいでしょう。 GLUTは多くのプラットフォームを容易に基にし、どのように、作りつけることをするかを説明して多くのREADMEファイルによって来ます。 GLUTコンパイラはimakeユーティリティを使い、それは、それを、新しいプラットフォームのGLUTを建てることが容易にします。

Linux、Macintosh、および他のシステムのために:

岩石台地は、多くのプラットフォームで入手可能な自由なOpenGL似のライブラリです。 具体的なプラットフォームのためのOpenGLについての情報のためのOpenGL組織のWebページで開発者セクションもチェックしてさしつかえありません。

2.070   なぜコンパイル、リンク時または実行時にエラーになるのか解りません。

ほとんどがどちらからでもエラーステムをコンパイルすることと接続すること 正しくインストールされたOpenGL開発環境を持たないシステム 、またはどこで包括とライブラリファイルを見つけるかをコンパイラに知らせることの失敗。

もしWindows9x/NT/2000環境においてこれらの問題に遭遇しているならば、すべてのファイルをそれらの正しい位置にインストールし、リンカに、.libファイルを見つけるのを正しく指示したことを保証するために、上で問題2.060を読んでください。

また、#includeを置く必要があることに注意してください #includeの前の<windows.h>ステートメント <GL/gl.h> 。 マイクロソフトは、システム 具体的な呼出し会議を使うDLL を必要としますそれはほとんどのWin32Cコンパイラのためのデフォルト呼び出し会議ではありません。従って、それらは、標準外のCシンタックスに拡大するいくつかのマクロによってgl.hのOpenGL呼び出しを解説しました。 これはマイクロソフトのCコンパイラにシステム呼び出し会議を使わせます。 windows.hに含まれる包括ファイルのうちの1つは、マクロを定義します。

Win32開発者のための別の警告: マイクロソフトVisual C++(そしてたぶん ほとんどの他のWin32Cコンパイラ )によって、標準のWin32アプリケーションエントリポイントが、4つのパラメータを持つWinMainであること、メインより(int argc、雑用**argv)。 Visual C++は、構文解析されたコマンドラインで標準のWin32アプリケーション入力、および呼び出しメインを構文解析するためにコードを含む選択肢を持っています; これはWin32アプリケーションの代わりにコンソールアプリケーションと呼ばれます。 もしネットからコードをダウンロードし、それを築こうとするならば、アプリケーション、コンソール、またはWin32の右の種類を築くためにコンパイラを設定したことを確かめてください。 これはリンカオプションまたはpragmasによってコントロールできます。 マイクロソフトVisual C++は、エントリポイントとアプリケーションタイプをコントロールするための以下のpragmasをサポートします:

以下の//使用1:
#pragmaコメント(リンカ、「/入力:mainCRTStartup」)#pragma以下のコメント(リンカ
、「/入力:wmainCRTStartup」)#pragmaコメント(リンカ、「/入力:WinMainCRTStartup
」)#pragmaコメント(リンカ、「/ENTRY:wWinMainCRTStartup」)//使用1:
#pragmaコメント(リンカ、「/サブシステム:Windows」)#pragmaコメント(リンカ、「/
サブシステム:コンソール」)

以下は、エラーおよびそれらの可能な原因と解決策のテーブルです。 それはマイクロソフトVisual C++ユーザーにターゲットとされるけれども、エラーのタイプは一般にどのようなプラットフォームにでもあてはまるかもしれません。

例エラーテキスト 可能な原因と解決
d:\c++\file.c(20): 警告C4013: 不確定な『glutDestroyWindow』; ならば 外部のリターンint 
d:\c++\file.c(71): 警告C4013: 不確定な『glMatrixMode』; ならば 外部のリターンint 
d:\c++\file.c(71): エラーC2065: 『GL_MODELVIEW』: 申告していない識別子
しませんでした #include gl.h、glu.h、またはglut.h 

GLUTソースファイルはするべきです:
#include<GL/glut.h>
Non-GLUTソースファイルはするべきです:
#include<GL/glu.h>
#include<GL/gl.h>

c:\program files\micro softビジュアルstudio\vc98\include\gl\gl.h(1152): エラーC2054: 予期される'WINGDIAPI'に続いている『(』
c:\program files\micro softビジュアルstudio\vc98\include\gl\gl.h(1152): エラーC2085: 『APIENTRY』: フォーマルなパラメータリストのnot
しなかった #include windows.h か、またはgl.hの後にそれを含みました。

ソースがその使用GLUTとMFCをファイルしないけれども、OpenGLに電話をかける するべきです:
#include<windows.h>
#include<GL/gl.h>

d:c++\file.c(231): 警告C4305: 『初期設定』: 『浮かぶ』'const2倍'からの切頭 浮動小数点定数(例えば1.0)は、2倍タイプするために、履行を怠ります。 これは、Visual C++において以下によって使用不可にできる無害な警告です:
#ifdef WIN32
#pragma警告身体障害: 4305)
#endif
ソースファイルのトップで。
file.obj: エラーLNK2001: 未決定である外部のシンボル__imp__glMatrixMode@4
file.obj: エラーLNK2001: 未決定である外部のシンボル__imp__glViewport@16
file.obj: エラーLNK2001: 未決定である外部のシンボル__imp__glLoadIdentity@0
opengl32.lib、glu32.lib、またはglut32.libによってリンクしなかったてください。

上のセクション2.060は、どのように.libファイルの位置をVisual C++6リンカに知らせるかを記述します。

ダイナミックリンクライブラリOPENGL.dllは、指定されたパスに発見されるはずがありません。。 .dllファイルを正しくインストールすることの失敗。 Windowsシステムのためにこれらのファイルがインストールされるべき所の情報のために上でセクション2.060を見てください。
何もまさにブランクのウィンドウ与えません。 マイクロソフトとSGIからの.libファイルに対する混ぜられたリンクは、これを起こすかもしれません。 リンカに、glut32.lib、glu32.lib opengl32.libまたはglut.lib、glu.lib、およびopengl.libを指定することを確かめてください。notで、これらの2のファイルからのファイルのコンバインがセットします。
LIBCD.lib(wincrt0.obj): エラーLNK2001: 未決定である外部のシンボル_WinMain@16
デバッグ/test.exe: 致命的エラ?LNK1120: 1のためexternalsが未解決でした
エラー実行link.exe。
方法GLUTによるcomp.graphics.api.openglのFAQは、マイクロソフトWindowsを それ自体と明確のOpenGL不問題 差し込みます。

コンパイラに、コンソールアプリケーションを構築するのを指示するべきです。 それはWin32エントリポイントを見つけようとしているけれども、コードはWin32アプリケーションとして書かれませんでした。

複数のアクセス違反は、マイクロソフトOpenGL MFC-ベースアプリケーションを実行する時に出現します。 CS_OWNDCスタイルを前作成に設定してください 眺めクラスの*()ルーチン 。
フローティングポイント例外はランタイムで起こります。 アプリケーションはBorland Cで組み立てられました。 どのようなOpenGL機能でも呼ぶ前に、以下をアプリに追加してください:

_control87(MCW_EM、MCW_EM);

これはBorlandの自身のFAQ記事#17197からです。

2.080   どのようにウィンドウを初期化し、コンテキストなどを生成すれば良いですか?

それはwindowingシステムに依存します。 ここにはいくらかの基本的な情報〈より多くの詳細を除いた〉があります それにおいてプログラミングすることに捧げられた具体的なwindowingシステムまたはニュースグループのためのドキュメンテーションへの参照 。

十分な供給

深さバッファ、およびOpenGL文脈によってRGBウィンドウを作成するための基本的なコードは次の通りです:

#include<GL/glut.h>

intメイン(int argc、char** argv)
{
    glutInit(&argc、argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH);
    (500500)をglutInitWindowSizeしてください;
    glutInitWindowPosition(0と0);
    glutCreateWindow(「簡単です」);

    /*… */}

ウィンドウサイズを設定し、置く呼び出しはオプションで、もしそれらが除外されるならば、GLUTはデフォルトサイズと位置を使います。

Xウィンドウ

以下のコードを使ってXウィンドウの深さバッファによってRGBウィンドウを作成できます(OpenGL参照マニュアルから取り去られます):

#include<GL/glx.h>
#include<GL/gl.h>

静的なBool WaitForNotify(ディスプレイ*d、XEvent *e、雑用*arg){
    帰り(e->type == MapNotify)の&&(e->xmap.window ==(ウィンドウ
    )arg);
}

静的なint sAttribList[]={
    GLX_RGBA 、
    GLX_RED_SIZE、1 、
    GLX_GREEN_SIZE、1 、
    GLX_BLUE_SIZE、1 、
    None };

intメイン(空所)
{
    *dpyを表示してください;
    XVisualInfo *vi;
    XSetWindowAttributes swa;
    ウィンドウ勝ち取り;
    GLXContext cx;
    XEventイベント;
    int swap_flag=GL_FALSE;

    dpy=XOpenDisplay(0);

    ならば((vi = glXChooseVisual(dpy、DefaultScreen(dpy)、sAttribList))==
    零) {fprintf(stderr "ERROR : 適当なビジュアルな!\n")を見つけ
    ることができません;
        リターン0;
    }

    cx = glXCreateContext(dpy、vi、0、GL_TRUE);

    swa.colormap=XCreateColormap(dpy、RootWindow(dpy、vi->screen)、vi->visual
    、AllocNone);
    swa.border_pixel = 0;
    swa.event_mask=StructureNotifyMask;
    勝ってください =XCreateWindow(dpy、RootWindow(dpy、vi->screen)、0、0、100
    、100、および0、vi->depth、InputOutput 、
        vi->visual 、
        CWBorderPixel|CWColormap|CWEventMask、&swa);

    XMapWindow(dpy 勝つ );

    XIfEvent(dpy、&event WaitForNotify(雑用*)勝ち取り);

    glXMakeCurrent(dpy 勝つ 、cx);

    /*… */}

マイクロソフトWindows9x/NT/2000

ウィンドウは以下のビットORによって作成されなければなりません ウィンドウスタイルにした : WS_CLIPCHILDREN |WS_CLIPSIBLINGS。 CreateWindowが呼ばれる(典型的なWin32アプリにおいて)時に、またはPreCreateWindow機能の間に、これをしてください(MFCアプリにおいて)。

いったんウィンドウが作成されて(WM_CREATEメッセージが到着する時またはOnInitialUpdateコールバックにおいて)たら、ピクセルフォーマットを設定するために、以下のコードを用いて、文脈を作成し、それを、DCのために流通させてください。

//想定:
// HWND hWnd;

HDC hDC=GetDC(hWnd);
PIXELFORMATDESCRIPTOR pfd;

memset(&pfd、0、sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags=PFD_SUPPORT_OPENGL|PFD_DRAW_TO_WINDOW;
pfd.iPixelType=PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 32;
pfd.iLayerType=PFD_MAIN_PLANE;

int pixelFormat=ChoosePixelFormat(hDC、&pfd);
ならば(pixelFormat == 0)
    ここの//ハンドルエラー
}

BOOL誤り=SetPixelFormat(hDC、pixelFormat、&pfd);
ならば(!err)
    ここの//ハンドルエラー
}

hRC=wglCreateContext(hDC);
ならば(!hRC)
    ここの//ハンドルエラー
}

罪を犯してください =wglMakeCurrent (hDC、hRC);
ならば(!err)
    ここの//ハンドルエラー

その時文脈を流通させず、以下の呼び出しによってDCをリリースできます:

WglMakeCurrent(無効で、無効です);
ReleaseDC(hWnd、hDC);

2.090  フルスクリーンのウィンドウを作るにはどうしたら良いですか?

GLUT 3.7に先がけて、glutFullScreen(空所)に呼び出しを使ってフルスクリーンウィンドウを生成できます。 GLUT 3.7と後によって、より柔軟なインタフェースが追加されました。

glutGameModeString()によって、アプリケーションは、ピクセル深さだけでなく要求されたフルスクリーン幅および高さとリフレッシュレートを指定できます。 フォーム[幅]x[高さ]のASCII文字列によってそれを指定します:[深さ]@[ヘルツ]。 もしそれが入手可能ならば、アプリケーションは呼び出しによってglutEnterGameMode(空所)にこのモードを使うことができるでしょう。 ここには例があります:

glutInit(&argc、argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutGameModeStringします(「640x480:16@60」);
glutEnterGameMode();

また、OpenGLゲーム開発者のFAQにおいて「フルスクリーン表現」セクションを見てください。

2.100  OpenGLプログラムの一般的な形式は、どんなものですか?

かたいおよび速い規則が全然ありません。 以下の擬似コードは一般によいOpenGLフォームと認められます。

program_entrypoint
{
    どの 深さ またはピクセルフォーマットが //決定 使われるべきです。
    要求されたフォーマットを持つ//作成ウィンドウ。
    //作成文脈およびそれを、ウィンドウのため流通させます。
    初期のOpenGL状態の上の//セット。
    ウィンドウのためのコールバックルーチンの上のセットがリサイズすることとウィン
    ドウさわやかについての//。
}

handle_resize
{
    glViewport(…);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho glFrustum gluOrtho2D gluPerspectiveななど//セット投射変化
}

handle_refresh
{
    glClear(…);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAtまたは当量との//セット眺め変化

    される必要がある場面の個々のオブジェクト(i)のための//:
        //押し適切スタック例えばglPushMatrix、glPushAttrib。
        オブジェクト(i)に特有な//セットOpenGL状態。
        glTranslatef、glScalef、glRotatefおよび/または当量を使っているオブジェク
        ト(i)のための//セットモデル変化。
        // オブジェクト(i)のための問題コマンド 。
        //ポップ適切スタック、(例えば、glPopMatrix、glPopAttrib。)
    ループのための//終わり。

    // スワップバッファ 。
}

2.110  ウィンドウが空白です。どうしたらよいですか?

表現を予期している時には、多くのファクターはブランクのウィンドウを起こすかもしれません。 ブランクのウィンドウは、一般に3Dグラフィックス基礎の不十分な知識、基本的なOpenGLメカニズムの不十分な知識、または単にコードの誤りにより起こされます。

その上、多くのOpenGL本およびオンラインの資源があります。

続いているものはリストです 恐れられた「黒いウィンドウ症候群」、およびそれを固定するためにすることのより一般的な原因のうちのいくつか 。

{
    誤り =glGetError() をきらめかせてください;
    ならば(罪を犯してください != GL_NO_ERROR )DisplayErrorMessage() ;
}

疑わしいグループのOpenGLファンクションコールの後に、このコードブロックを置き、プリプロセッサー 製品において呼び出しが容易に取り除かれうると保証することについての, を利用してください コンパイルする (すなわち#ifdef DEBUG...#endif)。

glGetError()は、ランタイムで、誤ったファンクションコールを出したかどうかをわかるための唯一の方法です。 もしOpenGL機能がエラーを発生させるならば、OpenGLは、傷つける機能を処理しないでしょう。 これはしばしば間違った表現またはブランクのウィンドウの原因です。

同様に、zFarを切り取っている飛行機は問題であるかもしれず それがそれに置かれて例えば 10.0 、幾何学のうちのすべては10.0のユニットより目から遠い。

それは、通常、 始まる 簡単で、より複雑な変化に進むのに最も良い。 行くとチェックしてコード変化をゆっくり起こしてください。従って、誤りがどこから来たかをわかります。

もしglBegin()を呼ぶけれども、幾何学の後にglEnd()を呼ぶことに失敗するならば、保証されず、何でも与えます。 しかし、いったんglBegin()/glEnd()ペア内で呼ばれえない機能(例えばglFlush())を呼んだら、OpenGLエラーを見始めるべきです。 もしglEnd()を呼ぶけれども、glBegin()を呼ぶことに失敗するならば、glEnd()呼び出しはエラーを発生させるでしょう。 エラーをチェックすることはいつもよいアイデアです。

2.120  最初のフレームは正しく表示されます、しかしその後のフレームは不正確であるか、表示されません。もしくは空白の画面になります。どうしてでしょう?

故障のため、しばしば、これが、OpenGL行列コマンドが増加することに気がつかせられること、現在の行列のトップの上のロードより。

ほとんどのOpenGLプログラムは、呼び出しによってModelView行列をアイデンティティにglLoadIdentity()に設定してフレームをし始めます。 眺め変化は、その時そのアイデンティティ行列、例えば呼び出しに対してgluLookAt()に増加します。 多くの新しいプログラマーは、gluLookAt()呼び出しが自身を現在の行列に負わし、従って、glLoadIdentity()呼び出しによって行列を初期設定することに失敗すると想定します。 連続したフレームをこの方法に表現することは、連続したカメラ変化を、普通間違った表現を結果として生じるお互いにの上に増加させます。

2.130   AUX ライブラリとはどのようなものですか?

非常に重要です: AUXを使わないでください。 代わりに、GLUTを使ってください。

AUXライブラリは、小さいOpenGLデモンストレーションプログラムの作成を容易にするように、OpenGLのライフにおいて早く、SGIにより開発されました。 それは一般にサポートされず、維持されません。 AUXは 使ってOpenGLプログラムを開発することについて強く落胆します。 代わりに、GLUTを使ってください。 それはより柔軟で、強力で、様々なプラットフォームで入手可能です。

関連した情報のために、GLUTセクションおよびSGIのGLUT FAQを見てください。

2.140  {Open,Net,Free}BSD や Linux の OpenGL にはどのようなものがありますか?

Xウィンドウインプリメンテーション〈XFree86 4.0〉は、岩石台地またはOpenGLサンプルインプリメンテーションを使ってOpenGLへのサポートを含みます。 XFree86はXFree86ライセンスの下でリリースされます。 http://www.xfree86.org/

SGIはオープンソースとしてOpenGLサンプルインプリメンテーションをリリースしました。 それはXサーバーGLXインプリメンテーションとして築かれえます。 それはSGIフリー・ソフトライセンスBの下でリリースされました。 http://oss.sgi.com/projects/ogl-sample/

グラフィックスライブラリが、MS-DOS、Win32、*BSD、およびLinuxを含む多くのプラットフォームにおいて動くOpenGLクローンである岩石台地3D。 PC UNIXプラットフォームにおいて、岩石台地は、GGI、Xウィンドウを使うために、およびXサーバーGLXインプリメンテーションとして開発できます。 岩石台地は、多くの3Dグラフィックス・アクセラレーターのために加速されたハードウェアです。 岩石台地3.1およびXFree86-スタイルライセンスの下で後でリリースされました。 GPLの下で3.1バージョンがリリースされました。 http://mesa3d.sourceforge.net/

ユタ-GLXは、Matrox MGA-G 200とG-400、ATI3DRAGE PRO、インテルi810、NVIDIA RIVA、およびS3 ViRGEのためのハードウェア加速GLXインプリメンテーションです。 ユタ-GLXは岩石台地に基づきます。 どんなライセンスユタ-GLXが下にリリースされるかはクリアではありません。 http://utah-glx.sourceforge.net/

地下鉄リンクOpenGLおよび極端な3Dは、地下鉄リンクXサーバーのためのGLX拡張です。 地下鉄リンクOpenGLは、他のソフトウェアインプリメンテーションを性能でしのぐために、加速されたX操作を用いることができるソフトウェアインプリメンテーションです。 地下鉄リンク極端3Dは、REALimage、GLINT GMX 1000と2000、GLINT DMX、GLINT MX、GLINT TX、およびPermedia 2と3のためのハードウェア促進されたインプリメンテーションです。 http://www.metrolink.com/

Xiグラフィックス3D加速-Xは、GLXサポートを持つXサーバーです。 サポートされた機器は含みます: ATI 2000, ATI  激怒憤怒プロ、ATI激怒憤怒、ATI激怒マグナム銃、ATIオールイン不思議128(私が信じるすべてのATI RAGE 128 )、3Dlabs酸素VX1、3Dlabs Permedia 3作成! (Permedia 3)ダイヤモンドお忍びIII S540、ダイヤモンドお忍びIII S540極端、創造的研究所3DBlaster Savage4(S3 Savage4)、番号9SR9、3Dfxブードゥー3000、3Dfxブードゥー3500ソフトウェア。

2.150  OpenGL 1.2 はどこにありますか?

これが、書かれた(2000年初め)であった時には、ほとんどのOpenGL1.2インプリメンテーションは入手可能ではありません。 SunとIBMは、OpenGL1.2を出荷しています。 OpenGL似の岩石台地ライブラリは1.2もサポートします。 OpenGLサンプルインプリメンテーションはまた入手可能です。

マイクロソフトはOpenGL1.2をまだリリースしていませんでした。 それらの最も最近の公式発表現在、それは後の方のWindows 2000サービスパックに含められている必要があります。 いったんマイクロソフトがOpenGL1.2をリリースしたら、たぶん、新しいドライバーがその機能を利用することを必要とします。

マイクロソフトで走っている多くのOpenGLベンダは、すでに拡張を通してOpenGL1.1にOpenGL1.2機能をサポートしています。

マイクロソフトを除いたOSにおいて走るOpenGLベンダは、彼ら自身のスケジュールにおいてOpenGL1.2をリリースします。

OpenGL1.2指定はhttp://www.opengl.orgから入手可能です。 赤と青い本は、OpenGL1.2機能をカバーするために、最近改訂されました。

2.160  OpenGL適合テストとは何ですか?

OpenGL対応テストは、OpenGLインプリメンテーションがOpenGLスペックに対応し、従ってライセンス料金を支払った後に自身を「OpenGL」と呼ぶことの権利を与えられることを保証するためにOpenGL ARBが用いるテストのスイートです。 対応テストのためのソースコードはOpenGL ARBからライセンスされるかもしれません。

対応テストは、完全なOpenGL1.2機能をテストするために、最近アップグレードされました。 彼らは拡張エントリポイントを行使しません。 しかし、彼らは、サポートするためにインプリメンテーションが要求する拡張の完全なリストを報告します。

covoglは、すべての標準のエントリポイントを単に呼ぶ特別な対応テストです。 それは「記事」テストであり、すべてのエントリポイントが存在し、壊れないことを保証することを意図しています。 すべての他のテストは、具体的な表現仕事についてスペック対応をテストすることを意図しています。

テストmustpass.cにより、すべてのOpenGLインプリメンテーションがサポートしなければならない機能の定義されたコアがテストされます。 (することができるにちがいありません) 他のテストに失敗するベンダは、まだ、名 「OpenGL」 を使うことを許されているけれども、それらは、それらが解釈し可能にちがいなく ショーまでに バグ 、未来のリリースにおいて問題を解決するために働いています。

状態を押し、破裂させる能力は完全にテストされます。 動く個々のテストは、フォームをもっています:

押し状態
変化状態
テストを実行してください
ポップな状態
それらがデフォルト値に戻ったことを確かめるためにすべての状態が見積もること(glGet*()を経て)をチェックしてください。

いくつかのテストが、OpenGL指定からあるバリエーションを可能にするある内蔵のエラーを持っています。 例えば、OpenGLスペックは、三角形、個々のされたピクセルのセンターをrasterizingする時が、三角形の数学的な境界内にあるにちがいないと述べます。 しかし、三角形をrasterizingするための対応テストは、エラーを報告せずにこの境界の外でピクセルがちょうど1/2ピクセルであることを可能にします。

逆に言えば、いくつかのテストが、スペックがそれを要求するより多くについて試験を受けるようです。 例えば、スペックが単一のビットの精度だけを要求するのに対して、アルファテストのためのテストは、通過するために、10パーセント(4ビットから5ビットまで)精度を必要とします。

もしスペックに親密に精通していないならば、いくつかのテストは意味をなしません。 例えば、スペックは、それが完全にOK notのに であると伝えて ユーザーがそれを要求した時の反エイリアスポリゴン 、対応テストはこれを許します。 別の例はディザリングしています; スペックが、たくさんのインプリメンテーション多様性〈すべてで、および結果としてディザリングを全然含まない〉を可能にする 対応テストにより、もしインプリメンテーションがディザリングしないならば、エラーは表示されないでしょう。

すべてのテストにより、まだ同じ結果を引き起こしているはずのさまざまな国の設定によって同じテストを実行するパスレベルがサポートされます。 例えば、ポリゴン点刻法によって三角形をすることは使用不可にし、可能であったポリゴン点刻法を持つそれおよび合計1ビットの点刻法パターンをするのと同じ結果を生み出すべきです。 また、これは同一であるはずです 可能な混合によって与えるおよび ブレンド機能 of (GL_ONE、GL_ZERO)。 多くのパスレベルの入手可能、国の設定の個々のテストより複雑な結合。

すべてのテストは、色インデックスを含む(もし入手可能ならば)すべての入手可能なピクセルフォーマットまたはビジュアルなタイプに実行されます。

すべてのテストにより正しい表現はglReadPixels()によって確認されます。 いくつかのテストにより全体のテストウィンドウ 場合 他のリードオンリー 少しのキーピクセル が読まれます。 一般に、テストによりGL_RGBAとGL_FLOATは、タイプとフォーマットとして使われます。 しかし、readpix.cテストによりすべてのタイプとフォーマット結合が完全にテストされます。 もしglReadPixels()が壊されるならば、すべてのテストは失敗するかもしれないでしょう。

もしglReadPixels()が遅いならば、対応テストには運転に長い時間が必要であるかもしれないでしょう。 すべてのパスですべてのテストが動いて以来のさらに連続しているので、すべての入手可能なピクセルフォーマットとvisuals、それのレベルには数日 of を必要とするかもしれません 全体のテスト特別室を走る計算時間 。

対応テストによって、多くのバグが見つかります。 しかし、それらはバグなしのインプリメンテーションを保証していません。 対応の完全な特別室を通過するインプリメンテーションがテストする まだそんなにバグだらけであるかもしれないので、多くのアプリケーションは動くことができません。