10.1高光纹理-反射

这篇博客介绍了如何在Unity中使用Shader实现高级纹理效果,特别是关注于反射部分。通过定义反射颜色、强度和环境映射纹理,结合反射函数来创建逼真的表面反射效果。文章详细解释了Shader代码,包括顶点和片段着色器的实现,以及如何利用立方体贴图进行环境反射采样。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//高级纹理 -反射
Shader "Unity shader book/Chapter 10/Reflection" {
    Properties {
        _Color("Color Tint",Color)=(1,1,1,1)
        _ReflectColor("Reflection Color",Color)=(1,1,1,1)//反射颜色
        _ReflectAmount("Reflect Amount",Range(0,1))=1//反射强度
        _Cubemap("Refection Cubemap",Cube) = "_Skybox"{}//反射的环境映射纹理
    }
    SubShader {
        
        Tags{"RenderType"="ForwardBase"}

        Pass{
            //Tags{"LightMode"="ForwardBase"}

            CGPROGRAM
//#pragma mutil_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
#include "AutoLight.cginc"

            fixed4 _Color;
            fixed4 _ReflectColor;
            fixed _ReflectAmount;
            samplerCUBE _Cubemap;

            struct a2v {
            
                float4 vertex:POSITION;
                float3 normal:NORMAL;

            };
            struct v2f {
            
                float4 pos:SV_POSITION;
                float3 worldNormal:TEXCOORD0;
                float3 worldPos:TEXCOORD1;
                float3 worldViewDir:TEXCOORD2;
                float3 worldRefl :TEXCOORD3;
                SHADOW_COORDS(4)
            };

            v2f vert(a2v v) {
            
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
                o.worldRefl = reflect(-o.worldViewDir,o.worldNormal);//反射函数

                TRANSFER_SHADOW(o);
                return o;
            }
            fixed4 frag(v2f i):SV_Target
            {
            
                fixed3 worldNormal = normalize(i.worldNormal);
            fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
            fixed3 worldViewDir = normalize(i.worldViewDir);

            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*_Color.rgb;

            fixed diffuse = _LightColor0.rgb*_Color.rgb*max(0,dot(worldNormal, worldLightDir));
            //对立方体纹理的采样用texCUBE
            fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb*_ReflectColor.rgb;

            UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);

            fixed3 color = ambient + lerp(diffuse, reflection, _ReflectAmount)*atten;
            //fixed3 color = ambient + diffuse;
            return fixed4(color,1.0);
            }

        ENDCG
    }

    }
    //FallBack "Diffuse"
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值