Попытка реализовать поставщика LINQ to HLSL.Есть ли хорошие учебники по HLSL?В частности те, которые сосредоточены на синтаксисе - PullRequest
1 голос
/ 20 декабря 2010

Существуют ли какие-нибудь хорошие учебники для HLSL, которые дают хорошее объяснение синтаксиса? Я ошеломлен, когда представлены образцы, которые показывают регистр (s0) и те, которые показывают tex0, они всегда одинаковы? Документация MSDN читается как руководство, и за ней нелегко следовать.

Я абсолютный новичок в HLSL и пытаюсь реализовать собственный поставщик LINQ для HLSL ( details ), и пока он работает, но я уверен, что в большинстве случаев он не будет работать.

Мой провайдер Linq должен преобразовать запрос LINQ в HLSL и скомпилировать его. С учетом этого запроса (этот шейдер создает изображение 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;
}

У меня сейчас проблемы с главным образом семантикой, особенно семантикой значений (я не нашел много примеров, использующих их). Примеры из реального мира также были бы очень полезны. Я не уверен, какие шейдеры там используются.

1 Ответ

0 голосов
/ 30 декабря 2010

Из DXSDK:

Тип Регистр Описание:

  • b: постоянный буфер
  • t: текстура и буфер текстуры
  • c: буферсмещение
  • s: сэмплер
  • u: просмотр неупорядоченного доступа

Это для SM 5.0.Если вы ориентируетесь только на SM 4.0 или меньше, у вас нет БПЛА.Для SM 3.0 или менее нет четкого разделения между сэмплерами и текстурами.Мой совет - всегда использовать синтаксис регистра сэмплера (register(s0) совпадает с tex0).

...