0
#define INDEX_AT(x,y,z,i) (xyzToId(Vec3i((x), (y), (z)),\
Vec3i(NUM_RAYS_X,\
NUM_RAYS_Y,\
POINTS_ON_RAY))\
* 3 + (i))
PRINT_GL_ERRORS();
glBindBuffer(GL_SHADER_STORAGE_BUFFER, dPositionBuffer);
float* data_ptr = NULL;
for (int ray_i = 0; ray_i < POINTS_ON_RAY; ray_i++)
{
for (int y = 0; y < NUM_RAYS_Y; y++)
{
int x = 0;
data_ptr = NULL;
data_ptr = (float*)glMapBufferRange(
GL_SHADER_STORAGE_BUFFER,
INDEX_AT(x, y, ray_i, 0) * sizeof(float),
3 * (NUM_RAYS_X) * sizeof(float),
GL_MAP_READ_BIT);
if (data_ptr == NULL)
{
PRINT_GL_ERRORS();
return false;
}
else
{
for (int x = 0; x < NUM_RAYS_X; x++)
{
std::cout << "("
<< data_ptr[x * 3 + 0] << ","
<< data_ptr[x * 3 + 1] << ","
<< data_ptr[x * 3 + 2] << ") , ";
}
}
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
PRINT_GL_ERRORS();
std::cout << std::endl;
}
std::cout << "\n" << std::endl;
}
関数xyzToIdは3次元座標を1次元のインデックスに変換します。私は、マッピングは、全くのみ768台の山車は非常に大きくはないよ
バッファ:
私はこれを実行しようと
は、しかし、プログラムはエラーメッセージを与えて、glMapBufferRangeへの呼び出しでクラッシュ、問題なく完了した(2つの浮動小数点数の)異なるシェーダストレージバッファ上のglMapBufferへの以前の呼び出し。私はこのエラーに関連する情報をオンラインで見つけることができないようで、glMapBufferRangeの速度について読んだことは、このサイズのバッファはマップするのに数十ミリ秒かかります。プログラムがクラッシュするタイムアウト。glMapBufferRangeの使用方法が不明ですか?
"* glMapBufferRangeをどのように使用するべきかについて何か不明ですか?*"はい。ループ*内にバッファ*をマップするべきではありません。これは重量のある操作です。単にポインタを返すだけではありません。 *範囲の終わりから読み終わったときにのみマップを解除してください。数バイトをマップしないでください。それはあなたの問題を解決するかもしれないし、そうでないかもしれませんが、それに関係なく、働くには間違った方法です。 –
問題は、この特定のアプリケーション(これは、より小さなデータセットでコードをデバッグするために使用しています)ではバッファがあまり大きくないのに対し、意図した使用法はバッファが大きすぎて私のメモリに収まらないことです利用可能です。その問題を回避する唯一の方法は、より小さな部分に分割することでした。 上記に関係なく、バッファ全体を一度に使用してglMapBufferでテストしましたが、問題は解決しませんでした。 –
"*バッファが大きすぎて、使用可能なメモリに収まらない*"どうすればそのようなバッファを割り当てられますか?マップするのが大きすぎる場合は、 'glBufferData'には大きすぎます。さらに、それは一度にいくつかの浮動小数点のマッピングを正当化するものではありません。範囲全体をマップできない場合は、範囲の*大きな*部分をマップします。 –