2011-09-23 14 views
5

Basta calcolare un modo, utilizzando Pixel Shader, per proiettare una trama in un quadrilatero definito dall'utente arbitrario.Shader pixel per proiettare una trama in un quadrilatero arbitario

sarà di accettare coordinate dei quattro lati di un quadrilatero:

/// <defaultValue>0,0</defaultValue> 
float2 TopLeft : register(c0); 

/// <defaultValue>1,0</defaultValue> 
float2 TopRight : register(c1); 

/// <defaultValue>0,1</defaultValue> 
float2 BottomLeft : register(c2); 

/// <defaultValue>1,1</defaultValue> 
float2 BottomRight : register(c3); 

provato paio di algoritmo di interpolazione, ma non riusciva a farlo bene.

C'è qualche campione che pensate che potrei essere in grado di modificare per ottenere il risultato desiderato?

risposta

1

C'è un nice paper here che descrive le opzioni (o questo .ppt). Fondamentalmente è necessario definire alcune coordinate baricentriche attraverso il quad, quindi interpolare i valori dei frammenti come somme ponderate BC dei valori dei vertici dati.

Siamo spiacenti, non so di alcun codice; la mancanza di supporto diretto per quads su HW moderno orientato al triangolo (vedi la risposta di voidstar69) significa che sono andati piuttosto fuori moda.

1

Il problema qui è che tutto l'hardware grafico 3D moderno rasterizza triangoli, non quadrilateri. Quindi se chiedi a Direct3D o OpenGL di eseguire il rendering di un quad, l'API dividerà internamente il quad in due triangoli. Questo di solito non è un problema poiché tutto il rendering moderno è corretto in prospettiva, quindi lo spettatore non dovrebbe essere in grado di distinguere tra un quad e due triangoli - l'interpolazione sarà senza soluzione di continuità.

Il modo corretto per richiedere all'API di eseguire questa interpolazione è di passarle le coordinate della trama come dati per vertice, che l'API/hardware interpolerà su ciascun pixel. Il pixel shader avrà quindi accesso a questa coordinata della trama per pixel. Presumo che quando usi il termine 'progetto' intendi semplicemente mappare una trama rettangolare su un quad, e non ti riferisci alla proiezione della trama (che è come un faretto che fa splendere una texture sulle superfici).

La linea di fondo qui è che passare le coordinate della trama del quad al pixel shader è l'approccio sbagliato (a meno che non si abbia qualche motivo speciale per cui è necessario).

+0

Questo è tutto vero ... ma è anche del tutto possibile eludere completamente interpolatori triangolo a base di del HW e definire il proprio schema su quad o poligoni o cose più complesse anche fornito si può spezzare la loro impronta in triangoli e ottenere ogni pixel shader le informazioni di cui ha bisogno (in particolare, la posizione e i valori di tutti gli altri vertici, non solo il triangolo locale). Naturalmente questo non è un modo particolarmente efficiente di fare le cose rispetto al supporto per interpolazione triangolo dedicato dell'HW, ma ciò non significa che non abbia applicazioni. – timday

+1

Il poster non ha specificato se sta tentando di utilizzare l'interpolazione HW, o laterale. Sono d'accordo che entrambi sono possibili. Penso che la domanda originale debba essere chiarita e fornire maggiori dettagli. – voidstar69

Problemi correlati