2D纹理采样

采样函数 :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

           }

      }


}






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
明白了,如果将外部视频流渲染到2D纹理上,再将离屏渲染纹理输出到屏幕上,可以使用以下步骤实现: 1. 在代码中创建一个离屏渲染的FrameBuffer对象。 2. 创建一个Texture对象,类型为GL_TEXTURE_2D,并将其绑定到一个纹理单元上,通常使用glActiveTexture和glBindTexture函数实现。 3. 将该纹理对象作为颜色附着点附着到FrameBuffer对象上。 4. 将外部视频流纹理绑定到另一个纹理单元上,通常使用glActiveTexture和glBindTexture函数实现。 5. 在片段着色器中,使用samplerExternalOES类型的采样器获取外部视频流纹理上的颜色值,通常使用texture2D函数实现。 6. 将获取到的颜色值写入到离屏渲染纹理上,通常使用glFramebufferTexture2D函数实现。 7. 在片段着色器中,使用sampler2D类型的采样器获取离屏渲染FrameBuffer对象上的颜色值,通常使用texture2D函数实现。 8. 在片段着色器中,输出获取到的离屏渲染纹理颜色值,通常使用gl_FragColor变量实现。 例如,下面是一个简单的片段着色器示例,用于将外部视频流渲染到2D纹理上,并将离屏渲染纹理输出到屏幕上: ``` #extension GL_OES_EGL_image_external : require precision mediump float; varying vec2 vTexCoord; uniform samplerExternalOES sExternalTexture; uniform sampler2D sOffscreenTexture; void main() { vec4 color = texture2D(sExternalTexture, vTexCoord); gl_FragColor = color; gl_FragColor.rgba = texture2D(sOffscreenTexture, vTexCoord).rgba; } ``` 其中,samplerExternalOES类型的采样器sExternalTexture用于获取外部视频流纹理上的颜色值,sampler2D类型的采样器sOffscreenTexture用于获取离屏渲染FrameBuffer对象上的颜色值。需要注意的是,在代码中需要将外部视频流与OpenGL ES中的纹理关联起来,并将离屏渲染的结果绘制到屏幕上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值