首页 > 解决方案 > 使用顶点着色器进行图像旋转

问题描述

我有一些顶点着色器,我发帖关注。
它接收目标纹理的角度、缩放以及宽度和高度,其中可能包括旋转的源纹理。
问题是,在销售某些角度的图像时,图像会超出目标纹理。
按照我有两次旋转的结果。
10个毕业生和-20个毕业生。

顶点着色器

cbuffer VS_ROTATE : register (b0)
{
   float fxAngle;
   float fyAngle;
   float fzAngle;
   float fScale;
   float fWidthSrc;
   float fHeightSrc;
   float offset;
};
struct VS_INPUT
{
    float4 Pos : POSITION;
    float2 Tex : TEXCOORD;
    uint   TexIdx : TEXINDEX;
};

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
    uint   TexIdx : TEXINDEX;
};

VS_OUTPUT VS(VS_INPUT input)
{
   VS_OUTPUT output;
   output.Pos = input.Pos;
    output.Tex = input.Tex;
    output.TexIdx = input.TexIdx;
   if (fxAngle == 0.0 && fyAngle == 0.0 && fzAngle == 0.0)
        return output;
    float fxRadAngle = radians(fxAngle);
    float fyRadAngle = radians(fyAngle);
    float fzRadAngle = radians(fzAngle);

    float2 ptPos = input.Pos.xy;
    float2 ptOrigin = ptPos;
    ptOrigin.x = (ptOrigin.x - 0.5) * fWidthSrc;
    ptOrigin.y = (ptOrigin.y - 0.5) * fHeightSrc;
    ptPos.x = ptOrigin.x * cos(fzRadAngle) - ptOrigin.y * sin(fzRadAngle);
    ptPos.y = ptOrigin.x * sin(fzRadAngle) + ptOrigin.y * cos(fzRadAngle);
    ptPos.x = ptPos.x / fWidthSrc;
    ptPos.y = ptPos.y / fHeightSrc;
    ptPos.x = ptPos.x * fScale + 0.5;
    ptPos.y = ptPos.y * fScale + 0.5;

    output.Pos.xy = ptPos.xy;
    return output;
};

10个毕业生

10个毕业生

-20 格

-20 毕业生

标签: c++hlsl

解决方案


推荐阅读