【Unity3D Shader】学习笔记-UV画图

简介: 前言 本篇介绍在片段着色器中进行画图操作,主要使用极坐标的方式。具体极坐标方程就需要花时间去学习了,可以通过其中一两个公式进行详细的研究,这样大部分的曲线图就可以绘制出来了。一、心形线的方程:r = 1 - asinθ

【Unity3D Shader】学习笔记-UV画图


前言


   本篇介绍在片段着色器中进行画图操作,主要使用极坐标的方式。具体极坐标方程就需要花时间去学习了,可以通过其中一两个公式进行详细的研究,这样大部分的曲线图就可以绘制出来了。


一、心形线的方程:r = 1 - asinθ


微信图片_20220424150610.png


#define _ScaleSize 0.2
fixed3 heart_1(fixed x, fixed y)
{
    //计算θ角, y和x就是uv坐标(这里有做位移uv - (0.5,0.5)) 
    float theta = atan2(y , x);
    //通过心形公式计算出每个点(x,y)应该在心形上的r的长度。(_ScaleSize用于进行缩放)
    float r = (1 - sin(theta))*_ScaleSize;
    //计算点(x,y)到极点的真实距离。注意这里依然是(0,0)点为极点。上面只是对整个图形进行了平移
    float d1 = distance(fixed2(x, y), fixed2(0.0,0.0));
    //这里相当于一个if判断 当r大于d1的时候返回1,否则返回0 这就是心形内部的全部点
    float c = step(d1, r);
    // 采用简单绘制验证效果
    return fixed3(c, c, c);
}
fixed4 frag (v2f i) : SV_Target
{
    fixed2 uv = i.uv - 0.5;
    fixed3 col = heart_1(uv.x, uv.y);
    fixed4 finalCol = fixed4(col * _MainColor.rgb, 1.0);
    return finalCol;
}


   需要将UV坐标当成2维xy坐标,由于(0,0)点在左下角,因此需要进行移动到中心(0.5,0.5)位置。


二、另一个好看点的心形图


微信图片_20220424150615.png微信图片_20220424150618.png


   这里直接按照上图的公式进行了实现的代码函数。


fixed3 heart_2(fixed x, fixed y)
{
    float o = atan2(y, x);
    float sin_o = sin(o);
    float cos_o = cos(o);
    float l = sin_o * sqrt(abs(cos_o))/(sin_o + 1.4);
    float r = (l - 2*sin_o + 2) * _ScaleSize;
    float d1 = length(fixed2(x, y));
    float c = step(d1, r);
    return fixed3(c, c, c);
}


三、伯努利双纽线


微信图片_20220424150621.png微信图片_20220424150624.png


   实现代码如下


fixed3 lemniscate(fixed x, fixed y)
{
    float theta = atan2(y , x);
    float r = sqrt(4 * cos(2 * theta)) * _ScaleSize;
    float d1 = distance(fixed2(x, y), fixed2(0.0,0.0));
    float c = step(d1, r);
    return fixed3(c, c, c);
}


四、玫瑰线


微信图片_20220424150627.png

微信图片_20220424150631.png微信图片_20220424150634.png微信图片_20220424150637.png



   可以通过修改r计算的参数来得到更多不同叶子数的玫瑰线。


fixed3 rosedosventor(fixed x, fixed y)
{
    float theta = atan2(y , x);
    // 三叶的r计算
    //float r = 4 * sin(3 * theta) * _ScaleSize;
    // 四叶的r计算-注意增加了绝对值
    //float r = abs(4 * sin(2 * theta)) * _ScaleSize;
    // 四叶的r计算 -注意增加了绝对值
    float r = abs(4 * cos(2 * theta)) * _ScaleSize;
    float d1 = distance(fixed2(x, y), fixed2(0.0,0.0));
    float c = step(d1, r);
    return fixed3(c, c, c);
}


   更多画图可以根据不同的曲线公式进行编写,有兴趣的同学可以试试下面这个曲线要怎么画。


微信图片_20220424150639.png

相关文章
|
9天前
|
存储 图形学
【Unity Shader 消融效果_案例分享】
【Unity Shader 消融效果_案例分享】
|
9天前
|
图形学
【Unity Shader 描边效果_案例分享】
【Unity Shader 描边效果_案例分享】
|
9天前
|
图形学 C++
【Unity Shader入坑篇---有ASE创建Unity Shader,那么Unity Shader代码的相关知识还有必要学或了解吗?】
【Unity Shader入坑篇---有ASE创建Unity Shader,那么Unity Shader代码的相关知识还有必要学或了解吗?】
|
7月前
|
存储 图形学
浅谈Unity之模型裁剪shader
Unity之模型裁剪shader
|
图形学
Unity Shader Graph 制作车流效果(UV滚动)
Unity Shader Graph 制作车流效果(UV滚动)
680 0
Unity Shader Graph 制作车流效果(UV滚动)
|
图形学
Unity Shader Graph 制作 Fade 淡入淡出效果
Unity Shader Graph 制作 Fade 淡入淡出效果
523 1
Unity Shader Graph 制作 Fade 淡入淡出效果
|
机器人 C# 图形学
Unity Shader Graph 制作Dissolve溶解效果
Unity Shader Graph 制作Dissolve溶解效果
196 0
Unity Shader Graph 制作Dissolve溶解效果
|
图形学
Unity Shader Graph 制作扫光效果
Unity Shader Graph 制作扫光效果
460 0
Unity Shader Graph 制作扫光效果
|
图形学
【Unity3D Shader】学习笔记-纹理采样①
前言 纹理采样属于在片段着色器中进行,通过提供的贴图和uv坐标使用tex2D进行采样。本篇主要介绍对同一纹理多次采样然后进行混合来获得不同的效果。 [声明:本笔记系列文章的图片资源都源自百度图片搜索,如有问题联系我] 一、简单重影 对同一纹理进行两次采样,采样时的UV两次坐标不一样,然后将采样的结果进行取平均得到最终的结果。
478 0
【Unity3D Shader】学习笔记-纹理采样①
|
算法 图形学
【Unity3D Shader】学习笔记-图片滤镜①
效果和上面的比较相似,Photoshop CS图像黑白调整功能的计算公式为: gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min 公式中:gray为像素灰度值,max、mid和min分别为图像像素R、G、B分量颜色的最大值、中间值和最小值,ratio_max为max所代表的分量颜色(单色)比率,ratio_max_mid则为max与mid两种分量颜色所形成的复色比率。 默认的单色及复色比率为:
811 0
【Unity3D Shader】学习笔记-图片滤镜①