【TA-霜狼_may-《百人计划》】基础渲染光照介绍(一)

【TA-霜狼_may-《百人计划》】基础渲染光照介绍(一

完整代码块如下,从头到尾打一遍,感觉把之前的东西都串起来!没事翻出来看看!

Shader "Custom/100 learning/myOwnBaseShaser"
{
    Properties
    {
        _Diffuse("Diffuse", Color) = (1,1,1,1)
        _MainTex("Main Tex", 2D) = "white" {}

        _Specular("Specular", Color) = (1,1,1,1)
        _Gloss("Gloss", Range(1.0, 255)) = 20
        _NormalMap("Normal Map", 2D) = "white" {}
        _LocalNormalSild("Local Normal", Range(0,1)) = 0
        _CubeMap("Enviroment Cube Map", Cube) ="" {}
        _MipScale("Mip Scale", Range(0,10)) = 0
        _EnvScale("Enviroment Scale", Range(0,1)) = 1

    }
    SubShader
    {
        Pass{

            // 定义Tags
            Tags{"LightingMode" = "FOrwardBase"}

            CGPROGRAM
            // 引入头文件
            #include "Lighting.cginc"

            // 定义函数
            #pragma vertex vert
            #pragma fragment frag

            // 定义并接收对应变量
            float4 _Diffuse;
            float4 _Specular;
            float _Gloss;
            float _LocalNormalSild;

            uniform sampler2D _NormalMap; uniform float4 _NormalMap_ST;
            sampler2D _MainTex; float4 _MainTex_ST;
            samplerCUBE _CubeMap;
            
            float _MipScale;
            float _EnvScale;

            // 定义结构体
            struct a2v{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float4 tangent:TANGENT;
                float2 texcoord0 : TEXCOORD0;
            };

            struct v2f{
                float4 pos : SV_POSITION;
                float3 worldNormal:NORMAL;
                float2 uv0 : TEXCOORD0;
                float3 normalDir : TEXCOORD1;
                float3 tangentDir : TEXCOORD2;
                float3 bitangentDir : TEXCOORD3;
                float3 worldPos: TEXCOORD4;
            };

            v2f vert(a2v v){
                v2f o;
                o.uv0 = v.texcoord0;

                o.pos = UnityObjectToClipPos(v.vertex);

                // 将法线转换到世界空间
                // 旧写法:o.worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                // 顶点位置转换到世界空间
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                // 计算法线、切线、副切线
                o.normalDir = UnityObjectToWorldNormal(v.normal);
                o.tangentDir = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0.0)).xyz);
                o.bitangentDir = normalize(cross(o.normalDir,o.tangentDir)*v.tangent.w);

                return o;
            }

            fixed4 frag(v2f i): SV_Target{
                float4 mainTex = tex2D(_MainTex, TRANSFORM_TEX(i.uv0,_MainTex));

                // TBN转换矩阵
                float3x3 tangentTransform = float3x3 (i.tangentDir, i.bitangentDir,i.normalDir);

                // 环境光
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse * mainTex.rgb;
                
                // 归一化光照方向
                float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
                // 再次归一化worldNormal
                float3 worldNormal = normalize(i.worldNormal);
                i.normalDir = worldNormal;

                // 获取映射过的法线贴图数据
                float3 normalLocal = UnpackNormal(tex2D(_NormalMap, TRANSFORM_TEX(i.uv0, _NormalMap)));

                float3 normalWorld = normalize(mul(normalLocal.rgb, tangentTransform));
                float3 finiNormal = lerp(worldNormal, normalWorld, _LocalNormalSild);

                //计算漫反射lambert公式
                float NdotL = max(0.0, dot(finiNormal, worldLight));
                // 多余:float NdotLNormalTex = dot(finiNormal, worldLight);

                // diffuse
                float3 diffuse = lerp(ambient.rgb * _Diffuse.rgb * mainTex.rgb, _LightColor0.rgb * _Diffuse.rgb * mainTex.rgb,NdotL);

                //=====Phong=====
                // 计算反射方向R,worldLight表示光源方向,入射光线方向为-worldLight,通过reflect函数(入射方向,法线方向)
                float3 reflectDir = normalize(reflect(-worldLight,finiNormal));
                // 计算该像素对应位置(顶点计算过后传给像素经过插值后)finiNormalV,相机坐标-像素坐标
                // 这个写在片元着色器中有点不太对float3 viewDir = normalize(UnityWorldSpaceViewDir(i.pos));
                float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
                // 反射光方向与观察方向的夹角 dot(V,R)
                float VdotR = max(0.0, dot(reflectDir, viewDir));
                // 计算高光值,根据反射系数计算的反射值为pow(VdotR, Gloss)
                float3 specular = _LightColor0.rgb * _Specular.rgb * pow(VdotR, _Gloss);
                // 由此得到最终颜色
                float3 color = ambient + diffuse + specular;

                //=====Blinn-Phong=====
                // 计算半角向量(光想方向+视角方向,结果归一化)
                float3 halfDir = normalize(worldLight + viewDir);

                // 半角向量与法线方向的夹角 dot(V,R)
                float NdotH = saturate(dot(halfDir,finiNormal));

                // 环境贴图
                float3 worldRef = normalize(reflect(-viewDir, finiNormal));

                float4 reflcol = texCUBElod( _CubeMap, float4(worldRef.rgb, (255-_Gloss)*8/(255))) * _EnvScale;

                // 计算Specular (在Blinn-Phong下)
                specular = _LightColor0.rgb * _Specular.rgb * pow(NdotH, _Gloss);
                specular = lerp(diffuse * specular, specular, _Gloss/255);
                reflcol.rgb = lerp(reflcol * diffuse.rgb, reflcol, _Gloss/255);

                color =diffuse + reflcol.rgb + specular;

                return fixed4(color.rgb,1.0);
                
            }

            ENDCG
        }
    }
    FallBack "Diffuse"
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: i86bi_linuxl3-adventerprisek9-m2_157_3_may_2018.bin 是一种二进制文件,具体是Cisco网络设备的操作系统镜像文件。这个文件用于更新或安装Cisco设备上的操作系统。 该文件名中的"i86bi" 表示它是为基于Intel x86架构的设备准备的。"linuxl3" 表示它是一个基于Linux操作系统的Layer 3功能集合。"adventerprisek9" 意味着它包含了企业级的功能集合,例如Advanced IP Services等。"m2" 是特定软件版本的标识符。"157_3_may_2018" 是该版本文件的版本号和发布日期。 通过安装或更新这个.bin文件,可以将Cisco设备的操作系统升级到指定的版本。这可能包括修复已知的漏洞和错误,增加新的功能和性能优化。为了使用这个.bin文件,您需要具备一定的网络设备管理经验以及Cisco设备的权限。 一般情况下,您需要通过合适的管理界面(如Cisco IOS命令行界面)或者网络管理软件将这个.bin文件加载到设备的存储介质上。然后,您可以使用适当的命令来启动操作系统的安装或升级过程。此过程可能需要一些时间,因为设备需要对二进制文件进行验证和安装。 总之,i86bi_linuxl3-adventerprisek9-m2_157_3_may_2018.bin 是一种针对特定Cisco网络设备的操作系统镜像文件,用于更新或安装操作系统,并提供企业级的功能集合。 ### 回答2: i86bi_linuxl3-adventerprisek9-m2_157_3_may_2018.bin是一个文件的名称。根据文件名的命名规范,可以看出这是一个针对某种硬件平台的Linux操作系统镜像文件。该文件的后缀为.bin,说明它是一个二进制文件,常用于存储机器代码或执行文件。 文件名中的"i86bi"可能是指该软件是基于Intel 86处理器架构的。"linuxl3"意味着这是一个Linux平台上的第三层(网络层)软件。 "adventerprisek9"是指该软件属于思科公司的企业级版本,通常含有高级功能和性能扩展。"m2_157_3_may_2018"可能是软件的版本号,表明该版本是2018年5月3日发布的第157.3版本。 因为这个文件是二进制文件,我们无法直接通过阅读其内容来判断其具体用途。然而,根据文件名中的信息推测,它可能是一种用于网络设备的操作系统镜像,用于提供高级网络功能和企业级性能。 在使用该文件之前,需要确保你的硬件平台与该软件的要求相匹配。此外,我们可以根据软件开发者提供的文档或支持页面来获取更多关于该软件的详细信息,包括安装步骤、功能说明和系统要求等。 ### 回答3: i86bi_linuxl3-adventerprisek9-m2_157_3_may_2018.bin 是一种二进制文件,通常用于Cisco网络设备的升级或恢复操作系统。它是用于Linux操作系统的Cisco企业级IOS软件镜像文件。这个文件是2018年5月3日发布的版本,版本号为157.3。这个版本通常用于支持企业级网络设备的路由和交换功能。 这个文件可以通过网络升级或直接写入到设备上,以更新设备的操作系统,并提供更多的功能和修复一些已知的问题。在升级或安装这个文件之前,必须确保设备的兼容性,并且备份设备的现有配置和数据。安装过程通常是在设备启动时,通过命令行界面或设备管理工具运行一系列指令来完成的。 i86bi_linuxl3-adventerprisek9-m2_157_3_may_2018.bin是一个经过验证和认证的软件镜像文件,以确保其完整性和可靠性。这个文件还可能包含其他配置文件、文档和说明,以帮助用户正确地安装和配置网络设备。 需要注意的是,除非有特殊的需求或指导,否则最好按照厂家的建议和指示来操作,避免不必要的错误和损失。对于普通用户来说,安装和使用这类文件通常需要一定的专业知识和经验,因此最好在专业人士的指导下进行操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zczplus

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

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

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

打赏作者

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

抵扣说明:

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

余额充值