shader-单张纹理+光照

单张纹理+光照

效果

在这里插入图片描述

代码

Shader "Custom/t1" {   //9  
  //单张纹理+光照
   Properties{ //属性
        _Color ("Color", Color) = (1,1,1,1) //贴图整体颜色
        _Specular ("_Specular", Color) = (1,1,1,1)//高光颜色
        _Gloss("Gloss", Range(2,200)) = 20//高光范围
        _MainTex ("MainTex", 2D) = "white" {}//贴图
   }
   
   SubShader{ //子shader
        Pass{ //pass块
            Tags{  "LightMode" = "ForwardBase" } //渲染模式,前向渲染
            
            CGPROGRAM //cg代码开始
            //定义顶点函数
            #pragma vertex vert
            //定义片元函数 
            #pragma fragment frag
            //引用内置光照文件
            #include "Lighting.cginc"
            
            //cg中定义贴图颜色变量
            fixed4 _Color;
            //cg中定义贴图变量
            sampler2D _MainTex;
            //定义 贴图uv变量 _ST
            float4 _MainTex_ST;
            // 定义高光范围变量
            float _Gloss;
            //定义高光颜色变量
            fixed4 _Specular;
            
            struct a2v  //顶点着色器的输入  application to vertex shader
            {
                float4 vertex : POSITION; //接收顶点 方向
                float3 normal : NORMAL; //接收法线方向 
                float4 texcoord : TEXCOORD0; //接收第一组纹理坐标
            };
            
            struct v2f  //片元着色器输入
            {
                float4 pos : SV_POSITION;  //接收
                float3 worldNormal : TEXCOORD0; //纹理坐标 世界法线
                float3 worldPos : TEXCOORD1; //纹理坐标  世界顶点
                float2 uv : TEXCOORD2; // uv纹理
            };
            
            v2f vert (a2v a) { //顶点函数
                
                v2f f; //定义片元着色器的输入
                f.pos = UnityObjectToClipPos(a.vertex); //顶点转换到裁剪空间
                f.worldNormal  = mul( (float3x3) unity_ObjectToWorld, a.normal); //法线转到世界空间
                f.worldPos = mul(unity_ObjectToWorld, a.vertex).xyz; // 顶点转到世界空间
                f.uv =  TRANSFORM_TEX (a.texcoord, _MainTex); //纹理转到切线空间
                return f;//信息传递给片元函数
                
            };
            
            fixed4 frag ( v2f f) : SV_Target
            {
                fixed3 worldNormal = normalize  (  f.worldNormal );  //归一化 世界空间的法线方向
                fixed3 worldLightDir = normalize ( UnityWorldSpaceLightDir ( f.worldPos )  ); //获取世界空间下 该顶点的 光源方向
                fixed3 albedo = tex2D ( _MainTex,  f.uv).rgb * _Color.rgb; //对纹理进行采样, 传入第一个是需要被采样的纹理, 第二个是纹理坐标
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; //得到环境光
                fixed3 diffuse = _LightColor0.rgb * albedo *  max ( 0, dot(worldNormal, worldLightDir) );//计算漫反射
                fixed3 viewDir = normalize ( UnityWorldSpaceViewDir (f.worldPos) ); //计算视线方向  (相机-当前位置得到)
                fixed3 halfDir = normalize ( worldLightDir + viewDir ); //视线方向与光源方向求和,得到Blin计算前的半方向
                fixed3 specular = _LightColor0 * _Specular.rgb * pow (max (0, dot ( worldNormal, halfDir )) ,_Gloss); //计算高光
                return fixed4 (ambient + specular+ diffuse, 1); //返回最终的片元效果
            };
            //cg 模块结束 
            ENDCG
            
            
        }
        
        
        
   
   }

    FallBack "Diffuse"  //后备方案
   
}

原理:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是光照、材质和纹理映射的流程图: ``` +------------------+ +-----------------+ +-----------------+ | Geometry | | Lighting | | Texturing | +------------------+ +-----------------+ +-----------------+ | | | | | | v v v +------------------+ +-----------------+ +-----------------+ | Vertex Shader | | Fragment Shader| | Fragment Shader| +------------------+ +-----------------+ +-----------------+ | | | | | | v v v +------------------+ +-----------------+ +-----------------+ | Rasterization | | Depth Testing | | Texture Access| +------------------+ +-----------------+ +-----------------+ | | | | | | v v v +------------------+ +-----------------+ +-----------------+ | Pixel Operations| | Pixel Operations| | Pixel Operations| +------------------+ +-----------------+ +-----------------+ | | | | | | v v v +------------------+ +-----------------+ +-----------------+ | Framebuffer | | Framebuffer | | Framebuffer | +------------------+ +-----------------+ +-----------------+ ``` 在这个流程图中,三个主要的步骤是几何、光照纹理。 几何阶段包括几何数据的处理和变换,以及顶点着色器的执行。在这个阶段,我们可以对模型进行旋转、平移和缩放等变换操作。顶点着色器可以对每个顶点进行处理,并计算出顶点的最终位置。 光照阶段包括对场景中的光源进行处理,并在片段着色器中进行照明计算。在这个阶段,我们可以定义光源的颜色、强度和位置,并计算每个片段接收的光线的颜色和强度。 纹理阶段包括对纹理映射的处理,以及在片段着色器中对纹理进行采样。在这个阶段,我们可以将纹理映射到模型表面上,并使用片段着色器从纹理中获取对应的纹理颜色。 最后几个步骤包括光栅化、深度测试和最终像素操作。在光栅化阶段,我们将几何数据转换成屏幕上的像素。深度测试可以帮助我们确定哪些像素应该被渲染。最终像素操作包括对像素进行合成和调整,以生成最终的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值