返回
以方显圆,化方为圆?解析 ShaderJoy shader
前端
2024-01-03 21:04:24
效果图
算法简介
首先,我们需要将 uv 坐标换算到 [-0.5, 0.5] 之间。这是因为,GLSL 中的纹理坐标是以 [-0.5, 0.5] 为范围的。
vec2 uv = (fragCoord.xy - vec2(0.5)) / iResolution.xy;
然后,我们需要计算圆的半径。圆的半径等于纹理的宽度或高度的一半,具体取决于哪个更小。
float radius = min(iResolution.x, iResolution.y) / 2.0;
接下来,我们需要计算圆心。圆心位于纹理的中心。
vec2 center = vec2(0.0);
最后,我们需要计算每个像素距离圆心的距离。如果距离小于或等于半径,则该像素属于圆形;否则,该像素不属于圆形。
float distance = length(uv - center);
if (distance <= radius) {
// 该像素属于圆形
} else {
// 该像素不属于圆形
}
ShaderJoy shader
#version 300 es
// 输入变量
in vec2 fragCoord;
in vec2 texCoord;
// 输出变量
out vec4 outColor;
// 纹理变量
uniform sampler2D tex;
// 常量变量
const float PI = 3.1415926535897932384626433832795;
void main() {
// 将 uv 坐标换算到 [-0.5, 0.5] 之间
vec2 uv = (fragCoord.xy - vec2(0.5)) / iResolution.xy;
// 计算圆的半径
float radius = min(iResolution.x, iResolution.y) / 2.0;
// 计算圆心
vec2 center = vec2(0.0);
// 计算每个像素距离圆心的距离
float distance = length(uv - center);
// 如果距离小于或等于半径,则该像素属于圆形
if (distance <= radius) {
// 获取纹理颜色
vec4 color = texture(tex, texCoord);
// 输出颜色
outColor = color;
} else {
// 输出透明色
outColor = vec4(0.0, 0.0, 0.0, 0.0);
}
}
总结
在这篇文章中,我们学习了如何使用 ShaderJoy 来创建一个圆形着色器。我们还学习了如何将方形纹理转换为圆形纹理,以及如何使用几何着色器和顶点着色器来控制圆形的形状和位置。这些知识可以帮助我们创建各种各样的有趣的着色器效果。