1

タイプ の変数に OpenGL 識別子を格納しますGLuint。しかし、これらの変数をどの値に初期化すればよいかわかりません。それらをゼロに初期化したいのですが、残念ながらそれは OpenGL の有効な識別子です。

OpenGL オブジェクトを保存する前に、変数を初期化する必要があります。これは、後で非同期に行われるためです。では、どうにかして OpenGL にゼロではなく 1 でインデックス作成を開始させることはできますか? または、使用GLintして初期化する必要があります-1か?

これをきれいに解決したいと思います。もちろん、変数とブール値フラグなどのペアを格納することもできます。しかし、それはハッキーです。この問題にどのようにアプローチしますか?

4

2 に答える 2

6

それらをゼロに初期化したいのですが、残念ながらそれは OpenGL の有効な識別子です。

いいえ、そうではありません。0 は、ほとんどの OpenGL オブジェクト タイプで「オブジェクトではない」ことを意味します。有効な 0 オブジェクトを持つ唯一のものは、FBO (0 はDefault Framebufferを意味します)、変換フィードバック オブジェクト、およびテクスチャ (オブジェクトではないかのように扱う必要があります) です。

したがって、ゼロを使用してください。any をゼロで呼び出すことglDelete*は正当であり、たとえ 0 がその型の有効なオブジェクトであっても、何も起こりません。

于 2013-03-16T16:33:51.067 に答える
2

もちろん、変数とブール値フラグなどのペアを格納することもできます。しかし、それはハッキーです。この問題にどのようにアプローチしますか?

これboost::optionalは、説明した内容のテンプレートベースの実装です。こちらをご覧ください。

これにより、次のようなことができます。

boost::optional<GLuint> foo; // Uninitialised
if (foo) // foo evaluates to false
{
    Bar(*foo); // Doesn't execute
} 
*foo = 3; // Initialised
if (foo) // foo evaluates to true
{
    Bar(*foo); // Executes
}
于 2013-03-16T16:05:04.537 に答える