[计算机] [仅为年时] 用shader给一个圆柱体附上多段颜色(怎么看着像金箍棒)...

查看:1205 |回复:6 | 2017-9-25 12:28:33

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 胖纸_DHW 于 2021-2-3 14:33 编辑

165813k7gb29hz744xtzg6.png.thumb.jpg

想着是钻孔数据用三维柱状体显示,结果就做出这么个金箍棒。

没有C#代码,简单shader可行。

将参数显示出以便于程序控制,所以说需要定义属性:

  1. <div style="text-align: center;">Properties{</div><div style="text-align: center;">        _ColorRange1("Color1 Range", Range(0, 1)) = 0.3</div><div style="text-align: center;">        _ColorRange2("Color2 Range", Range(0, 1)) = 0.6</div><div style="text-align: center;">        _ColorRange3("Color3 Range", Range(0, 1)) = 0.7</div><div style="text-align: center;">        _ColorRange4("Color4 Range", Range(0, 1)) = 0.8</div><div style="text-align: center;">        _Color1("color1", Color) = (1.0, 0.0, 0.0, 1.0)//红</div><div style="text-align: center;">        _Color2("color2", Color) = (0.0, 1.0, 0.0, 1.0)//绿</div><div style="text-align: center;">        _Color3("color3", Color) = (0.0, 0.0, 1.0, 1.0)//蓝</div><div style="text-align: center;">        _Color4("color4", Color) = (1.0, 1.0, 1.0, 1.0)//白</div><div style="text-align: center;">        _Color5("color5", Color) = (0.0, 0.0, 0.0, 1.0)//黑</div><div style="text-align: center;">    }</div>
点击此处复制文本

170320fc8mcdpdct8gt778.png.thumb.jpg


剩下的基本上就是片段着色器的位置和颜色的控制,if-else足够实现.

代码:



  1. <div style="text-align: center;">Shader "Custom/aaa" {</div><div style="text-align: center;">    Properties{</div><div style="text-align: center;">        _ColorRange1("Color1 Range", Range(0, 1)) = 0.3</div><div style="text-align: center;">        _ColorRange2("Color2 Range", Range(0, 1)) = 0.6</div><div style="text-align: center;">        _ColorRange3("Color3 Range", Range(0, 1)) = 0.7</div><div style="text-align: center;">        _ColorRange4("Color4 Range", Range(0, 1)) = 0.8</div><div style="text-align: center;">        _Color1("color1", Color) = (1.0, 0.0, 0.0, 1.0)//红</div><div style="text-align: center;">        _Color2("color2", Color) = (0.0, 1.0, 0.0, 1.0)//绿</div><div style="text-align: center;">        _Color3("color3", Color) = (0.0, 0.0, 1.0, 1.0)//蓝</div><div style="text-align: center;">        _Color4("color4", Color) = (1.0, 1.0, 1.0, 1.0)//白</div><div style="text-align: center;">        _Color5("color5", Color) = (0.0, 0.0, 0.0, 1.0)//黑</div><div style="text-align: center;">    }</div><div style="text-align: center;">        SubShader{</div><div style="text-align: center;">            Pass{</div><div style="text-align: center;">            CGPROGRAM</div><div style="text-align: center;">    #pragma vertex vert</div><div style="text-align: center;">    #pragma fragment frag</div><div style="text-align: center;">    #include "UnityCG.cginc"</div> <div style="text-align: center;">
  2. </div><div style="text-align: center;">        float _ColorRange1;</div><div style="text-align: center;">        float _ColorRange2;</div><div style="text-align: center;">        float _ColorRange3;</div><div style="text-align: center;">        float _ColorRange4;</div><div style="text-align: center;">        fixed4 _Color1;</div><div style="text-align: center;">        fixed4 _Color2;</div><div style="text-align: center;">        fixed4 _Color3;</div><div style="text-align: center;">        fixed4 _Color4;</div><div style="text-align: center;">        fixed4 _Color5;</div> <div style="text-align: center;">
  3. </div><div style="text-align: center;">        //输入顶点结构体,包含位置和颜色</div><div style="text-align: center;">    struct vertexInput {</div><div style="text-align: center;">        float4 vertex : POSITION;</div><div style="text-align: center;">        float4 texcoord0 : TEXCOORD0;</div><div style="text-align: center;">    };</div><div style="text-align: center;">    //片段结构体,包含位置和颜色</div><div style="text-align: center;">    struct fragmentInput{</div><div style="text-align: center;">        float4 position : SV_POSITION;</div><div style="text-align: center;">        float4 texcoord0 : TEXCOORD0;</div><div style="text-align: center;">    };</div><div style="text-align: center;">    //顶点处理</div><div style="text-align: center;">    fragmentInput vert(vertexInput i){</div><div style="text-align: center;">        fragmentInput o;</div><div style="text-align: center;">        o.position = mul (UNITY_MATRIX_MVP, i.vertex);</div><div style="text-align: center;">        o.texcoord0 = i.texcoord0;</div><div style="text-align: center;">        return o;</div><div style="text-align: center;">    }</div><div style="text-align: center;">    //片段处理</div><div style="text-align: center;">    float4 frag(fragmentInput i) : COLOR {</div><div style="text-align: center;">        float4 color;</div><div style="text-align: center;">        if (i.texcoord0.y > 0 && i.texcoord0.y < _ColorRange1) {</div><div style="text-align: center;">            color = _Color1;//红色</div><div style="text-align: center;">        }</div><div style="text-align: center;">        if (i.texcoord0.y > _ColorRange1 && i.texcoord0.y < _ColorRange2) {</div><div style="text-align: center;">            color = _Color2;//绿色</div><div style="text-align: center;">        }</div><div style="text-align: center;">        if(i.texcoord0.y > _ColorRange2 && i.texcoord0.y < _ColorRange3){</div><div style="text-align: center;">            color = _Color3;//蓝色</div><div style="text-align: center;">        }</div><div style="text-align: center;">        if (i.texcoord0.y > _ColorRange3 && i.texcoord0.y < _ColorRange4) {</div><div style="text-align: center;">            color = _Color4;//白色</div><div style="text-align: center;">        }</div><div style="text-align: center;">        if (i.texcoord0.y > _ColorRange4 && i.texcoord0.y < 1) {</div><div style="text-align: center;">            color = _Color5;//黑色</div><div style="text-align: center;">        }</div><div style="text-align: center;">            return color;</div><div style="text-align: center;">    }</div><div style="text-align: center;">        ENDCG</div><div style="text-align: center;">    }</div><div style="text-align: center;">    }</div><div style="text-align: center;">        FallBack "Diffuse"</div><div style="text-align: center;">}</div>
点击此处复制文本


评分

参与人数 2元素币 +5 活跃度 +28 展开 理由
大芸彩 + 12 挺简单的shader,哈哈哈
小小橘子 + 5 + 16 你的金箍棒和别人的不一样

查看全部评分

2017-9-25 12:28:33  
 赞 赞 0

使用道具 登录

6个回答,把该问题分享到群,邀请大神一起回答。
2#
看的一脸蒙蔽……感觉很厉害就是了!为大佬点赞!
回复 收起回复
2017-9-26 10:22:12   回复
 赞 赞 0

使用道具 登录

3#
回复 收起回复
2017-9-27 11:57:44   回复
 赞 赞 0

使用道具 登录

4#
666666666666
回复 收起回复
2018-11-20 00:12:54   回复
 赞 赞 0

使用道具 登录

5#
元素网的资源就是全,想要啥就有啥!感谢楼主分享!
回复 收起回复
2018-11-20 21:03:53   回复
 赞 赞 0

使用道具 登录

6#
为了元素币
回复 收起回复
2018-11-21 02:30:07   回复
 赞 赞 0

使用道具 登录

7#
挺不错的,高科技
回复 收起回复
2018-11-22 15:45:49   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

综合文库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表