Есть несколько способов сделать это:
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);
Кажется, что это должно быть быстрее, так какнет никакого DMA CPU-GPU.Но связывание и открепление FBO может привести к неэффективности.Опять же, это не может.Профилируйте его, чтобы убедиться.
Обратите внимание, что это работает только для форматов изображений, которые можно использовать в качестве целей рендеринга.Поэтому не сжатые текстуры.
3: При наличии достаточного количества драйверов вы можете использовать новое расширение ARB_clear_texture :
glClearTexImage(texture, 0, GL_BGRA, GL_UNSIGNED_BYTE, &clearColor);
Обратите внимание, что это работает только для форматов изображений, данные которыхможет быть обеспечено стандартными передачами пикселей .Так что не сжатые форматы.