13.贴图纹理shader

使用贴图来替换之前我们在shader的上由使用者更改的漫反射颜色(_Diffuse)

 

shader代码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Custom/TextureShader-Frag"
{
    Properties
    {
        _Color("Color",Color) = (1,1,1,1)
        _MainTex("Main Tex",2D) = "white"{}
        _Gloss("Gloss",Range(8,200)) = 10
        _Specular("Specular",Color) = (1,1,1,1)
    }
    SubShader
    {
        pass
        {
            Tags { "LightMode"="ForwardBase" }
            CGPROGRAM
            #include "Lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Color;
            sampler2D _MainTex;
            half _Gloss;
            fixed3 _Specular;
            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float2 texcoord:TEXCOORD;
            };
            struct v2f
            {
                float4 pos:SV_POSITION;
                fixed3 worldNormalDir:color;
                float4 worldVert:TEXCOORD1;
                float2 uv:TEXCOORD;
            };
            v2f vert(a2v i)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(i.vertex);//UnityObjectToClipPos(i.vertex);
                //o.worldNormalDir = mul(i.normal,(float3x3)unity_WorldToObject);
                o.worldNormalDir = UnityObjectToWorldNormal(i.normal);
                o.worldVert = mul(unity_ObjectToWorld, i.vertex);
                o.uv = i.texcoord;
                // o.color = tempColor;
                return o;
            }
            float4 frag(v2f i):SV_TARGET
            {
                //fixed3 worldNormalDir = mul(i.normal,(float3x3)unity_WorldToObject);
                
                fixed3 normalDir = normalize(i.worldNormalDir);  //这个矩阵把一个方向从世界空间转换到模型空间  这样放在后面就是模型到世界了
                //fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//对于每个顶点来说光的位置就是光的方向,因为光是平行的。
                fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.pos));
                fixed3 halfLambert = dot(normalDir,lightDir) * 0.5 + 0.5;  //半兰伯特光照公式 max(dot(normalDir,lightDir),0);
                fixed3 texColor = tex2D(_MainTex,i.uv) * _Color;
                fixed3 diffuse = _LightColor0.rgb * halfLambert * texColor;//取得漫反射的颜色
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * texColor;//获取环境光
                
                //fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));//反射光方向 
                //fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.pos.xyz);//视野方向
                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldVert.xyz));
                fixed3 halfDir = normalize(viewDir + lightDir);
                fixed3 specular = _LightColor0.rgb * _Specular * pow(max(dot(normalDir, halfDir) , 0) , _Gloss);
                fixed3 tempColor = diffuse + ambient + specular;
                return fixed4(tempColor,1);
            }  
            ENDCG
        }
    }
    FallBack "Diffuse"
}

 

效果:

 

发现指定了贴图后多了两个选项这两个选项实际上是用来控制贴图的偏移和压缩成几倍

 

但是我们现在无论怎么改数值都不会有影响的。

因为代码里根本没有使用。

 

_MainTex_ST

(1)简单来说,TRANSFORM_TEX(tex,name) (tex.xy * name_ST.xy + name_ST.zw)主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的。(v.texcoord就是顶点的uv)下面这两个函数是等价的。

o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);

o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

(2)而_MainTex_ST的ST是ScaleTransform的缩写,声明_MainTex是一张采样图,也就是会进行UV运算。如果没有这句话,是不能进行TRANSFORM_TEX的运算的。_MainTex_ST.xy为 Tiling,zw为offset.如果Tiling 和Offset你留的是默认值,即Tiling为(1,1) Offset为(0,0)的时候,可以不用o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);换成o.uv = v.texcoord.xy;也是能正常显示的;相当于Tiling 为(1,1)Offset为(0,0),但是如下图自己填的Tiling值和Offset值就不起作用了

