graphics - 如何将此 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;
}
解决方案
该着色器是错误的并且可能未经测试,因为它也有语法错误。这样的事情应该可以解决问题:
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
在适当的位置偏移圆心,然后检查坐标是否在圆外以及它们是否在圆的“角侧”。
推荐阅读
- angular - 在不使用 getRawValue 的情况下获取唯一的 FormGroup/Control 值
- python-3.x - Python将标签添加到父小部件
- java - jedispool getResource 消耗太多延迟
- python - 在 DARKNET 培训期间获得 -NaN,我做错了什么?
- javascript - 有条件地分配数组索引
- java - 我怎样才能循环这个决策结构?
- webpack - Webpack:如何为 ES5 构建浏览器文件和为 Node:current 构建服务器文件
- php - Windows 2019 和 PHP 7.3:“session_start(): ps_files_cleanup_dir: opendir failed: No such file or directory (2)”
- c# - Web Scraper 未返回正确的 URL
- struct - 在通用 lisp 中将结构传递给宏的类型错误