【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

相关文章
|
3月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
244 0
|
3月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
39 2
|
3月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
39 2
|
3月前
|
API 图形学 异构计算
Unity3D学习笔记7——GPU实例化(2)
Unity3D学习笔记7——GPU实例化(2)
24 2
|
3月前
|
存储 缓存 图形学
Unity3D学习笔记11——后处理
Unity3D学习笔记11——后处理
56 1
|
3月前
|
测试技术 C# 图形学
Unity3D学习笔记10——纹理数组
Unity3D学习笔记10——纹理数组
50 0
|
3月前
|
图形学 异构计算
Unity3D学习笔记8——GPU实例化(3)
Unity3D学习笔记8——GPU实例化(3)
41 0
|
3月前
|
存储 API 图形学
Unity3D学习笔记6——GPU实例化(1)
Unity3D学习笔记6——GPU实例化(1)
53 0
|
3月前
|
API 图形学 索引
Unity3D学习笔记5——创建子Mesh
Unity3D学习笔记5——创建子Mesh
28 0
|
3月前
|
API C# 图形学
Unity3D学习笔记4——创建Mesh高级接口
Unity3D学习笔记4——创建Mesh高级接口
39 0