Pergunta

Esta é esperançosamente uma pergunta simples: Eu tenho uma textura OpenGL e gostaria de ser capaz de mudar sua opacidade, como posso fazer isso? A textura já tem um bom canal alfa e obras de mistura, mas eu quero ser capaz de diminuir a opacidade de toda a textura, a desvanecer-se em segundo plano. Eu brincava com glBlendFunc, mas sem sorte - parece que eu precisaria de algo como GL_SRC_ALPHA_MINUS_CONSTANT, que não está disponível. Eu estou trabalhando em iPhone, com OpenGL ES.

Foi útil?

Solução 3

Obrigado a todos pelas idéias. Eu tenho jogado tanto com glColor4f e glTexEnv e finalmente me forcei a ler a página de manual glTexEnv cuidado. A página de manual diz que, no modo de GL_MODULATE texturização, a cor resultante é calculado multiplicando-se o fragmento de entrada pela cor texturização (C = Cf × Ct), mesmo se passa para o alfa. Tentei glColor4f (1, 1, 1, opacidade) e que não funcionou, mas passando a opacidade desejada em todos os quatro argumentos da chamada fez o truque. (Ainda não tenho certeza por isso que embora.)

Outras dicas

Eu não tenho nenhuma idéia sobre OpenGL ES, mas no padrão OpenGL você defina a opacidade por declarar uma cor para a textura antes de usá-lo:

//          R,   G,   B,   A
glColor4f(1.0, 1.0, 1.0, 0.5);

O exemplo lhe daria 50% de alfa sem afetar a cor de sua textura. Ao ajustar os outros valores você pode mudar a cor de textura também.

Use um combinador textura. Definir o estágio de textura para fazer uma operação de GL_MODULATE entre uma textura e cor constante. Em seguida, mude a cor constante do seu código (glTexEnv, GL_TEXTURE_ENV_COLOR).

Isto deve vir como "livre" em termos de desempenho. Na maioria (se não todos) chips gráficos combinador operações levar o mesmo número de ciclos de GPU (geralmente 1), por isso apenas usando uma textura versus fazer uma operação modular (ou qualquer outra operação) é exatamente o mesmo custo.

Basicamente, você tem duas opções: utilização glTexEnv para a sua textura com GL_MODULATE e especificar a cor usando glColor4 * e usar um nível não-opaco para o canal alfa. Note-se que glTexEnv deve ser emitido apenas uma vez, quando você carregar sua textura. Este cenário não vai funcionar se você especificar cores em seu vértice-atributos embora. Aqueles vai saber substituir qualquer glColor4 * cor que você pode definir. Nesse caso, você pode querer recorrer a qualquer uma das 2 opções: combinadores uso de texturas (tópico avançado, não é bom para usar em gasoduto fixo), ou "manualmente" mudar o atributo de cor vértice de cada vértice individuais (pode ser indesejável para malhas maiores).

A maneira mais simples é para alterar o valor alfa da textura na mosca. Desde que você diga OpenGL sobre a textura em algum momento, você terá a bitmap na memória. Então, só religar a textura para a mesma textura id. No caso de você não tê-lo na memória, (devido a limitações de espaço, uma vez que você está no ES), você pode recuperar a textura para um buffer de novo, usando glGetTexImage () . Essa é a solução limpa.

Salvamento / operações recuperar são um pouco caros, embora, assim você pode querer outra solução. Pensando nisso, você pode ser capaz de trabalhar com a geometria atrás de sua geometria exibindo sua textura ou simplesmente trabalhar no / cor do material da geometria que mantém a textura. Você provavelmente vai querer ter alguma mistura aditivo do back-geometria. Usando um glBlendFunc de

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

que você pode ser capaz de "facilmente" e - mais importante, mais barato -. Conseguir o efeito desejado

O mais provável é que você está usando cg para obter a sua imagem em uma textura. Quando você usa cg, o alfa é premultiplied, assim, por que você tem que usar o alfa para rgba do func color4f.

Eu suspeito que você tinha um fundo preto, e, assim, diminuindo a quantidade de cada cor, você estava efetivamente desaparecendo a cor para preto.

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