Mein Ziel ist es, ein Array von Punkten an den Shader zu übergeben, ihre Entfernung zum Fragment zu berechnen und sie mit einem Kreis mit einem Gradienten abhängig von dieser Berechnung zu malen.Uniform Punktarrays und Verwalten von Fragment Shader Koordinatensystemen
Zum Beispiel:
(Aus einem working example I set up on shader toy)
Leider ist es mir nicht klar, wie ich soll die Koordinaten für die Verarbeitung in den Shader übergeben berechnen und konvertieren.
Was ich derzeit versuche ist, zwei Array von Floats - eine für x-Positionen und eine für y-Positionen von jedem Punkt - an den Shader durch eine Uniform übergeben. Dann innerhalb des Shader durch jeden Punkt durchlaufen wie so:
#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);
}
Aber das funktioniert nicht - und ich glaube, es kann sein, weil ich versuche, mit der Pixel ohne sie richtig zu übersetzen Koordinaten zu arbeiten. Kann mir jemand erklären, wie man das macht?
Update:
Das aktuelle Ergebnis ist: Der Code der Skizze ist:
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]);
}
}
während der Vertex-Shader ist:
#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;
}
Können Sie erweitern, wie es „funktioniert nicht“? Abgesehen davon, dass die Punktskala oder das Bildfenster-Seitenverhältnis nicht gehandhabt wird, sieht nichts sofort falsch aus. Eigentlich bin ich mir über die uniformen Arrays nicht sicher, da die Anzahl der Uniformen begrenzt ist. Wie stellen Sie ihre Werte ein? Verwenden Sie einheitliche Puffer? – jozxyqk
Ignorieren Sie, dass [ein einheitliches Array festlegen] (http://stackoverflow.com/a/8100273/1888983) in Ordnung ist, und es sieht so aus, als ob Ihnen die angegebenen Orte nicht ausgehen [mindestens 1024] (https://www.opengl.org/wiki/Uniform_(GLSL)), aber Sie könnten sich auch gleichartige Pufferobjekte ansehen. – jozxyqk
Danke für die Antwort, das Problem ist, der Shader zeichnet alle Kreise schwarz. Von dem, was ich bekommen kann, gibt es einige Probleme mit dem Wert von d. Hier ist, was ich bekomme: [Image] (http://i.imgur.com/TIZ0TIq.png) – Giuseppe