Pergunta

Estou tentando desenhar uma textura parcialmente transparente acima de um quadriciclo colorido, para que a cor brilha através da parte transparente, fazendo um contorno. Este é o código:

// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);    
glBindTexture(GL_TEXTURE_2D, 0); 
glBegin(GL_QUADS);
  glVertex3d(coords11.first, coords11.second, -0.001);
  glVertex3d(coords12.first, coords12.second, -0.001);
  glVertex3d(coords21.first, coords21.second, -0.001);
  glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();

// Textured quad    
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]); 
glBegin(GL_QUADS);
  glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0);
  glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0);
  glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0);
  glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0);
glEnd();

A textura é preta, exceto onde tem o contorno de um castelo; Essa parte é transparente (e branca). O comportamento esperado, portanto, é um retângulo preto com um contorno verde. O que recebo é um retângulo esverdeado com um contorno branco:

Captura de tela

Isso é com Alpha no Quad Definir para 0,5 texturizado. Se, em vez disso, eu o defina para 1.0, retiro a textura sem transparência, como em (oh bem, não posso postar a segunda captura de tela como um link; está em s330.photobucket.com/albums/l412/twbwar/?action = View¤t = substituir10.png). Com alfa de 0, recebo um retângulo verde. Parece -me, portanto, que o Quad texturizado está sendo misturado usando o valor alfa definido pelo GLCOLOR4D, em vez do valor da textura, que é o que eu esperava do GL_PLAPEL. (Eu experimentei GL_Decal e Gl_modulate também, mas não consegui obter o comportamento que queria.) Alguém pode me dizer como fazer o OpenGL usar a textura, não o Quad, Alpha para misturar?

Foi útil?

Solução

Prepare -se para uma viagem pela memória.

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);

Que 3 aí está o seu problema. A parte direita dos argumentos (RGBA+UNSIGNED_BYTE) menciona qual é o seu tipo de dados de origem. a destino Tipo de dados é o terceiro argumento (ou seja, o que GL armazenará sua textura).

Por acaso, quando o GL 1.0 foi criado, a textura era um pouco mais simples. Portanto, o parâmetro foi necessário apenas para especificar o número de canais que você queria para sua textura final, com o mapeamento

1=GL_LUMINANCE
2=GL_LUMINANCE_ALPHA
3=GL_RGB
4=GL_RGBA

Acredito que esse uso é desanimado, mas, como você pode ver, ainda funciona.

Então ... sua textura é armazenada como GL_RGB, sem alfa.

O restante é uma aplicação simples da especificação. Uma substituição em uma textura com formato interno RGB faz final_color=texture_color e final_alpha=fragment_alpha (também conhecido como fonte da Glcolor no seu caso). Ver esta página do homem Para as tabelas completas do ambiente de textura com base em formatos internos.

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