• 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);
    
    • 1
    
    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"
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    把Shader导入材质

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

    材质呈现效果

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

  • 相关阅读:
    融合反向学习与 Levy 飞行策略的改进麻雀优化算法ISSA
    密码学 数字签名
    RabbitMQ快速入门--simple简单模式
    mysql之索引失效场景
    Latex & Overleaf 写作问题记录
    Failed to start MySQL Community Server in Ubuntu
    如何实现Redisson分布式锁
    基于Intel Lake-UP3平台的超声设备方案设计,提供出色的图形和AI性能
    Excel 通过条件格式自动添加边框
    RowHammer 攻击:内存的隐形威胁
  • 原文地址:https://blog.csdn.net/u014196765/article/details/127547764