Problema estranho com programa avançado no simulador de fluidos


7

Eu implementei o simulador de fluido 2d. O Solver é executado inteiramente na GPU. Tudo funciona bem ... no meu PC de trabalho. Mas no PC doméstico, tenho algumas falhas terríveis e não consigo entender como corrigi-las. Empiricamente, descobri que o problema está localizado em algum lugar do programa avançado . Essa é uma causa muito estranha no trabalho, integrei vídeo e em casa - NVIDIA GeForce 9800 GT. Aqui está a fonte GLSL do programa de advect (algumas linhas foram descartadas para maior clareza):

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

E algumas capturas de tela.

PC de trabalho:

visualização de cores em movimento, como dois ou mais fluidos

PC doméstico:

visão distorcida de cores semelhantes, claramente errada


Parece a visualização de um campo vetorial e parece ok, conceitualmente. Existem buffers trocados em algum lugar ou isso é apenas uma única etapa de simulação? Pergunta interessante de um campo interessante, espero que alguém responda a isso. Para depurá-lo, eu verificaria se meus uniformes são passados ​​corretamente: use constantes / flutuadores em vez de uniformes e veja a diferença.
Teodron # 21/12

Esta é apenas uma única etapa de simulação. Eu tenho uma função C ++ Advect (). É preciso textura alvo, quantidade textura (q) e textura de velocidade. Segui o seu conselho e tentei usar consts em vez de uniformes, mas o resultado é o mesmo.
Iodiot 21/04

2
Problema difícil u chegou lá, P = NP (piada)
Xiaochuan Yu

2
@iodiot Você pode ter invocado algo ruim. Drivers integrados podem ser mais permissivos que a NVidia.
Bartek Banachewicz

2
Você poderia responder à pergunta com um antes e um depois? Eu acho que seria muito útil para quem enfrentar esse desafio no futuro.
AturSams

Respostas:


1

Pela resposta do OP, substituindo

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

para

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

resolveu o problema. O campo e a densidade se movem suavemente na (0.01, 0.01)direção.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.