Ho una scena che viene renderizzata alla trama tramite FBO e la sto campionando da uno shader di frammenti, disegnandone le regioni usando le primitive anziché disegnare un quadrante a schermo intero: Sto risparmiando risorse generando solo i frammenti di cui ho bisogno.La ricerca della trama nell'FBO renderizzato è disattivata di mezzo pixel
Per verificarlo, sto emettendo esattamente la stessa geometria del mio rendering di trama, il che significa che il modello di rasterizzazione prodotto dovrebbe essere esattamente lo stesso: Quando il mio frammento shader cerca la sua texture con la coordinata variabile è stato dato dovrebbe corrispondere perfettamente con gli altri valori che è stato dato.
Ecco come sto dando il mio frammento Shader le coordinate per l'auto-consistenza della geometria con la mia fullscreen texture:
// Vertex shader
uniform mat4 proj_modelview_mat;
out vec2 f_sceneCoord;
void main(void) {
gl_Position = proj_modelview_mat * vec4(in_pos,0.0,1.0);
f_sceneCoord = (gl_Position.xy + vec2(1,1)) * 0.5;
}
sto lavorando in 2D in modo da non riguardava me stesso con il divario prospettiva Qui. Ho appena impostato il valore di scenaCoord usando la posizione dello spazio clip ridimensionata da [-1,1] a [0,1].
uniform sampler2D scene;
in vec2 f_sceneCoord;
//in vec4 gl_FragCoord;
in float f_alpha;
out vec4 out_fragColor;
void main (void) {
//vec4 color = texelFetch(scene,ivec2(gl_FragCoord.xy - vec2(0.5,0.5)),0);
vec4 color = texture(scene,f_sceneCoord);
if (color.a == f_alpha) {
out_fragColor = vec4(color.rgb,1);
} else
out_fragColor = vec4(1,0,0,1);
}
Avviso Sputo un frammento rosso se i miei alfa non corrispondono. Il rendering della trama imposta l'alfa per ogni oggetto sottoposto a rendering su un indice specifico, quindi so cosa corrisponde a cosa.
Spiacente, non ho un'immagine da mostrare ma è molto chiaro che i miei pixel sono spenti di (0.5,0.5)
: ottengo un sottile bordo rosso di un pixel attorno ai miei oggetti, sul lato inferiore e sinistro, che si apre e su. È piuttosto "transitorio". Il giveaway è che si mostra solo sul lato inferiore e sinistro degli oggetti.
Avviso Ho una riga commentata che utilizza texelFetch
: questo metodo funziona e non visualizzo più i miei frammenti rossi. Tuttavia mi piacerebbe farlo funzionare correttamente con texture
e coordinate di texture normalizzate perché penso che più hardware lo supporteranno. Forse la vera domanda è, è possibile ottenere questo diritto senza inviare la mia risoluzione viewport tramite una divisa? Deve esserci un modo per evitarlo!
Aggiornamento: ho provato a spostare l'accesso alla trama di mezzo pixel, un quarto di pixel, un centesimo di pixel, è tutto peggiorato e ha prodotto un bordo solido di valori errati attorno ai bordi: sembra che il mio Il trucco gl_Position.xy+vec2(1,1))*0.5
imposta i valori corretti, ma il campionamento è appena fuori da un po '. Questo è abbastanza strano ... Vedi i frammenti rossi? Quando gli oggetti sono in movimento, si illuminano sempre di più. Significa che i valori alfa impostati non corrispondono perfettamente a quei pixel.
Non è importante per me per ottenere precisione pixel perfetto per questo alfa-index-check per la mia domanda reale, ma questo comportamento non è proprio quello che mi aspettavo.
Grazie per allevare GL_NEAREST. È probabile che risolva il problema perché posso vedere come il filtraggio lineare con anche un errore basato sulla precisione leggermente diverso può causare il fallimento dell'assegno. Proverò la prima possibilità che ho. Trovo che la mia soluzione 'f_sceneCoord' sia più elegante dell'uso di' FragCoord' e di un'uniforme delle dimensioni dello schermo: Funziona indipendentemente da me che devo tenere traccia di un'uniforme delle dimensioni dello schermo ... Meno complessità è sempre buona. –
Vorrei poter passare più di una volta! Avere un upvote e un accept. –
Sì, ho provato a eseguire il debug con glslDevil e mi ha richiesto di tornare alla sintassi 1.2, quindi ho cambiato tutto in 'varying/attribute' e' texture2D' ... glslDevil comunque non mi mostra alcun valore. Ad ogni modo non importa, ciò che è buono è "GL_NEAREST" produce risultati perfetti. Alla fine della mia effettiva implementazione, ho comunque bisogno di usare 'GL_LINEAR', quindi le cose sembrano buone, ma sono davvero felice di essere arrivato alla fine. –