2D纹理采样

本文介绍Unity中纹理采样的方法及UV坐标的正确使用方式。重点讲解了使用tex2D函数对贴图进行采样,以及如何通过顶点函数调整UV坐标实现平铺和偏移效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采样函数 :tex2D函数。  

对一张贴图的采样范围 :(0~1)


位图 :



CG中,每有一个sampler2D(纹理),就会有一个uv坐标



位图的模式

      Repeat :在左侧再拼接一个一样的图片

      clamp :不重复


过滤模式

       Billinear :会有两个颜色的混合

       point(no fliter) :不会有两个颜色混合



  在纹理采样时,对UV坐标的赋值,不要直接使用顶点坐标,否则Tiling(平铺) , offset(偏移量)会不起作用。如果想要使用平铺、偏移,那么,wrap  Mode必须为repeat模式,Filter  Mode  -->  Billnear



      Unity为了方便,不用每一次都通过脚本进行赋值,提供了一个uv的缩放和偏移的四阶向量,叫做  _MainTex_ST。(_MainTex :属性块中声明的纹理名 ;必须要以_ST结尾)



顶点函数中,对uv坐标的赋值,不能直接使用顶点坐标   ;对uv坐标的赋值:Tilling用乘法,offset用加法

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

     o.uv = TRANSFORM_TEX(v.texcoord , _MainTex) ;            // 宏,这个宏的操作跟之前的赋值操作效果一样的

       // 参数 :顶点中的贴图坐标 、 properties中声明的贴图的名称


appdata_base 这个顶点结构体中,只有一个textcoord纹理

appdata_full 这个顶点结构体中,有多个纹理,当使用光照贴图的时候,必须使用这个结构体。



在片段函数中 :使用tex2D函数对贴图进行采样 :

       fixed4  color = tex2D(_MainTex , IN.uv);






Shader  "Custom/Texture" {


      Properties

      {

           _MainTex("MainTex" , 2D) = "" {}

      }


      SubShader

      {

           Pass

           {

                  CGPROGRAM

                  #pragma  vertex  vert

                  #pragma  fragment  frag

                  #include  "unitycg.cginc"


                  sampler2D  _MainTex;


                  float4  _MainTex_ST;

                  // float  tiling_x;

                  // float  tiling_y;


                  // float  offset_x;

                  // float  offset_y;


                  struct  v2f {

                         float4  pos : POSITION;

                         float4  uv : TEXCOORD0;

                  };


                  v2f  vert(appdata_base  v)

                  {

                          v2f  o;

                          o.pos = mul(UNITY_MATRIX_MVP , v.vertex);


                          // 对uv坐标的赋值,不要直接使用顶点坐标,否则Tilling(平铺) 、offset(偏移量) 不起作用


                          // o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;          // Tilling用乘法,Offset用加法

                          o.uv = TRANSFORM_TEX(v.texcoord , _MainTex) ;      // 这个宏,与上面的操作一样

                          return  o;

                  }

                  fixed4  frag(v2f  IN) : COLOR

                  {

                         // tex2D函数,返回值类型是一个四阶的向量,有两个参数 :纹理、一个二维坐标

                         fixed4  color = tex2D(_MainTex , IN.uv);


                         return  color;

                  }


                  ENDCG

           }

      }


}






### 使用 `smoothstep` 函数进行纹理采样的方法 在图形编程中,`smoothstep` 函数用于创建平滑过渡效果。当应用于纹理采样时,可以实现更柔和的边缘和平滑的颜色渐变。 #### 平滑过渡原理 `smoothstep(a, b, x)` 函数返回一个介于0和1之间的值,该值表示输入参数 \(x\) 在范围 \([a,b]\) 中的位置,并通过Hermite插值提供平滑的结果[^2]。这使得原本生硬的变化变得圆润自然。 对于纹理坐标而言,在应用此函数之前通常会有一个原始的UV坐标集\(uv\), 经过转换后的最终坐标将作为纹理查找的关键依据: ```glsl float edgeMin = 0.4; float edgeMax = 0.6; // 对 UV 的 V 分量做 smoothstep 处理 vec2 adjustedUv = vec2(uv.x, smoothstep(edgeMin, edgeMax, uv.y)); ``` 上述代码片段展示了如何利用 `smoothstep` 来调整纹理坐标的V分量,从而影响垂直方向上的纹理显示方式。这里设定了一个边界区域 `[edgeMin, edgeMax]`, 当超出这个区间时颜色变化更加缓和而不是突兀地切换。 接着就可以按照常规流程执行纹理采样操作: ```glsl sampler2D textureSampler; uniform sampler2D _MainTex; void main() { ... // 执行带有 smoothstep 调整过的纹理采样 vec4 sampledColor = texture(textureSampler, adjustedUv); } ``` 需要注意的是,虽然 `smoothstep` 可以为图像带来更好的视觉质量,但在某些情况下可能会增加额外的计算开销。因此应当权衡性能需求来决定是否采用这种技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值