如何解决如何将此 HLSL 像素着色器更正为四边形的圆角?
我想要制作一个可以使四边形的角变圆的 HLSL 像素着色器。我尝试通过以下方式移植此 GLSL example:
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;
}
解决方法
那个着色器是错误的,可能未经测试,因为它也有语法错误。 这样的事情应该可以解决问题:
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
将圆心偏移到适当的位置,然后检查坐标是否在圆外以及它们是否在圆的“角边”中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。