В XNA SpriteBatch
предоставляет собственный вершинный шейдер. Поскольку в Silverlight 5 нет SpriteBatch
, вы должны предоставить свой собственный.
Возможно, вы захотите посмотреть исходный код для шейдера, который SpriteBatch
использует (он находится в SpriteEffect.fx
). Вот его вершинный шейдер, он довольно прост:
void SpriteVertexShader(inout float4 color : COLOR0,
inout float2 texCoord : TEXCOORD0,
inout float4 position : SV_Position)
{
position = mul(position, MatrixTransform);
}
Так что теперь вам просто нужны входная позиция и матрица преобразования (и координаты текстуры, но они довольно просты).
В том же сообщении в блоге, которое вы связали , в конце рассказывается, как настроить матрицу ( также здесь ). Вот оно снова:
Matrix projection = Matrix.CreateOrthographicOffCenter(0, viewport.Width, viewport.Height, 0, 0, 1);
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);
Matrix transformation = halfPixelOffset * projection;
(Примечание: я не уверен, что Silverlight действительно требует полупиксельного смещения для поддержания выравнивания текселей ( ref ). Вероятно, так и есть.)
Хитрость заключается в том, что позиционирование спрайта выполняется вне шейдера, на процессоре. Вот порядок действий SpriteBatch
:
- Начните с четырех вершин в прямоугольнике, где (0,0) - верхний левый угол, а текстуры (ширина, высота) - нижний правый
- Перевести назад по происхождению
- Масштаб
- Поворот
- Перевести на должность
Это помещает вершины спрайта в «пространство клиента», а затем матрица преобразования преобразует эти вершины из пространства клиента в пространство проекции (которое используется для рисования).
У меня есть версия этого преобразования с высокой степенью точности в ExEn (SpriteBatch.InternalDraw
в SpriteBatchOpenGL.cs
), которую вы можете легко адаптировать для своего использования.