Estou um pouco confuso. A documentação oficial ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx ) diz que ddx (entrada) é a derivada parcial da entrada com relação a para a "coordenada x do espaço na tela".
Meu cálculo é bom, mas como ele pode dizer de onde vem a entrada? Se eu aprovasse uma função, tudo bem, posso imaginar o que faria, mas a derivada de um número é sempre zero ...?
É apenas uma escala? Como, isso seria escalado para um décimo do seu tamanho a essa distância, então retorna um décimo? Mas então não precisa de uma entrada ...
Alguém pode dar uma explicação rápida do que realmente está acontecendo?
ddx
eddy
faça mágica que você não pode fazer sozinho. Eles têm acesso a informações adicionais do pipeline de rasterização que você não pode adquirir de dentro de um pixel shader. Não tenho certeza exatamente qual fórmula eles usam; Fui levado a acreditar que eles usam uma técnica de estimativa, mas não sei ao certo.ddx(5)
é meio inútil. Use-o com um valor de entrada, e isso fornecerá a derivada desse valor em relação aos pixels vizinhos em um bloco. Novamente, eu não sei exatamente como ele calcula valores, mas solicitar a derivada de uma não entrada pode muito bem ser apenas um comportamento indefinido e produzir lixo. Veja fgiesen.wordpress.com/2011/07/10/… para obter mais informações do que eu posso fornecer.Respostas:
Internamente, as GPUs nunca executam uma instância de um pixel shader por vez. No nível mais fino de granularidade, eles estão sempre executando de 32 a 64 pixels ao mesmo tempo, usando uma arquitetura SIMD. Dentro disso, os pixels são ainda organizados em quads 2x2, de modo que cada grupo de 4 pixels consecutivos no vetor SIMD corresponde a um bloco 2x2 de pixels na tela.
As derivadas são calculadas tomando-se diferenças entre os pixels em um quad. Por exemplo,
ddx
subtrai os valores nos pixels no lado esquerdo do quad dos valores no lado direito eddy
subtrai os pixels inferiores dos superiores. As diferenças podem então ser retornadas como derivada para todos os quatro pixels no quad.Como o sombreador de pixels está sendo executado no SIMD, é garantido que o valor correspondente esteja no mesmo registro ao mesmo tempo para todos os pixels no quad. Portanto, seja qual for a expressão ou o valor que você colocar
ddx
ouddy
será avaliado nos quatro pixels do quadrilátero, os valores de pixels diferentes serão subtraídos conforme descrito acima.Portanto, tirar a derivada de um valor constante dará zero (como seria de esperar do cálculo, certo?), Porque é o mesmo valor constante em todos os quatro pixels.
Observe também que existem derivadas "grossas" e "finas",
ddx_coarse
/ddy_coarse
eddx_fine
/ddy_fine
. Uma explicação da distinção é dada aqui . Simplesmenteddx
/ddy
são aliases para as versões grosseiras.BTW, o motivo dessa funcionalidade existir é que as GPUs internamente precisam obter derivadas das coordenadas de textura para fazer a seleção do mipmap e a filtragem anisotrópica. Como o hardware precisa da capacidade de qualquer maneira (você pode usar qualquer expressão arbitrária para coordenadas de textura em um sombreador), foi fácil o suficiente também expô-lo diretamente aos programadores de sombreador.
fonte
ddx
funciona como qualquer outra função em uma linguagem de programação tradicional; você avalia a entrada, transforma-a em um ponto flutuante ou o que for e, em seguida, executa a função externa (ddx
). Mas isso é diferente: pega a sequência de entrada , avalia-a em vários locais, calcula uma derivada e relata o resultado. Isso é certo?ddx
como operando na expressão que passa para ela, e não no valor .