Sto usando GC
per scrivere shaders all'interno di Unity3D
.CG: specificare una variabile da non interpolare tra vertice e framment shader
Sto utilizzando gli attributi dei colori vertici per passare alcuni parametri allo shader. Non saranno usati così per definire i colori, e dovrebbero essere inoltrati dal vertex shader al pixel shader senza modificarli.
Questa è la struttura sto prendendo come input dal Unity3D al vertex:
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
half4 texcoord2 : TEXCOORD2;
half4 texcoord3 : TEXCOORD3;
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
};
Questa è la struttura restituita da vertex shader come input per il frammento:
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 col: COLOR;
};
Se Semplicemente inoltro il parametro allo shader di frammenti, ovviamente sarà interpolato:
v2f vert (appdata_full v)
{
v2f output;
//....
output.col = v.color;
}
Vorrei passare il parametro v.color
non interpolato allo shader del frammento. È possibile? Se sì come?
EDIT
come Tim rilevare, questo è il comportamento previsto, a causa della shader non può fare altro che interpolando i colori se questi sono passati dal vertex shader a frammentarsi. Proverò a spiegare meglio quello che sto cercando di ottenere. Uso i colori per vertice per memorizzare altri tipi di informazioni rispetto ai colori. Senza dire tutti i dettagli su quello che sto facendo, diciamo che puoi considerare ciascun vertice di colore come un id (ogni vertice dello stesso triangolo, avrà lo stesso colore. In realtà ogni vertice della stessa mesh).
Quindi ho usato il trucco del colore per mascherare alcuni parametri perché non ho altro modo di farlo. Ora questa informazione deve essere disponibile allo shader dei frammenti in qualche modo. Se un passaggio come parametro out del vertex shader, questa informazione codificata in un colore arriverà interpolato al frammento, che non può più non usarlo.
Sto cercando un modo di propagare questa informazione invariata fino al frammento shader (forse è possibile utilizzare una variabile globale o qualcosa del genere? Se sì come?).
Come hai intenzione di conciliare tre ingressi (vertici) per pixel se non interpolare i valori di cosa vi aspettate che accada se ogni vertice del triangolo ha un valore diverso – Tim
@ Tim? : ok ... hai ragione, capisco la tua obiezione . Il punto è che in realtà i colori non sono i colori nel mio shader. Sto usando i valori del colore per memorizzare altri tipi di informazioni. Ho bisogno di inoltrare questa informazione per vertice da vertice a frammento di shader, eventualmente non passandola come parametro out di vertex shader, ma usando qualche "variabile gloabal" se qualcosa del genere è possibile. Spero di essere chiaro. – Heisenbug
Non importa se si tratta di un colore o di un indice o altro. Diciamo che stai disegnando un singolo triangolo. Basato su un calcolo arbitrario per vertice; vertice 0 uscite "5", vertice 1 uscite "10" e vertice 2 uscite "15". Quale di questi tre numeri vuoi mostrare nel tuo frammento shader? Se è davvero un valore globale di usare una divisa, altrimenti credo che non ci stia pensando completamente. A meno che tu non dica "Voglio sempre il valore del vertice 0 e ignorare gli altri due", questo non ha molto senso. – Tim