0

WindowsでOpenGLでフォグ座標拡張を使用しようとしています。以下は、私のコードの最初の数行です。

#include <windows.h>
#include <gl\glut.h>
#include "GLEXT.h"

#define GL_FOG_COORDINATE_SOURCE_EXT    0x8450      
#define GL_FOG_COORDINATE_EXT       0x8451                  

PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL;

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");

その場合、コンパイラは glFogCoordfEXT が見つからないことを示唆します。しかし、一度置くと

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");

フォグ パラメータを設定する前に、コンパイルは成功し、プログラムは正常に実行されます。

私は Windows をよく使用していますが、Windows 固有の関数呼び出しに慣れていません。これがどのように機能するか教えてもらえますか?

4

1 に答える 1

0

Microsoft Windows では、1 つのライブラリ (1 つ) でコンパイルし.lib、別のライブラリ (自分の.dllもの) で実行します。Microsoft はコンパイル ライブラリの内容を管理していますが、ベンダーはランタイム ライブラリを置き換えることができます。OpenGL の場合、コンパイル ライブラリはかなり古く (OpenGL 1.1 関数といくつかの拡張機能のみをサポート)、そのライブラリは、コンパイラがリンクに必要とするエクスポートされた関数を提供するため、新しい OpenGL 関数はそこに含まれていません。そのため、実行時に .dll から取得できる関数ポインターを使用する必要がありました。関数wglGetProcAddress()はその関数の取得を行います。大文字で表示される型 (例: PFNGLFOGCOORDFEXTPROC) はすべて、 で取得できる関数の typedef ですwglGetProcAddress()。だから、あなたを使用するためにglFogCoordfEXT()関数を呼び出す前に、.dll から取得する必要がありました。wglGetProcAddress()一般に、プログラムの開始時 (ただし、OpenGL コンテキストを作成した後) に、初期化コードを取得するために使用する必要があるすべての関数を収集する必要があります。

別のポイント: 適切なバージョンの OpenGL が利用可能であることを確認する必要があります (を呼び出すことによりglGetString(GL_VERSION))、必要な拡張機能がサポートされていることを確認する必要があります (いずれかを呼び出しglGetString(GL_EXTENSIONS)て文字列を解析するか、より新しい OpenGL を使用している場合はglGetStringi()getを呼び出します)。個々の拡張文字列) は、関数が OpenGL 実装で使用できない場合wglGetProcAddress()に返さNULLれます. 有効な関数ポインタが使用可能であることを返しますが、それは必ずしも必要な機能が存在することを意味するわけではありません (そのため、そのような状況はめったにありませんが、拡張機能の相互作用が原因で発生する可能性があります。

于 2013-03-28T16:33:39.243 に答える