ddx(hlsl)は実際に何をしますか?


17

私は少し混乱しています。公式ドキュメント(http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx)は、ddx(input)が入力の部分的な派生物であると述べています「スクリーン空間のx座標」に。

私の計算は問題ありませんが、入力が何から来ているのかをどのように判断できますか?それに関数を渡した場合、それは何をするか想像できますが、数値の導関数は常にゼロです...?

それは単なるスケーリングですか?たとえば、これはこの距離でサイズの10分の1にスケーリングされるため、1/10を返しますか?しかし、その後、それは入力を必要としません...

誰かが実際に何が起こっているのか簡単に説明できますか?


2
ddxそしてddy、あなたが自分で行うことができないという魔法を行います。ピクセルシェーダー内から取得できないラスタライズパイプラインからの追加情報にアクセスできます。どの式を使用するのか正確にはわかりません。私は彼らが推定手法を使用していると信じるようになりましたが、私は確かに知りません。
ショーンミドルディッチ

それは非常に奇妙ですが、それでもです。ddx(5)は実際に何を表していますか?.1と表示されている場合、どのように解釈すればよいですか?または-6?
リチャードラスト

1
ddx(5)無意味です。入力値で使用すると、ブロック内の隣接ピクセルに関するその値の導関数が得られます。繰り返しますが、値をどの程度正確に計算するかはわかりませんが、非入力の導関数を求めるのは未定義の動作であり、ゴミを生成する可能性があります。fgiesen.wordpress.com/2011/07/10 / ...を参照してください。
ショーンミドルディッチ

確かではありませんが、HLSLコンパイラが実際にddx / ddyに渡す式の完全なシンボリックな差別化を行っているのかもしれません。blogs.msdn.com/b/chuckw/archive/2011/03/08/... research.microsoft.com/pubs/146019/...
Ziriax

それは何をするためのものか?ONLY明らかに少し合理的なもの、。
MickLH

回答:


32

内部的に、GPUは一度に1つのピクセルシェーダーのインスタンスを実行することはありません。最も細かいレベルでは、SIMDアーキテクチャを使用して、常に32〜64ピクセルを同時に実行しています。この中で、ピクセルはさらに2x2クワッドに編成されるため、SIMDベクトル内の4つの連続したピクセルの各グループは、画面上のピクセルの2x2ブロックに対応します。

デリバティブは、クワッド内のピクセル間の差を取ることによって計算されます。たとえばddx、クワッドの左側のピクセルの値を右側の値からddy減算し、上部のピクセルから下部のピクセルを減算します。差分は、クワッド内の4つのピクセルすべての微分として返されます。

ピクセルシェーダーはSIMDで実行されているため、対応する値がクワッド内のすべてのピクセルに対して同じレジスタに同時に存在することが保証されます。だから、どのような式または値あなたに置くddxか、ddy前述したように、それはクワッドのすべての4つの画素に評価され、その後、別のピクセルから値を引い。

したがって、定数値の導関数を取得すると、4つのピクセルすべてで同じ定数値であるため、ゼロが得られます(計算から予想されるとおりですよね?)。

また、「粗い」および「細かい」デリバティブ、ddx_coarse/ ddy_coarseおよびddx_fine/ があることに注意してくださいddy_fine。区別の説明はここに与えられます。単純なddx/ ddyは、大まかなバージョンのエイリアスです。

ところで、この機能が存在する理由は、ミップマップの選択と異方性フィルタリングを行うために、GPUが内部的にテクスチャ座標の導関数を取得する必要があるためです。とにかくハードウェアには機能が必要なので(シェーダーのテクスチャ座標に任意の式を使用できます)、シェーダープログラマーに直接公開するのも簡単でした。


+1; これは、摂動効果をテクスチャに適用するときに役立ちます。摂動したtexcoordsは色にゆがみを与えましたが、tex2Dgradを元の(摂動していない)texcoordsから派生したものを使用すると、ゆがんだ結果が得られませんでした。
マキシマスミニマス

さて、少し考えた後、私は自分の混乱を見つけたと思います。私の考えでddxは、従来のプログラミング言語の他のすべての機能と同様に機能します。入力を評価し、フロートなどに変換してから、外部関数(ddx)を実行します。ただし、これは異なります。入力文字列を受け取り、複数の場所で評価し、導関数を計算して、結果を報告します。それは正しいですか?
リチャードラスト

1
@RichardRastそうですね。valueではなく、渡しddxを操作すると考えることができます。
ネイサンリード

しかし、それはドキュメンテーションに含まれているほど奇妙です。私のプログラミング生活の中で、それが事実であった他の時間は考えられません。
リチャードラスト

Nathan Reedは、GPUがミップマップの選択にこれらの関数を使用することを述べました。また、それらを使用して、GPUに強制的に目的のミップマップレベルを選択させるか、不正確なミップレベル選択によるアーティファクトを防止することもできます。このプロセスは、Shader X3の163ページおよび164ページで説明されています。
ジェームズハウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.