Единственный способ сделать это (не вытаскивая память из графического процессора обратно в CPU) с какой-либо формой операции рендеринга. Блит не может этого сделать.
Вы можете использовать compute shader, если это доступно. Просто привяжите исходные и целевые изображения с помощью Image Load Store и прочитайте/напишите им на основе индекса вызова шейдера вычислений.
Однако не совсем понятно, что вы надеетесь получить, выполнив эту операцию копирования. Если вы только планируете читать текстуру GL_R8
как связанную текстуру/изображение, тогда вам нужно всего лишь создать view texture изображения RGBA. Причиной, чтобы создать представление, является возможность дать представление другому swizzle mask. Просто поднимите альфу в красный цвет и установите зеленый/синий/альфа на 0,0,1.
Очевидно, что это будет не так эффективно, как реальная текстура GL_R8
. Но вам также не придется выполнять потенциально дорогостоящую операцию копирования.
Использование GL 4.5 Direct Access State называет:
GLuint alpha_tex;
glCreateTexture(GL_TEXTURE_2D, &alpha_tex);
glTextureView(alpha_tex, GL_TEXTURE_2D, rgba_tex, GL_RGBA8, 0, num_mipmaps(rgba_tex), 0, 1)
GLint swizzleMask[] = {GL_ALPHA, GL_ZERO, GL_ZERO, GL_ONE};
glTexureParameteriv(alpha_tex, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Спасибо большое Никол для вас быстрый ответ. Поскольку я не могу использовать слишком недавний opengl, я пытаюсь использовать шейдер фрагмента, используя разные параметры: gl_FragColor = texture (samp, tc.xy); Это займет текущую текстуру swizzle на источнике, но не принимает swizzle из dest. Я предполагаю, что мне нужно сделать маску swidesle в шейдере: vec4 (текстура (samp, tc.xy) .a) для ex. – elmarco