it-swarm.com.de

Wie bekomme ich Pixelinformationen in einem Fragment-Shader?

In meinem Fragment Shader kann ich eine Textur laden, dann mache ich das:

uniform sampler2D tex;

void main(void) {
   vec4 color = texture2D(tex, gl_TexCoord[0].st);
   gl_FragColor = color;
}

Das setzt das aktuelle Pixel auf den Farbwert der Textur. Ich kann diese ändern, usw. und es funktioniert gut.

Aber ein paar Fragen. Wie erkenne ich, "welcher" Pixel ich bin? Angenommen, ich möchte Pixel 100.100 (x, y) auf Rot setzen. Alles andere zu schwarz. Wie mache ich ein:

"wenn currentSelf.Position () == (100,100); dann color = red; sonst color = black?"

?

Ich weiß, wie man Farben einstellt, aber wie erhalte ich "meinen" Standort?

Zweitens, wie erhalte ich Werte von einem Nachbarpixel?

Ich habe es versucht:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);

Aber nicht klar, was es zurückkehrt? wenn ich Pixel 100.100 bin; Wie erhalte ich die Werte von 101.100 oder 100.101?

24
user697111

Wie sage ich "um welches Pixel" ich bin?

Du bist kein Pixel. Du bist ein Fragment . Es gibt einen Grund, warum OpenGL sie "Fragment-Shader" nennt. Das liegt daran, dass sie keine Pixel sind noch . Tatsächlich dürfen sie nicht nur zu Pixeln werden (über discard oder Tiefenprüfungen oder was auch immer), dank Multisampling können sich mehrere Fragmente zu einem single pixel zusammenschließen.

Wenn Sie wissen möchten, wo sich Ihr Fragment-Shader im Fensterbereich befindet, verwenden Sie gl_FragCoord . Fragmentpositionen sind Gleitkommawerte und keine Ganzzahlen. Sie müssen also einen Bereich anstelle eines einzelnen Werts "100, 100" testen.

Zweitens, wie bekomme ich Werte von einem Nachbarpixel?

Wenn Sie vom benachbarten Framebuffer-Pixel sprechen, sind Sie nicht . Fragment-Shader können nicht willkürlich aus dem Framebuffer lesen, entweder in ihrer eigenen Position oder in einer benachbarten Position.

Wenn Sie über den Zugriff auf ein benachbartes Texel von dem, auf den Sie zugegriffen haben, sprechen, müssen Sie nur die Texturkoordinate beeinflussen, die Sie an texture2D übergeben. Sie müssen die Größe der Textur ermitteln (da Sie nicht GLSL 1.30 oder höher verwenden, müssen Sie diese manuell übergeben), die Größe invertieren und diese Größen entweder der S- und T-Komponente der Texturkoordinate hinzufügen oder von dieser subtrahieren .

29
Nicol Bolas

Kinderleicht.

Berechnen Sie einfach die Größe eines Pixels basierend auf der Auflösung. Suchen Sie dann +1 und -1.

vec2 onePixel = vec2(1.0, 1.0) / u_textureSize;
gl_FragColor = (
   texture2D(u_image, v_texCoord) +
   texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) +
   texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0))) / 3.0;

Es gibt ein gutes Beispiel hier

1
newshorts