Несколько простых вопросов XNA / HLSL - PullRequest
11 голосов
/ 01 октября 2011

В последнее время я увлекаюсь программированием на HLSL, и мне очень любопытно, КАК некоторые вещи, которые я делаю, действительно работают.

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

sampler2D mySampler;

float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR
{
    float4 Color;
    Color = tex2D(mySampler, texCoords.xy);

    if(Color.r == 0 && Color.g == 1.0 && Color.b == 1.0)
    {
        Color.r = 1.0;
        Color.g = 0.5;
        Color.b = 0.5;
    }
    return Color;
}

technique Simple
{
    pass pass1
    {
        PixelShader = compile ps_2_0 MyPixelShader();
    }
}

Я понимаю, что функция tex2D захватывает цвет пикселя в указанном месте, но я не понимаю, как mySampler даже имеет какие-либо данные. Я не устанавливаю и не передаю текстуру вообще, но она волшебным образом содержит данные моей текстуры.

Кроме того, в чем разница между такими вещами, как: COLOR и COLOR0 или же TEXCOORD и TEXCOORD0

Я могу сделать логическое предположение и сказать, что COLOR0 - это реестр в сборке, который содержит используемый в данный момент цвет пикселей в графическом процессоре. (это может быть совершенно неправильно, я просто заявляю, что я думаю)

И если так, значит ли это, что указание что-то вроде float2 texCoords : TEXCOORD0 по умолчанию захватит текущую позицию, которую обрабатывает графический процессор?

1 Ответ

7 голосов
/ 01 октября 2011

mySampler назначен в регистр семплов, первый - S0.

SpriteBatch использует тот же регистр для рисования текстур, поэтому вы наверняка его инициализировали раньше.

этот регистр связан с массивами GraphicDevice.Textures и GraphicDevice.SamplerStates.

На самом деле, в вашем шейдере вы можете использовать это предложение:

 sampler TextureSampler : register(s0);

EDIT:

если вам нужно использовать в шейдере вторую текстуру, вы можете сделать это:

 HLSL
      sampler MaskTexture : register(s1);

 C#:
      GraphicsDevice.Textures[1] = MyMaskTexture;
      GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode....

Color0 не является реестром и не содержит текущий цвет пикселя. Это относится к используемой вами структуре вершин.

Когда вы определяете вершину как VertexPositionColor, вершина содержит Position и Color, но если вы хотите определить собственную вершину с двумя цветами, вам нужен способ различения двух цветов ... каналов .

Суффикс числа означает канал, на который вы ссылаетесь в текущей вершине.

...