は、これを行うには、いくつかの方法があります。
1:
効率を最大にするため
std::vector<GLubyte> emptyData(width * height * 4, 0);
glBindTexture(GL_TEXTURE_2D, texture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &emptyData[0]);
は、あなたがこれを呼び出すとするときの間にいくつかの時間を残す必要があります。テクスチャの幅と高さを考えるとOpenCLがその作業を開始するとき。
2:FBOに取り付け、glClearBufferを使用します。
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0); //Only need to do this once.
glDrawBuffer(GL_COLOR_ATTACHMENT0); //Only need to do this once.
GLuint clearColor[4] = {0, 0, 0, 0};
glClearBufferuiv(GL_COLOR, 0, clearColor);
これは、CPU-GPU DMAが実行されていないため、これは高速であるようです。しかし、FBOのバインディングとバインド解除は、非効率性をもたらす可能性があります。それではまた、そうではないかもしれません。それをプロファイルして確かめてください。
これは、レンダーターゲットとして使用できるイメージ形式でのみ機能することに注意してください。圧縮されたテクスチャではありません。
3:データstandard pixel transfersによって提供することができる画像形式については、こののみ動作することを
glClearTexImage(texture, 0, GL_BGRA, GL_UNSIGNED_BYTE, &clearColor);
注:考えると、十分なドライバーは、新しいARB_clear_texture拡張子を使用することができます。圧縮されていない形式なので
'glClearBuffer'について聞いたことがありません。これは非常に新しいバージョンからですか? 'glClear'よりも利点がありますか(または後者は廃止予定ですか?) –
@Christian:ClearBufferの主な利点は、特定のバッファをクリアできることです。フレームバッファ内に複数のバッファがあり、複数のレンダーターゲットがある場合は、異なるバッファを異なる色にクリアすることができます。まったく何かをクリアしないでください。 'glClear'ではこれを行うことはできません。すべてのバッファを同じクリアカラーにクリアします。 'glClear'は非推奨ではなく、' glClearBuffer'はGL 3.0から来ています(拡張子はありません)。 –
glClearTexImageは、glTexImage *またはglTexStorage *への呼び出しを使用して、テクスチャストレージが以前に割り当てられている場合にのみ機能することに注意してください。 glBindTextureを使用してテクスチャを作成するだけでは不十分です。しかしこれはglTexSubImage2Dにも当てはまります。 – rdb