改下代码

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Custom/TextureShader-Frag"
{
    Properties
    {
        _Color("Color",Color) = (1,1,1,1)
        _MainTex("Main Tex",2D) = "white"{}
        _Gloss("Gloss",Range(8,200)) = 10
        _Specular("Specular",Color) = (1,1,1,1)
    }
    SubShader
    {
        pass
        {
            Tags { "LightMode"="ForwardBase" }
            CGPROGRAM
            #include "Lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Color;
            sampler2D _MainTex;
            half _Gloss;
            fixed3 _Specular;
            float4 _MainTex_ST;
            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float2 texcoord:TEXCOORD;
            };
            struct v2f
            {
                float4 pos:SV_POSITION;
                fixed3 worldNormalDir:color;
                float4 worldVert:TEXCOORD1;
                float2 uv:TEXCOORD;
            };
            v2f vert(a2v i)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(i.vertex);//UnityObjectToClipPos(i.vertex);
                //o.worldNormalDir = mul(i.normal,(float3x3)unity_WorldToObject);
                o.worldNormalDir = UnityObjectToWorldNormal(i.normal);
                o.worldVert = mul(unity_ObjectToWorld, i.vertex);
                o.uv = i.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
                // o.color = tempColor;
                return o;
            }
            float4 frag(v2f i):SV_TARGET
            {
                //fixed3 worldNormalDir = mul(i.normal,(float3x3)unity_WorldToObject);
                
                fixed3 normalDir = normalize(i.worldNormalDir);  //这个矩阵把一个方向从世界空间转换到模型空间  这样放在后面就是模型到世界了
                //fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//对于每个顶点来说光的位置就是光的方向,因为光是平行的。
                fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.pos));
                fixed3 halfLambert = dot(normalDir,lightDir) * 0.5 + 0.5;  //半兰伯特光照公式 max(dot(normalDir,lightDir),0);
                fixed3 texColor = tex2D(_MainTex,i.uv) * _Color;
                fixed3 diffuse = _LightColor0.rgb * halfLambert * texColor;//取得漫反射的颜色
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * texColor;//获取环境光
                
                //fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));//反射光方向 
                //fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.pos.xyz);//视野方向
                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldVert.xyz));
                fixed3 halfDir = normalize(viewDir + lightDir);
                fixed3 specular = _LightColor0.rgb * _Specular * pow(max(dot(normalDir, halfDir) , 0) , _Gloss);
                fixed3 tempColor = diffuse + ambient + specular;
                return fixed4(tempColor,1);
            }  
            ENDCG
        }
    }
    FallBack "Diffuse"
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内置的渲染器,HD,URP和轻量级SRP支持 NEW!HDRP矢量位移样本 新!URP和HDRP的镶嵌选项 新!URP的半透明和透射选项 新!新的“开始屏幕”窗口 NEW!轻松的图形共享和画布截图按钮 新功能!SRP包自动导入程序 NEW!与Unity 2019的兼容性 新!支持后期处理堆栈着色器 新功能!与Unity插件中的Substance 兼容 !支持自定义渲染纹理 新增!同时支持高清,URP和轻量级SRP 。多遍模板 !Xbox One / PS4 / Switch支持 新增!地形支持 NEW! 着色器模板 •通用PBR /未照明SRP •通用2D点亮/未照明SRP •HD点亮/未照明/头发/织物/贴花SRP •轻量PBR /未照明SRP •自定义RT初始化/更新 •后处理效果,包括后处理堆栈 • Alpha混合颗粒 •雪碧 •熄灭 •不亮光照贴图 •UI 新工具 •后处理堆栈工具 新样本 •HDRP向量位移 •独立于比例的图块 • Raphael Ernaelsten的体积像素化 •SRP HD全贴图 •马赛克效果 •未使用光照贴图 新模板 •通用PBR /未照明 •HD点亮/ 未照明/毛发/织物 •后处理堆栈 •未照明光图 新节点 •反投影矩阵 •反视图投影矩阵 •HD发射 •Voronoi •渐变 •渐变样本 新增的着色器功能 •反勒普 •随机范围 •SRP附加光 •流量 •旋转 •高处法线 •噪声正弦波 •锯齿波 •方波 •三角波 •棋盘格 •椭圆 •多边形 •矩形 •圆角矩形 最新改进 •添加了专门用于新通用渲染管线的 模板•添加了与Unity HDRP着色器检查器兼容的新HD Lit模板 •无限循环检测现在更快,减少了连接大型图形上的节点时的命中率。 •改进了节点预览渲染刷新行为 •创建了新的标记系统以改善节点搜索 •只需单击“屏幕截图”按钮即可获取整个画布的屏幕截图 •通过“共享”按钮轻松共享图形的选定部分 •添加了新的后处理堆栈工具它会使用给定着色器的PPS渲染器和设置生成cs脚本。 •Amplify Shader Editor通过高达v7.2.x的模板支持HD,Lightweight和Universal RP。 •Legacy HD和Lightweight SRP v3.xx / v4.xx / v5.xx模板也通过Legacy软件包提供。 •通过自定义RT模板支持在Unity 2017及更高版本上使用自定义渲染纹理。 •现在,也可以通过Unity插件中的Substance,在Unity 2018及更高版本的ASE画布上使用此Substance。 •现在在Unity 2018.2及更高版本上可以访问8个UV通道。 •可以通过键盘方向键平移和缩放ASE画布摄像机。 •支持HD PBR SRP模板中的材料类型。 •支持将Specular工作流程集成到Lightweight PBR SRP模板中。 •现在可以直接在模板上添加自定义选项。 了解更多: 在此处放大Wiki 讨论:Unity论坛线程 着色器示例:完整列表 编辑器在将来的更新中将继续得到改进,当前正在开发许多功能。 显着功能 •完整的源代码 •支持Xbox One / PS4 / Switch • 自定义节点API • 着色器模板 • 着色器功能 •多窗口支持 •直观,熟悉的节点界面 •广泛的节点库 •实例化支持 •用户贡献的节点和着色器 •不断增加的样本收集

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值