Как данные вершин используются в пиксельных шейдерах - PullRequest
0 голосов
/ 04 апреля 2020

Треугольник имеет 3 вершины. Пиксельный шейдер получает данные от вершинного шейдера. Если каждая вершина имеет свой цвет, переход вычисляется между цветами.

Это вычисление такого перехода, делает ли он это для всех данных, которые пиксельный шейдер получает от вершинного шейдера?

Например, возьмите текстурированный треугольник и точечный свет. Расстояние от точечного света до каждой вершины вычисляется в вершинном шейдере. Это передается в пиксельный шейдер. В пиксельном шейдере он берет цвет из текстуры и выполняет некоторые расчеты света. Это делает это 3 раза для пикселя, а затем принимает средний цвет?

Спасибо,

1 Ответ

0 голосов
/ 10 апреля 2020

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

struct VSInput
{
    float4 Position : SV_Position;
    float3 Normal   : NORMAL;
    float2 TexCoord : TEXCOORD0;
};

struct VSOutput
{
    float2 TexCoord   : TEXCOORD0;
    float4 PositionWS : TEXCOORD1;
    float3 NormalWS   : TEXCOORD2;
    float4 Diffuse    : COLOR0;
    float4 PositionPS : SV_Position;
};

// Vertex shader
VSOutput VertexShader(VSInput vin)
{
    VSOutput vout;

    vout.TexCoord = vin.TexCoord;
    vout.PositionPS = mul(position, WorldViewProj);
    vout.PositionWS = mul(position, World).xyz;
    vout.NormalWS = normalize(mul(normal, WorldInverseTranspose));
    vout.Diffuse = float4(1, 1, 1, DiffuseColor.a);

    return vout;
}

struct PSInput
{
    float2 TexCoord   : TEXCOORD0;
    float4 PositionWS : TEXCOORD1;
    float3 NormalWS   : TEXCOORD2;
    float4 Diffuse    : COLOR0;
};

float4 PixelShader(PSInput pin) : SV_Target0
{
    float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse;

    float3 eyeVector = normalize(EyePosition - pin.PositionWS.xyz);
    float3 worldNormal = normalize(pin.NormalWS);

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);

    color.rgb *= lightResult.Diffuse;

    AddSpecular(color, lightResult.Specular);
    ApplyFog(color, pin.PositionWS.w);

    return color;
}

Это взято из DirectX Tool Kit шейдеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...