2016-06-10 2 views
0

Можно ли использовать glBlitFramebuffer для копирования альфа-компонента из считывающего фреймбуфера с цветным приложением RGBA на красный компонент фреймбуфера с рисунком R8? Если нет, как бы вы это сделали?glBlitFramebuffer & swizzle

По-видимому, маска swizzle не используется glBlitFramebuffer.

ответ

1

Единственный способ сделать это (не вытаскивая память из графического процессора обратно в 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); 
+0

Спасибо большое Никол для вас быстрый ответ. Поскольку я не могу использовать слишком недавний opengl, я пытаюсь использовать шейдер фрагмента, используя разные параметры: gl_FragColor = texture (samp, tc.xy); Это займет текущую текстуру swizzle на источнике, но не принимает swizzle из dest. Я предполагаю, что мне нужно сделать маску swidesle в шейдере: vec4 (текстура (samp, tc.xy) .a) для ex. – elmarco

Смежные вопросы