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:
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);
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);
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.
fonte
GL_CLAMP_TO_EDGE
conjunto, 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.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.
fonte
Esse é um problema comum com mapas de cubos em HW mais antigos (ou talvez em iphones). Verifique se há
extensão, se estiver disponível no seu hw. Se então. O problema será resolvido de maneira apropriada usando-o.
fonte
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.
fonte