首页 > 解决方案 > 如何将此 HLSL 像素着色器更正为四边形的圆角?

问题描述

我想要制作一个可以绕四边形角的 HLSL 像素着色器。我尝试通过以下方式移植此GLSL 示例:

cbuffer CBuf : register(b0)
{
    float4 color;
    float2 dimensions;
    float radius;
    float na;
};

struct VSOut
{
    float4 pos    : SV_POSITION;
    float2 uv     : UV;
    uint   viewId : SV_RenderTargetArrayIndex;
};

float4 main(VSOut input) : SV_TARGET
{
    float2 coords = input.uv * dimensions;
    if 
    (
        length(coords)                           < radius ||
        length(coords - float2(0, dimensions.y)) < radius ||
        length(coords - float2(dimensions.x, 0)) < radius ||
        length(coords - dimensions)              < radius
    )
    {
        discard;
    }
    
    return color;
}

我最终得到的是:但我正在寻找更多的圆角矩形形状。 在此处输入图像描述

标签: graphics3ddirectxhlslpixel-shader

解决方案


该着色器是错误的并且可能未经测试,因为它也有语法错误。这样的事情应该可以解决问题:

bool ShouldDiscard(float2 coords, float2 dimensions, float radius)
{
        float2 circle_center = float2(radius, radius);

        if(length(coords - circle_center) > radius 
        && coords.x < circle_center.x && coords.y < circle_center.y) return true; //first circle
        
        circle_center.x += dimensions.x - 2*radius;
        
        if(length(coords - circle_center) > radius 
        && coords.x > circle_center.x && coords.y < circle_center.y) return true; //second circle
        
        circle_center.y += dimensions.y - 2*radius;
    
        if(length(coords - circle_center) > radius 
        && coords.x > circle_center.x && coords.y > circle_center.y) return true; //third circle
        
        circle_center.x -= dimensions.x - 2*radius;
        
        if(length(coords - circle_center) > radius 
        && coords.x < circle_center.x && coords.y > circle_center.y) return true; //fourth circle
        
        return false;
        
}

float4 main(VSOut input) : SV_TARGET
{
    float2 coords = input.uv * dimensions;
    if (ShouldDiscard(coords, dimensions, radius))
        discard;
    return color;
}

该函数ShouldDiscard在适当的位置偏移圆心,然后检查坐标是否在圆外以及它们是否在圆的“角侧”。


推荐阅读