2

私が使用する場合glBufferData、それは私がそれを呼び出すときに正確にメモリを割り当てるのだろうか(つまり、サイズパラメータがその時点で利用可能なメモリよりも大きい場合はクラッシュする)、それともある種の特別なジャストインタイムルールを持っているのだろうか?実際にデータをバッファにコピーするときにのみメモリを割り当てますか?

より簡潔にするために、私の質問は、より実用的な質問に答えることによって答えられます:

これにはGPUのメモリ量が必要です。

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);

次に、同じバッファでこれを行うと、占有メモリはどのように変化しますか。

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);  
4

2 に答える 2

5

これにはGPUのメモリ量が必要です。

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);

これにより「GPU上」にメモリが割り当てられるという保証はありません。ドライバーは、GPUではなくCPUメモリにバッファオブジェクトを配置することを決定する可能性があります。

代わりに、「バッファオブジェクトに割り当てられるメモリの量」という質問を想定します。

1000バイト。それはあなたが求めたものであり、それはドライバーが割り当てるものです。

次に、同じバッファでこれを行うと、占有メモリはどのように変化しますか。

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);  

現在バインドされているバッファオブジェクトにGL_ARRAY_BUFFERストレージが割り当てられていて、そのストレージに少なくともバイトが含まれている場合、最初のバイトをsizeof(poly)ストレージにコピーすることにより、バッファのストレージを変更します。sizeof(poly)&poly

ストレージが割り当てられていない場合、またはストレージがsizeof(poly)バイトよりも小さい場合は、GL_INVALID_VALUEエラーが発生します。

割り当てのサイズは変更されません。返されたポインタmallocを呼び出しても、によって返される割り当てのサイズが変更されないのと同じです。のような; ストレージを割り当てます(そのストレージにへのオプションがあります)。のような; データを既存のストレージにコピーします。memcpyglBufferDatamallocmemcpyglBufferSubDatamemcpy

memcpy最初に割り当てずに電話をかけることができないのと同じように、最初に電話glBufferSubDataをかけずに電話をかけることはできませんglBufferData

于 2013-02-15T21:14:21.097 に答える
1

ドキュメントから:

GL_OUT_OF_MEMORYGLが指定されたでデータストアを作成できない場合に生成されますsize

また:

の場合、指定されたサイズのデータ​​ストアdataNULL引き続き作成されますが、その内容は初期化されていないため、未定義のままです。

于 2013-02-15T20:46:46.177 に答える