HLSL、特に構文について適切な説明を提供する優れたチュートリアルはありますか? レジスタ (s0) を示すサンプルと tex0 を示すサンプルを提示されたとき、私は唖然としました。これらは常に同じですか? MSDN のドキュメントはマニュアルのように読みやすく、従うのは簡単ではありません。
私は HLSL の初心者であり、HLSL 用のカスタム LINQ プロバイダーを実装しようとしています (詳細)。これまでのところ、動作していますが、ほとんどの場合に失敗すると確信しています。
私の Linq プロバイダーは、LINQ クエリを HLSL に変換してコンパイルすることになっています。このクエリを考えると (このシェーダーは 3 つの画像から HDR 画像を作成します):
Texture texSampler1 = GraphicsContext.Textures[0];
Texture texSampler2 = GraphicsContext.Textures[1];
Texture texSampler3 = GraphicsContext.Textures[2];
float threshold = 0.33f;
var shader = from input in GraphicsContext.Pixel
let pos = input.GetMember<float2>("pos")
let color1 = HlslMethods.tex2D(texSampler1, pos)
let color2 = HlslMethods.tex2D(texSampler2, pos)
let color3 = HlslMethods.tex2D(texSampler3, pos)
let avg1 = (color1.r + color1.g + color1.b) / 3
let avg2 = (color2.r + color2.g + color2.b) / 3
let avg3 = (color3.r + color3.g + color3.b) / 3
let thresholdMultiplicand = (1 / (HlslMethods.max(1 - threshold, threshold)))
let diff1 = Math.Abs(avg1 - threshold) * thresholdMultiplicand
let diff2 = Math.Abs(avg2 - threshold) * thresholdMultiplicand
let diff3 = Math.Abs(avg3 - threshold) * thresholdMultiplicand
select new
{
Color = ( color1 * (1f - diff1 + diff2 + diff3) +
color2 * (1f - diff1 - diff2 + diff3) +
color3 * (1f + diff1 + diff2 - diff3)) / 3
};
この HLSL シェーダーになるはずです。
sampler2D texSampler1 : register(s0);
sampler2D texSampler2 : register(s1);
sampler2D texSampler3 : register(s2);
struct MyPixelShader2Input
{
float2 pos : TEXCOORD0;
};
float4 MyPixelShader2(MyPixelShader2Input input) : COLOR
{
float2 pos = input.pos;
float4 color1 = tex2D(texSampler1, pos);
float4 color2 = tex2D(texSampler2, pos);
float4 color3 = tex2D(texSampler3, pos);
float avg1 = (((color1.r + color1.g) + color1.b) / 3);
float avg2 = (((color2.r + color2.g) + color2.b) / 3);
float avg3 = (((color3.r + color3.g) + color3.b) / 3);
float thresholdMultiplicand = (1 / max((1 - 0.33), 0.33));
float diff1 = (abs((avg1 - 0.33)) * thresholdMultiplicand);
float diff2 = (abs((avg2 - 0.33)) * thresholdMultiplicand);
float diff3 = (abs((avg3 - 0.33)) * thresholdMultiplicand);
float4 output = ((((color1 * (((1 - diff1) + diff2) + diff3)) + (color2 * (((1 - diff1) - diff2) + diff3))) + (color3 * (((1 + diff1) + diff2) - diff3))) / 3);
return output;
}
私が今問題を抱えているのは、主にセマンティクス、特に値セマンティクスです (それらを使用した例はあまり見つかりません)。実際の例も非常に役立ちます。そこで使われているシェーダーの種類がわかりません。