Расчет УФ координат в доменном шейдере - PullRequest
0 голосов
/ 28 февраля 2019

Я пытался реализовать учебник по ландшафту во Введении к программированию игр Фрэнка Луны.Мне удалось реализовать его с помощью файла эффекта.

Когда я пытаюсь разделить шейдеры Vertex, оболочки, домена и пикселя, я получаю очень странное поведение в текстурах ландшафта.После отладки я понял, что проблема в расчете координат текстуры UV в доменном шейдере.

Вот как я вычисляю координаты UV.

[domain("quad")]    
DomainOut main(PatchTess patchTess,
float2 uv : SV_DomainLocation,
const OutputPatch<HullOut, 4> quad)
{
DomainOut dout;

// Bilinear interpolation.
dout.PosW = lerp(
    lerp(quad[0].PosW, quad[1].PosW, uv.x),
    lerp(quad[2].PosW, quad[3].PosW, uv.x),
    uv.y);

dout.Tex = lerp(
    lerp(quad[0].Tex, quad[1].Tex, uv.x),
    lerp(quad[2].Tex, quad[3].Tex, uv.x),
    uv.y);

// Tile layer textures over terrain.
dout.TiledTex = dout.Tex * 50.0f;

dout.TiledTex = dout.Tex*50.0f;

// Displacement mapping
dout.PosW.y = gHeightMap.SampleLevel(samHeightmap, dout.Tex, 0).r;

// NOTE: We tried computing the normal in the shader using finite difference, 
// but the vertices move continuously with fractional_even which creates
// noticable light shimmering artifacts as the normal changes.  Therefore,
// we moved the calculation to the pixel shader.  

// Project to homogeneous clip space.
dout.PosH = mul(float4(dout.PosW, 1.0f), gViewProj);

return dout;
}

Я использую квадраты для доменашейдер.

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

В чем может быть проблема?

This is the image of my implementation

This is the original image

У меня есть обновление, которым я могу поделиться с вами, Поток данных, который входит в доменшейдер отличается от файла эффекта от отдельных файлов.Это не уравнение для расчета.

Что отличает поток данных, есть ли способ изменить порядок исправлений, поступающих в шейдер домена из шейдера Халла.

Это код пиксельного шейдера:

    Texture2DArray gLayerMapArray : register(t3);
    Texture2D gBlendMap : register(t1);

    SamplerState samLinear
    {
        Filter = MIN_MAG_MIP_LINEAR;

    AddressU = WRAP;
    AddressV = WRAP;
    AddressW = WRAP;
};

struct DomainOut
{
    float4 PosH     : SV_POSITION;
    float3 PosW     : POSITION;
    float2 Tex      : TEXCOORD0;
    float2 TiledTex : TEXCOORD1;
};


float4 main(DomainOut pin) : SV_Target
{
    //
    // Texturing
    //
    float4 c0 = gLayerMapArray.Sample(samLinear, float3(pin.TiledTex, 0.0f));
    float4 c1 = gLayerMapArray.Sample(samLinear, float3(pin.TiledTex, 1.0f));
    float4 c2 = gLayerMapArray.Sample(samLinear, float3(pin.TiledTex, 2.0f));
    float4 c3 = gLayerMapArray.Sample(samLinear, float3(pin.TiledTex, 3.0f));

    // Sample the blend map.
    float4 t = gBlendMap.Sample(samLinear, pin.Tex);

    // Blend the layers on top of each other.
    float4 texColor = c0;
    texColor = lerp(texColor, c1, t.r);
    texColor = lerp(texColor, c2, t.g);
    texColor = lerp(texColor, c3, t.b);
    return texColor;
}

1 Ответ

0 голосов
/ 02 марта 2019

Наконец, решение состоит в том, что я должен установить сэмплер из кода C ++, даже если у вас есть сэмплер в шейдере.Я не знаю почему, но это решило проблему.

...