Пиксельный шейдер странного поведения - PullRequest
0 голосов
/ 30 октября 2019

У меня есть пиксельный шейдер, который создает текстуру следующим образом.
Он получает рассчитанные синус и косинус угла, ширину и высоту прямоугольника.
Параметры передаются через постоянный буфер.
Я пытаюсь повернутькакая-то картинка до 10 град.

Texture2D tx : register( t0 );
SamplerState sampler_in : register( s0 );
cbuffer PS_ROTATE : register (b0)
{
    float fCosAlpha;
    float fSinAlpha;
    float fWidthSrc;
    float fHeightSrc;
    float fScale;
};
struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
};
float4 PS(PS_INPUT input) : SV_Target
{
    float2 ptOrigin = input.Tex;
    float2 ptPos = ptOrigin;
    ptOrigin.x = (ptOrigin.x - 0.5) * fWidthSrc;
    ptOrigin.y = (ptOrigin.y - 0.5) * fHeightSrc;
    ptPos.x = ptOrigin.x * fCosAlpha - ptOrigin.y * fSinAlpha;
    ptPos.y = ptOrigin.x * fSinAlpha + ptOrigin.y * fCosAlpha;
    ptPos.x = ptPos.x / fWidthSrc;
    ptPos.y = ptPos.y / fHeightSrc;
    ptPos.x = ptPos.x / fScale + 0.5;
    ptPos.y = ptPos.y / fScale + 0.5;
    float4 pxRGB = float4( 0.0, 0.0, 0.0, 0.0 );
    if( ptPos.x >= 0 && ptPos.x <= 1 && ptPos.y >= 0 && ptPos.y <= 1 )
        pxRGB = tx.Sample(sampler_in, ptPos);
    return pxRGB;
};

good texture

Но если я внесу какое-то изменение, которое может не иметь значения, текстура будет выглядеть следующим образом.

    ptPos.x = (ptPos.x - 0.5) * fWidthSrc;
    ptPos.y = (ptPos.y - 0.5) * fHeightSrc;
    ptPos.x = ptPos.x * fCosAlpha - ptPos.y * fSinAlpha;
    ptPos.y = ptPos.x * fSinAlpha + ptPos.y * fCosAlpha;

bad texture

...