OpenGL: Como fazer RGBA-> RGBA blitting sem alterar alfa de destino
-
02-07-2019 - |
Pergunta
Tenho uma textura OpenGL RGBA e eu blit outra textura RGBA nele usando um objeto framebuffer. O problema é que se eu usar as funções de mistura usuais com
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),
o blit resultante faz com que a textura alpha destino à mudança, tornando-o um pouco transparente para os lugares onde alfa anteriormente era 1. Eu gostaria que o alfa superfície de destino nunca à mudança, mas por outro lado o efeito sobre valores RGB deve ser exatamente como com GL_SRC_ALPHA
e GL_ONE_MINUS_SRC_ALPHA
. Assim, as funções do factor de mistura deve ser (A, A, A, 0) e (1-A, 1-A, 1-A, 1). Como posso conseguir isso?
Solução
Você pode definir a mistura-modos para RGB e alfa para equações diferentes:
void glBlendFuncSeparate(
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
No seu caso você queira usar as seguintes enums:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
Note que você pode ter que importar a função glBlendFuncSeparate como uma extensão. É seguro fazê-lo embora. A função é em torno de um tempo muito longo. É parte do OpenGL 1.4
Outra maneira de fazer a mesma é desativar escrito ao canal alfa usando glColorMask:
void glColorMask( GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha )
poderia ser muito mais lento do que glBlendFuncSeparate porque OpenGL-drivers otimizar as funções mais usadas e glColorMask é um dos OpenGL-funções raramente utilizadas.
Se você não está com sorte você pode até mesmo acabar com emulação de renderização de software chamando funções excêntricos: -)
Outras dicas
Talvez você poderia usar glColorMask ()? Ele permite que você ativar / desativar a escrita para cada um dos quatro componentes de cor.