流体シミュレータの移流プログラムの奇妙な問題


7

2D流体シミュレータを実装しました。ソルバーは完全にGPUで実行されます。すべて正常に動作します...私の仕事用PCで。しかし、自宅のPCではひどい不具合があり、それらを修正する方法を理解できません。経験的に、問題がadvectプログラムのどこかにローカライズされていることを発見しました。これは、私がビデオを統合した仕事で、そして自宅で— NVIDIA GeForce 9800 GTは非常に奇妙な原因です。次に、advectプログラムのGLSLソースを示します(明確にするために一部の行が省略されています)。

#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;
}

そしていくつかのスクリーンショット。

仕事用PC:

2つ以上の流体の混合のような渦巻く色のビュー

自宅のPC:

類似色の歪んだ表示、明らかにエラー


これは、ベクトル場の視覚化のように見え、概念的には問題ないようです。バッファがどこかでスワップされていますか、またはこれは単一のシミュレーションステップですか?興味深い分野からの興味深い質問、うまくいけば誰かがこれに答えてくれるでしょう。デバッグするには、ユニフォームが正しく渡されているかどうかを確認します。ユニフォームの代わりに定数/浮動小数点を使用して、違いを確認します。
teodron 2012

これは、単一のシミュレーション手順です。C ++関数Advect()があります。ターゲットテクスチャ、量テクスチャ(q)、速度テクスチャを受け取ります。私はあなたのアドバイスに従い、ユニフォームの代わりにconstを使用しようとしましたが、結果は同じです。
iodiot 2012

2
困難な問題uそこに
到達

2
@iodiot何か悪いことをしたのかもしれません。統合されたドライバーは、NVidiaよりも許容度が高くなります。
Bartek Banachewicz 2013

2
前と後に質問に答えてもらえますか?将来この課題に直面する人にとって、とても役立つと思います。
AturSams 2014年

回答:


1

OPの応答ごとに、

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

ために

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

問題を解決しました。場と密度はスムーズ(0.01, 0.01)方向に移動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.