Seltsames Problem mit dem Advect-Programm im Flüssigkeitssimulator

7

Ich habe einen 2D-Flüssigkeitssimulator implementiert. Solver läuft vollständig auf der GPU. Alles funktioniert gut ... auf meinem Arbeits-PC. Aber auf dem Heim-PC habe ich einige schreckliche Störungen, und ich kann nicht verstehen, wie ich sie beheben kann. Empirisch entdeckte ich, dass das Problem irgendwo im Advect- Programm lokalisiert ist . Dies ist eine sehr seltsame Ursache, da ich bei der Arbeit Video integriert habe und zu Hause - NVIDIA GeForce 9800 GT. Hier ist die GLSL-Quelle des Advect-Programms (einige Zeilen wurden aus Gründen der Übersichtlichkeit gelöscht):

#version 130

out vec3 value;

uniform sampler2D q;
uniform sampler2D velocity;
uniform float dt;
uniform float inverseSize;

void main()
{   
  vec2 p = gl_FragCoord.xy * inverseSize; 

  vec2 np = p - dt * texture(velocity, p).xy;

  value = texture(q, np).xyz;
}

Und einige Screenshots.

Arbeits-PC:

Ansicht von wirbelnden Farben wie das Mischen von zwei oder mehr Flüssigkeiten

Heim-PC:

verzerrte Ansicht ähnlicher Farben, eindeutig fehlerhaft

Jodiot
quelle
Es sieht aus wie die Visualisierung eines Vektorfeldes und scheint konzeptionell in Ordnung zu sein. Werden irgendwo Puffer ausgetauscht oder ist dies nur ein einzelner Simulationsschritt? Interessante Frage aus einem interessanten Bereich, hoffentlich wird jemand diese beantworten. Um es zu debuggen, würde ich überprüfen, ob meine Uniformen korrekt übergeben werden: Verwenden Sie Konstanten / Floats anstelle von Uniformen und sehen Sie den Unterschied.
Teodron
Dies ist nur ein einziger Simulationsschritt. Ich habe eine C ++ - Funktion Advect (). Es werden Zieltextur, Quantitätstextur (q) und eine Geschwindigkeitstextur benötigt. Ich habe Ihren Rat befolgt und versucht, Konstanten anstelle von Uniformen zu verwenden, aber das Ergebnis ist das gleiche.
Jodiot
2
Schwieriges Problem du
bist dort angekommen
2
@iodiot Du hast vielleicht etwas Schlimmes angerufen. Integrierte Treiber können freizügiger sein als NVidia.
Bartek Banachewicz
2
Könnten Sie die Frage mit einem Vorher und Nachher beantworten? Ich denke, es wäre sehr nützlich für jeden, der sich dieser Herausforderung in Zukunft stellt.
AturSams

Antworten:

1

Gemäß der Antwort des OP wird ersetzt

vec2 np = p - dt * texture(velocity, p).xy;

zum

vec2 np = p - dt * vec2(0.01);

Problem gelöst. Das Feld und die Dichte bewegen sich gleichmäßig in die (0.01, 0.01)Richtung.

user1430
quelle