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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top