Unity shader(CG) 写一个海浪纹理多种效果

12 篇文章 0 订阅
11 篇文章 0 订阅

Unity shader(CG) 写一个海浪纹理多种效果

1。unity shader 这个东西,它给我们简化了许多的写shader的节奏,

2。unity 基于左手世界坐标系,给人的感觉还是蛮可以的样子,

3。也有许多的人士对UV这个东西一直敏感,比如一直理解的UV是0-1,有时候uv又可以无限大,其实uv

4.这鸡巴编辑器把3.处后面的文字弄不在了,好烦。。。

看一下浪纹的效果

  1. 简单的浪纹移动
    这里写图片描述看起冒似一种投影纹理,你在猜猜 !!!(猜了在说)
  2. 简单的浪纹亮度调节
    这里写图片描述这个嘛就更好说了,第一个都实现了,你又试试!再猜猜看!!!

  3. 简单的浪纹密度调节
    这里写图片描述哦。。。没有搞混了,在继续想想有什么方法能产生同样的效果。。。

  4. 简单的主纹理灰彩调节
    这里写图片描述看到这里,会写shader的同学就快赶紧动手吧!!!(猜猜完了,就开始把自己的方法写出来)

    shader的感觉

    差不多吧,见过我的同志都这么形容,这个世界都被你用shader形容了。
    shader是一种美丽的语言,有的人觉得shader是一坨复杂的数学公式,有的人觉得它是枯燥的rgba,xyzw,stpq,而有人觉得shader就是一种生活……….


它的代码

  1. 世界坐标uv的应用
    这里写图片描述
    这里写图片描述
    可以看出,我之前应用了许多方法,而最后我觉得,如果要达到同样的效果,性能更优,方法更简单,岂不是很有效益而不是什么显示什么复杂水平。
    于是我直接采用世界坐标的xz,当然你要先让物体转换到世界坐标中来。
  2. 浪纹亮度
    这里写图片描述
    这里写图片描述
    这种假光照不叫技术,这是一种享受算法,ou.nDir为法线。
    这里写图片描述
    可以看出,之前用if语句来者!可想而知if语句是多么的耗能,于是用lerp获得浪纹洒在皮肤上的渐变,同时又能起到那个浪纹亮度的效果。

  3. 主纹理灰色到彩色的渐变实现
    这里写图片描述
    这里写图片描述
    主纹理,这这。。。
    这里写图片描述
    彩色变灰色。。
    有同学说,取取rgb的平均值就行了,其实我觉得Luminance最好,应为它是对亮度进行合理算法,在unity UnityCG.cginc 中有这个函数,非常科学,对于色盲来说他对亮度和灰度就敏感了。(有群主想歪了,哈哈哈,程序没美工颜色好,no!no!no!)
    这里写图片描述
    哎哟,这这,,一个lerp搞定,灰色与彩色一步搞定。

  4. 至于那个叫什么浪纹密度
    这里写图片描述
    方法太水了,我怕贴出来笑话了。

一坨毫无修饰的代码

//shayu shader by qq834144373 提供
//技术编写 by qq834144373 
//更多详情,请联系 qq834144373
Shader "Custom/shayu" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _R1 ("灰彩渐变", Range(0.0, 1.1)) = 0
        _Texure ("光影纹理", 2D) = "white" {}
        _R ("浪纹亮度", Range(.0, 4.0)) = 1.
        _R0 ("浪纹密度", float) = 1.
        _Color ("光影颜色", Color) = (1.0, 1.0, 1.0, 1.0)
    }
    SubShader {
        Tags { "RenderType"="Opaque" }//"Queue"="Overlay"
        LOD 200

        Pass{
            ZWrite On Blend Off AlphaTest Off Lighting Off
            CGPROGRAM
            // Upgrade NOTE: excluded shader from qq834144373, twitter@834144373Zhu because you should call me here.
                //#pragma exclude_renderers d3d11 xbox360 gles flash all the terget!!!!
                #pragma vertex vert 
                #pragma fragment frag 
                #include "UnityCG.cginc"

                sampler2D _MainTex;
                fixed _R1;
                sampler2D _Texure;
                half _R;
                half _R0;
                fixed4 _Color;
                half4 _MainTex_ST;
                half4 _Texure_ST;
                //float4x4 _Object2Light;


                struct vertIN{
                    float4 vertex : POSITION;
                    fixed2 tex : TEXCOORD0;
                    fixed3 normal : NORMAL;
                };
                struct vertOUT{
                    float4 pos : SV_POSITION;
                    //half4 ver : TEXCOORD1;
                    fixed4 uv : TEXCOORD0;
                    fixed3 nDir : NORMAL;
                    fixed3 lDir : TEXCOORD2;
                    //fixed2 screenUV : TEXCOORD3;
                };

                vertOUT vert(vertIN i){
                    vertOUT o;
                    o.pos = mul(UNITY_MATRIX_MVP,i.vertex);
                    //float4x4 m = float4x4(float4(_Object2World[0]),float4(_Object2World[1]),float4(_Object2World[2]),float4(_Object2World[3]));
                    //o.ver = mul(m,i.vertex);
                    //half4 v = half4(i.vertex.x,i.vertex.z,-i.vertex.y,i.vertex.w);
                    float4 ver = mul(_Object2World,i.vertex);
                    //half4x4 m = float4x4(half4(UNITY_MATRIX_P[0]),half4(UNITY_MATRIX_P[1]),half4(UNITY_MATRIX_P[2]),half4(UNITY_MATRIX_P[3]));
                    //ver = mul(m,ver);
                    //ver = ver*2. - 1.;
                        //o.ver = mul(UNITY_MATRIX_P,o.ver);
                        //o.ver.xy = float2(o.ver.x, o.ver.y*_ProjectionParams.x) + o.ver.w;
                        //ver.xz = ver.xz/1;
                        ver.xz = ver.xz/ver.y;

                    o.uv.rg = TRANSFORM_TEX(i.tex,_MainTex);
                    o.uv.ba = TRANSFORM_TEX(ver.xz,_Texure);
                    o.nDir = normalize(mul(_World2Object,i.normal));
                    o.lDir = normalize(WorldSpaceLightDir(i.vertex));

                    return o;
                }

                fixed4 frag(vertOUT ou):SV_target{
                    fixed4 c0 = tex2D(_MainTex,ou.uv.rg);
                    fixed3 c1 = Luminance(c0.rgb);
                    fixed diff = max(0,dot(fixed3(0,1,0),ou.nDir));
                    fixed4 c =tex2D(_Texure,ou.uv.zw*_R0+sin(_Time.x))*_Color*c0;
                    //if(diff<-0.1){
                    //  c.rgb = 0;
                    //}
                    c.rgb *= lerp(0.,_R,diff);
                    c0.rgb = lerp(c1,c0.rgb,_R1);
                    return c + c0;//*diff ;
                }

            ENDCG
        }

    } 
    FallBack "代码归qq834144373所有"
}
  1. 怎么会是这样子啊,这个代码一贴感觉一坨翔
  2. 所以坚决的放图放图
    这里写图片描述
    这里写图片描述

shader = 世界 + 想象力 + 感觉

写shader是一种美好的而又享受的事情,当你发现这个世界都可以用shader写时,那么你永远不会感觉shader的枯燥。。。。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值