Il mio obiettivo è passare una serie di punti allo shader, calcolare la loro distanza dal frammento e dipingerli con un cerchio colorato con un gradiente a seconda del calcolo.Uniform point array e gestione dei sistemi di coordinate dello shader di frammenti
Ad esempio:
(Da una working example I set up on shader toy)
Purtroppo non è chiaro per me come dovrei calcolare e convertire le coordinate passati per l'elaborazione all'interno del shader.
Quello che sto provando attualmente è passare due array di float - uno per le posizioni x e uno per le posizioni y di ciascun punto - allo shader anche se uniforme. Poi dentro lo shader scorrere ogni punto in questo modo:
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
uniform float sourceX[100];
uniform float sourceY[100];
uniform vec2 resolution;
in vec4 gl_FragCoord;
varying vec4 vertColor;
varying vec2 center;
varying vec2 pos;
void main()
{
float intensity = 0.0;
for(int i=0; i<100; i++)
{
vec2 source = vec2(sourceX[i],sourceY[i]);
vec2 position = (gl_FragCoord.xy/resolution.xy);
float d = distance(position, source);
intensity += exp(-0.5*d*d);
}
intensity=3.0*pow(intensity,0.02);
if (intensity<=1.0)
gl_FragColor=vec4(0.0,intensity*0.5,0.0,1.0);
else if (intensity<=2.0)
gl_FragColor=vec4(intensity-1.0, 0.5+(intensity-1.0)*0.5,0.0,1.0);
else
gl_FragColor=vec4(1.0,3.0-intensity,0.0,1.0);
}
Ma questo non funziona - e credo che può essere perché sto cercando di lavorare con le coordinate di pixel senza tradurli correttamente. Qualcuno potrebbe spiegarmi come farlo funzionare?
Aggiornamento:
Il risultato corrente è: codice del disegno è:
PShader pointShader;
float[] sourceX;
float[] sourceY;
void setup()
{
size(1024, 1024, P3D);
background(255);
sourceX = new float[100];
sourceY = new float[100];
for (int i = 0; i<100; i++)
{
sourceX[i] = random(0, 1023);
sourceY[i] = random(0, 1023);
}
pointShader = loadShader("pointfrag.glsl", "pointvert.glsl");
shader(pointShader, POINTS);
pointShader.set("sourceX", sourceX);
pointShader.set("sourceY", sourceY);
pointShader.set("resolution", float(width), float(height));
}
void draw()
{
for (int i = 0; i<100; i++) {
strokeWeight(60);
point(sourceX[i], sourceY[i]);
}
}
mentre il vertex shader è:
#define PROCESSING_POINT_SHADER
uniform mat4 projection;
uniform mat4 transform;
attribute vec4 vertex;
attribute vec4 color;
attribute vec2 offset;
varying vec4 vertColor;
varying vec2 center;
varying vec2 pos;
void main() {
vec4 clip = transform * vertex;
gl_Position = clip + projection * vec4(offset, 0, 0);
vertColor = color;
center = clip.xy;
pos = offset;
}
Si può espandere su come esso "non funziona"? Oltre a non gestire la proporzione del punto o le proporzioni del viewport, nulla sembra immediatamente sbagliato. In realtà non sono sicuro degli array uniformi perché esiste un limite al numero di uniformi che puoi avere. Come imposti i loro valori? Usi buffer uniformi? – jozxyqk
Ignora che, [l'impostazione di un array uniforme] (http://stackoverflow.com/a/8100273/1888983) va bene, e sembra che non si esauriranno le posizioni date [almeno 1024] (https://www.opengl.org/wiki/Uniform_(GLSL)), ma potresti voler guardare gli oggetti buffer uniformi. – jozxyqk
Grazie per la risposta, il problema è che lo shader disegna tutti i cerchi in nero. Da quello che posso ottenere, ci sono alcuni problemi con il valore di d. Ecco cosa ottengo: [Immagine] (http://i.imgur.com/TIZ0TIq.png) – Giuseppe