Ci sono due modi, ma non so quale abbia più senso per l'applicazione. A un livello molto alto:
Mappare una trama al triangolo. Poiché la sfumatura è molto uniforme, non è necessario avere una risoluzione molto elevata e puoi lasciare che il filtro lineare faccia il lavoro per te.
Utilizzare uno shader. Più lavoro da impostare, ma anche più flessibile, e ti dà un risultato 'perfetto' a qualsiasi scala/risoluzione.
Update: se avete intenzione di utilizzare uno shader, l'idea è la seguente.
Passare uno varying vec2 coords
dallo shader del vertice allo shader del frammento. Impostare il valore per il punto 1 su 0,0
, per il punto 2 su 1,0
e per il punto C su 0,1
. Per ottenere questi valori nel vertex shader, utilizzare attribute
. I valori variabili verranno interpolati sul triangolo, proprio come farebbero le coordinate e i colori delle texture. Quindi la variabile coords
è mappato al triangolo in questo modo:
y
1 +-----+
|\ |
|#\ |
|##\ |
|###\ |
|####\|
0 +-----+ x
0 1
Lo shader frammento riceve un valore coords
da qualche parte dentro l'area hash. Per calcolare la quantità di ciascun colore che è necessario miscelare, calcolare la linea attraverso coords
e 0,1
e trovare l'intersezione con l'asse x
. Grazie al sistema di coordinate coords
, questa è una semplice operazione: basta dividere coords.x
per coords.y
. Chiama questo f
. (Si noti che questo darà la divisione per zero nel punto C, ma questo è previsto come mai definito il colore lì. È possibile verificare che in modo esplicito nello shader, se si desidera.)
Indicando coords
con c
e che rappresenta il linea con .
personaggi, f
finisce da qualche parte tra 0 e 1:
y
1 +-----+
|\ |
|.\ |
|#c\ |
|#.#\ |
|##.#\|
0 +--f--+ x
0 1
Ora diciamo che avete uniform vec4 colour1
e uniform vec4 colour2
per definire il colore al punto 1 e 2, rispettivamente.Quindi è una semplice questione di combinare questi: prendendo la frazione f
di colour2
e 1-f
frazione di colour1
e aggiungendoli insieme. La funzione GLSL mix
fa esattamente questo.
Poiché il triangolo cambia dinamicamente, sembra che la prima opzione probabilmente non si adatti. Per quanto riguarda gli shader, dovrei usare un vertex shader per passare un valore variabile al vertice del frammento? Ho usato il vertex shader solo finora, e dopo aver cercato qualche tutorial non riesco ancora a capire come funziona il passaggio dei valori variabili dal vertex shadwer. – Leo
Potrebbe ancora: la texture si allungherà insieme alla tua geometria. – Thomas
Ci scusiamo per la modifica rapida. Non ti rendevo conto che premendo invio avresti caricato il commento. – Leo