Shader学习第八篇:Shader映射纹理编程

导读

我们自己如何编写Shader程序,来使用贴图呢? 首先我们会先介绍贴图属性,然后再是Shader程序示例。

贴图属性

unity中导入一张图片,可看到有如下属性,我们使用默认属性即可。

在这里插入图片描述

Texture Type:图片类型

在这里插入图片描述

  • Default:用于所有纹理的最常见纹理类型
  • Normal map:法线贴图
  • Editor GUI and Legacy GUI:编辑器的GUI和传统的GUI
  • Sprite(2D and UI):图片精灵
  • Cursor:设为光标
  • Cookie:聚光灯贴图
  • Lightmap:光照贴图
  • Advanced:高级选项

Texture Shape

使用 Texture Shape 属性可选择和定义纹理的形状和结构。有四种形状类型:

  • 2D 是用于所有纹理的最常用设置;它将图像文件定义为 2D 纹理。这些设置用于将纹理映射到 3D 网格和 GUI 元素以及其他项目元素。
  • Cube 将纹理定义为立方体贴图。例如,可将其用于天空盒或反射探针。此类型仅可用于 Default、Normal Map 和 Single
    Channel 纹理类型。
  • 2D Array 将纹理定义为 2D 数组纹理。这通常用作某些渲染技术的优化,其中会使用许多具有相同大小和格式的纹理。
  • 3D 将纹理定义为 3D 纹理。某些渲染技术使用 3D 纹理表示体积数据。

Wrap Mode

选择纹理平铺时的行为方式。默认选项为 Repeat。 All Texture Types

  • Repeat 在区块中重复纹理。
  • Clamp 拉伸纹理的边缘。
  • Mirror 在每个整数边界上镜像纹理以创建重复图案。
  • Mirror Once 镜像纹理一次,然后将其钳制到边缘像素。注意:某些移动设备不支持 Mirror Once
    模式。在这种情况下,Unity 将改用 Mirror 模式。
  • Per-axis 选择此选项可单独控制 Unity 如何在 U 轴和 V 轴上包裹纹理。

Fiter mode

选择纹理在通过 3D 变换拉伸时如何进行过滤。默认选项为 Bilinear。

  • oint :点采样模式,屏幕像素会需找最近的贴图像素点,来作为输出,这种比较生硬,但是性能好,不抗锯齿。
  • Bilinear :双线性采样模式, 采用最近的4个像素来做线性插值,有平缓的过渡。可以解决贴图放大的问题,但是贴图缩小依然有锯齿。缩小可以用mip-map来解决。
  • Trilinear :三线性采样模式,可以比较好的解决贴图缩小和放大。

Shader贴图示例

新建材质

在这里插入图片描述

新建Shader文件

在这里插入图片描述

编写Shader示例程序

关键函数
tex2D我的理解是把外部引入的贴图的UV坐标,与模型的UV坐标对应起来,输出颜色值

 tex2D(_MainTex,f.uv.xy);

Shader "My/tietu"
{
    Properties
    {
        _MainTex("Main Tex",2D) = "white"{}
        _Range("Range",Range(0,1)) = 0.5
    }
    SubShader
    {
       Tags{"LightMode" = "ForwardBase" }
        

        Pass{
            CGPROGRAM
            #include "Lighting.cginc"
            sampler2D _MainTex;
            #pragma vertex vert;
            #pragma fragment frag;
            float _Range;
            struct a2v
            {
                float4 vertex:POSITION;
                float4 texcoord:TEXCOORD0;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                 float4 uv:TEXCOORD0;
                 float4 svPos:SV_POSITION;
                 float3 normal:TEXCOORD1;
            };
            v2f vert(a2v v)
            {
               v2f f;
                f.svPos = UnityObjectToClipPos(v.vertex);
                f.uv = v.texcoord;
                f.normal = UnityObjectToWorldNormal(v.normal);
                return f;
            }
            fixed4 frag(v2f f):SV_Target{
                fixed3 texColor = tex2D(_MainTex,f.uv.xy);
                fixed3 normalDir = normalize(f.normal);
                fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 texColo =  _LightColor0.rgb*_Range*texColor*max(0,dot(normalDir,lightDir)*0.5+0.5);
                fixed3 color = texColo+UNITY_LIGHTMODEL_AMBIENT.rgb;
                return fixed4(color,1);
            }

         
            ENDCG
        }
     
    }
    FallBack "Diffuse"
}

把Shader导入材质

这里我们可以把Shader拖入到材质上,也可以手动选择,如下:
在这里插入图片描述

材质呈现效果

这里我们把图片导入,可看到材质球效果
在这里插入图片描述
把材质球应用到Scene物体上,效果如下
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小~小

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

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

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

打赏作者

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

抵扣说明:

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

余额充值