Artefato de textura do Skybox na borda


12

Estou com um problema estranho ao desenhar a textura do skybox no Mac. No iPhone, tudo está indo bem. Tentei mudar o valor dos aviões próximos e distantes sem sucesso.

É um skybox de seis texturas, e para cada textura eu defino isso:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Qual poderia ser o problema?

Captura de tela:

Imagem do céu com as bordas da caixa do céu visíveis

EDITAR:

Tentei definir a cor do plano de fundo para vermelho, para garantir que esteja sangrando pela textura

Eu também tentei alterar as cordas da textura para isso:

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

E a caixa é desenhada nesta ordem:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

SOLUÇÃO:

A solução é configurar GL_CLAMP_TO_EDGE para o próprio mapa do cubo!

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Respostas:


8

Você está certo de ter definido GL_CLAMP_TO_EDGE para cada textura individual ? Isso faz parte do estado individual da textura e o padrão é GL_REPEAT; portanto, isso precisa ser feito após a ligação com glBindTexture. Percebo no post original que você literalmente diz que o define para cada textura, mas estou me perguntando como o código realmente se parece.

Por exemplo:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

Não é o mesmo que:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Eu encontrei o erro! Era necessário não definir GL_CLAMP_TO_EDGE para todas as texturas do mapa do cubo, mas para o próprio cubemapp! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);eglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
martin pilch

1

insira '0.5f / texture_width' do lado esquerdo e direito da textura e '0.5f / texture_height' de cima e de baixo. Você está vendo artefatos de amostragem - os amostradores de textura geralmente amostram do centro dos texels, à esquerda e à direita, superior e inferior (em 0 e 1 uv) e obtém 50% do texel que seu amostrador recebe quando está fora dos limites . Esse é o outro lado da textura ou uma cor de amostra padrão.


É por isso que ele conseguiu o GL_CLAMP_TO_EDGEconjunto, deve fazer com que as amostras fora dos limites tomem o valor dos pixels mais próximos na textura. O que você descreve pode muito bem funcionar, mas não explica por que o problema existe, em primeiro lugar.
Aaaaaaaaaaaa

Eu tentei sem alterações: /
martin pilch 5/05

0

Meu melhor palpite é que a diferença entre o MAC e o iPhone é causada pelo antialiasing no MAC. Minha programação em 3D está um pouco enferrujada, mas acho que você precisaria fazer todos os quadrados da mesma malha ou algo do tipo.

A solução de corte sujo seria tornar todos os quadrados um pouco grandes demais para se sobreporem e se prenderem e ajustar as coordenadas UV de acordo.


Tentei desativar o anti-aliasing (por glDisable (GL_POLYGON_SMOOTH);) sem nenhum efeito. Eu desenho camarote como tira triângulo com forma coords -1 a 1
Martin Pilch

1
Isso me parece bom. Pelo menos por enquanto estou sem palpites, mas você pode diminuir o problema descobrindo se esse preto é o fundo que está sangrando ou a borda da textura está mostrando preto. Se você colocar um polígono vermelho em algum lugar atrás do artefato, o artefato terá sua cor?
Aaaaaaaaaaaa

Quero tentar estender paredes, para que elas se sobreponham (exatamente como o eBusiness escreveu) - acho que 0,0001 seria suficiente. Você não precisa alterar as coordenadas UV.
Zacharmarz #

1/10000 certamente não é suficiente, a magnitude do problema parece estar na faixa de 1/4 a 1/2 pixel; portanto, dependendo do tamanho da textura, a magnitude mínima para que isso funcione seria em torno de 1/1000. Não ajustar as coordenadas UV é meio desleixado, dada a natureza da textura, o salto visual resultante pode não ser perceptível, mas ainda assim está errado. De qualquer forma, mais conselhos sobre hacks devem depender da resposta à pergunta que fiz no meu comentário anterior.
Aaaaaaaaaaaa

O artefato não é um fundo sangrando através da textura. Eu configurei a cor de fundo para vermelho sem alterações. Eu também tentei estender coordenadas de textura
martin Pilch

0

Esse é um problema comum com mapas de cubos em HW mais antigos (ou talvez em iphones). Verifique se há

GL_ARB_seamless_cube_map

extensão, se estiver disponível no seu hw. Se então. O problema será resolvido de maneira apropriada usando-o.


O problema está na GeForce 9400M, não no iPhone. Esta extensão não está disponível para mim.
martin pilch 5/05

Definitivamente, NÃO é um problema causado por mapas de cubos, independentemente de ser contínuo ou não. Esse é um problema de quebra de textura.
Tara

0

As seis texturas são configuradas, especificamente, como um mapa de cubo ou cada uma das faces do skybox é renderizada separadamente com sua própria textura? Ouvi dizer que alguns sistemas antigos de PC tinham uma filtragem bastante ruim quando se tratava de mapas de cubos, pois eles não filtravam necessariamente a textura de uma face para outra quando você fazia uma amostra perto das bordas do cubo. AFAIK, o SGX (GPU para iPhone) deve filtrar as bordas corretamente.

Ocorreu-me que a parte inferior das texturas laterais parece ter um tom de azul semelhante ao artefato. Você poderia tentar, por exemplo, transformar a linha inferior (ou algumas linhas) de pixels em um tom hediondo de magenta e ver se isso muda a cor do artefato? Isso pode dar mais alguma idéia do que pode ou não estar acontecendo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.