unity 调色板之shader绘制

最近闲来无事,给自己找点麻烦,用shader做一个调色板,分享给大家

微信号:ITComputerGraph

更多精彩内容,关注公众号《IT木子李》

 

绘制:

中心思想是通过UV坐标,计算出每个象素的颜色值

左侧方志颜色计算公式:

i.uv.y * _Color.r + i.uv.y * (1 - i.uv.x) * (1 - _Color.r)
i.uv.y * _Color.g + i.uv.y * (1 - i.uv.x) * (1 - _Color.g)
i.uv.y * _Color.b + i.uv.y * (1 - i.uv.x) * (1 - _Color.b)

右侧彩虹条计算公式:

三源色分别为:红、绿、蓝,由些还会插值产生另外三源色:黄、青、洋红,所以彩虹条要分为 6 段去画

if (y <= 1)
{
	return lerp(float4(1, 0, 0, 1), float4(1, 1, 0, 1), y - 0);
}
else if (y <= 2)
{
	return lerp(float4(1, 1, 0, 1), float4(0, 1, 0, 1), y - 1);
}
else if (y <= 3)
{
	return lerp(float4(0, 1, 0, 1), float4(0, 1, 1, 1), y - 2);
}
else if (y <= 4)
{
	return lerp(float4(0, 1, 1, 1), float4(0, 0, 1, 1), y - 3);
}
else if (y <= 5)
{
	return lerp(float4(0, 0, 1, 1), float4(1, 0, 1, 1), y - 4);
}
else
{
	return lerp(float4(1, 0, 1, 1), float4(1, 0, 0, 1), y - 5);
}

由以上两个公式,可以分别绘制并拾取到具体每一个象素的颜色值。

拾取颜色值:

先计算出当前鼠标点中UI的位置,然后规一化到 0 - 1 之间,最后计算出当前点中的颜色。

void SetColor()
{
    Vector2 pos = Vector2.one;
    RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform,     Input.mousePosition, Camera.main, out pos);

    pos += _size;
    pos /= _size.x * 2.0f;

    _targetColor.r = pos.y * _sourceColor.r + pos.y * (1 - pos.x) * (1 - _sourceColor.r);
    _targetColor.g = pos.y * _sourceColor.g + pos.y * (1 - pos.x) * (1 - _sourceColor.g);
    _targetColor.b = pos.y * _sourceColor.b + pos.y * (1 - pos.x) * (1 - _sourceColor.b);
    _targetColor.a = _sourceColor.a;

    _targetImage.color = _targetColor;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用Shader绘制网格,需要在Unity中创建一个材质(Material)并将其分配给网格对象(Mesh)。材质中包含着Shader的代码,它会告诉Unity如何绘制网格。 以下是一个简单的示例,演示如何使用Shader绘制一个简单的网格: 1. 创建一个新的ShaderUnity中,选择"Create" -> "Shader"创建一个新的Shader。选择一个合适的命名,例如"MyShader"。 2. 编写Shader代码 打开新创建的Shader,你会看到一个空白的代码文件。在这里,你可以自由编写你的Shader代码。以下是一个简单的示例,它会绘制一个灰色的网格: ``` Shader "Custom/MyShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { return tex2D(_MainTex, i.uv) * 0.5; } ENDCG } } } ``` 这个Shader中包含一个名为"_MainTex"的属性,它是一个2D纹理。在Pass块中,Shader使用这个纹理对网格进行着色,并将颜色乘以0.5,以便将其变为灰色。 3. 创建一个材质 现在,你需要创建一个材质(Material),并将Shader分配给它。在Unity中,选择"Create" -> "Material"创建一个新的材质。给它一个合适的名称,例如"MyMaterial"。 选择新创建的材质,将Shader分配给它。在Inspector窗口中,将Shader字段设置为新创建的Shader。 4. 将材质分配给网格对象 最后一步是将材质分配给网格对象。在Unity中,选择你想要绘制的网格对象,并将新创建的材质分配给它。 现在,当你在场景中查看网格对象时,它应该使用你编写的Shader进行着色了。如果需要,你可以进一步调整你的Shader代码,以实现更复杂的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linda012518

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值