Manufatto trama Skybox sul bordo


12

Ho strani problemi con il disegno di texture skybox su Mac. Su iPhone tutto sta andando bene. Ho provato a cambiare il valore degli aerei vicini e lontani senza successo.

È uno skybox di sei trame e per ogni trama ho impostato questo:

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);

Quale potrebbe essere il problema?

Immagine dello schermo:

Immagine del cielo con i bordi dello skybox visibili

MODIFICARE:

Ho cercato di impostare il colore di sfondo su rosso, per assicurarmi se sanguina attraverso la trama

Ho anche provato a cambiare i contorni della trama in questo:

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 la scatola è disegnata in questo ordine:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

SOLUZIONE:

La soluzione è impostare GL_CLAMP_TO_EDGE per la stessa mappa cubica!

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);

Risposte:


8

Sei sicuro di aver impostato GL_CLAMP_TO_EDGE per ogni singola trama ? Questa è una parte del singolo stato della trama e per impostazione predefinita è GL_REPEAT, quindi è necessario eseguire questa operazione dopo l'associazione con glBindTexture. Mi rendo conto che nel post originale dici letteralmente che lo hai impostato per ogni trama, ma mi chiedo come sia effettivamente il codice?

Per esempio:

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.

Questo non è lo stesso di:

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);

Ho trovato l'errore! Non è stato necessario impostare GL_CLAMP_TO_EDGE per ogni trama della mappa cubica ma per la stessa 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

inserire '0.5f / texture_width' dal lato sinistro e destro della trama e '0.5f / texture_height' dall'alto e dal basso. Stai vedendo artefatti di campionamento - i campionatori di trama di solito campionano dal centro dei texel, quindi a sinistra e a destra, in alto e in basso (a 0 e 1 uv) stai ottenendo il 50% di tutto ciò che il tuo campionatore ottiene quando è fuori dai limiti . Questo è l'altro lato della trama o un colore di campionamento predefinito.


Questo è il motivo per cui ha ottenuto il GL_CLAMP_TO_EDGEset, dovrebbe fare in modo che i campioni fuori limite prendano il valore dei pixel in trama più vicini. Quello che descrivi potrebbe benissimo funzionare, ma non spiega perché il problema sia presente in primo luogo.
aaaaaaaaaaaa

L'ho provato senza alcun cambiamento: /
martin pilch

0

La mia ipotesi migliore è che la differenza tra MAC e iPhone è causata dall'antialiasing sul MAC. La mia programmazione 3D è un po 'arrugginita, ma suppongo che dovresti rendere tutti i quadrati parte della stessa mesh o qualcosa del genere.

La soluzione di hack sporco sarebbe quella di rendere tutti i quadrati un po 'troppo grandi in modo che si sovrappongano e si aggancino e regolino le coordinate UV di conseguenza.


Ho provato a disattivare l'antialiasing (tramite glDisable (GL_POLYGON_SMOOTH);) senza alcun effetto. Sto disegnando skybox come una striscia triangolare con le forme da -1 a 1
martin pilch

1
Per me va bene. Almeno per ora non ho idea, ma potresti voler restringere il problema scoprendo se quel nero è lo sfondo sanguinante o il bordo della trama è nero. Se si posiziona un poligono rosso da qualche parte dietro il manufatto, il manufatto assumerà il suo colore?
aaaaaaaaaaaa

Voglio provare a estendere i muri, quindi si sovrappongono (proprio come ha scritto eBusiness) - penso che 0.0001 sarebbe sufficiente. Non è necessario modificare le coordinate UV.
Zacharmarz,

1/10000 certamente non è abbastanza, l'entità del problema sembra essere nell'intervallo da 1/4 a 1/2 pixel, quindi a seconda della dimensione della trama l'ampiezza minima per farlo funzionare sarebbe circa 1/1000. Non regolare le coordinate UV è un po 'sciatto, data la natura della trama il salto visivo risultante potrebbe non essere evidente, ma sarebbe comunque sbagliato. In ogni caso, ulteriori consigli per gli hack dovrebbero dipendere dalla risposta alla domanda che ho posto nel mio commento precedente.
aaaaaaaaaaaa

Il manufatto non è uno sfondo sanguinante attraverso la trama. Ho impostato il colore di sfondo su rosso senza alcuna modifica. Ho anche cercato di estendere le coordinate della trama
martin pilch

0

Questo è il solito problema con le cubemap su vecchi HW (o forse su iPhone). Controlla il

GL_ARB_seamless_cube_map

estensione se è disponibile sul tuo hw. Se è così. Il problema sarà risolto proponendolo usando.


Il problema riguarda GeForce 9400M, non l'iPhone. Questa estensione non è disponibile per me.
Martin Pilch,

Questo NON è sicuramente un problema causato da cubemaps, indipendentemente dal fatto che sia continuo o meno. Questo è un problema di avvolgimento delle trame.
Tara,

0

Le sei trame sono impostate, in particolare, come una mappa cubica o ciascuna delle facce skybox è resa separatamente con la propria trama? Ho sentito che alcuni dei primi sistemi PC avevano un filtro piuttosto scarso quando si trattava di gestire le cubemap in quanto non necessariamente filtravano attraverso la trama di una faccia alla successiva quando si campionava vicino ai bordi del cubo. AFAIK SGX (GPU iPhone) dovrebbe filtrare correttamente attraverso i bordi.

Mi è venuto in mente che la parte inferiore delle trame laterali sembra essere una tonalità blu simile al manufatto. Potresti provare, per esempio, a trasformare la riga inferiore (o alcune righe) di pixel in una tremenda sfumatura di magenta e vedere se questo cambia il colore del manufatto? Ciò potrebbe dare qualche idea in più di ciò che potrebbe o non potrebbe accadere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.