【Unity5.x Shaders】Shader中的Texture纹理

来源:互联网 发布:c语言两个数组相加 编辑:程序博客网 时间:2024/05/16 00:33

2D图片如何映射到3D模型?

这个过程叫做纹理映射(texture mapping)。
模型事实上是用三角形构成的,每一个顶点可以存储信息并且可以被shaders接收。
其中顶点中存储的最重要的信息是UV数据(UV data)。
它由两个坐标构成:U和V,取值范围都是从0到1。它们代表了2D图片上像素将要映射到模型顶点的XY position。
UV数据只提供给顶点。当三角形内的点需要被纹理映射(texture-mapped)时,GPU会插值运算最接近的UV值以找到要使用的纹理中的正确像素。

这个图片展示了2D纹理如何映射到3D模型上的三角形。
这里写图片描述
UV数据存储在3D模型中,并需要编辑建模软件。
一些模型缺少UV分量,因此它们不能支持纹理映射。
这里我对模型的知识了解太少,比如说有的模型有专门匹配的贴图,所以那种模型的UV就是根据匹配的贴图设置的吗?可是在材质中我随便指定一种贴图不也能贴上吗?希望有了解的能回答一下。

Standard Shader中的纹理映射

接下来需要一个有UV数据的3D模型和它的贴图。它们都需要提前导入进Unity,你也可以把它们简单的拖进编辑面板中。
Standard Shader默认支持纹理映射,接下来将解释它工作的步骤

  1. 新建一个名为 TexturedShader的Standard Shader
  2. 新建一个名为TexturedMaterial的material
  3. 把这个shader通过拖拽指派给material
  4. 然后选中这个material,把你的纹理拖进名叫Albedo (RGB)的空框中。

做完这些步骤后,你的Inspector面板会像这样
这里写图片描述
Standard Shader知道如何通过UV数据映射一个2D图片给3D模型

Standard Shader中的代码

Shader "Custom/TexturedShader" {    Properties {        _Color ("Color", Color) = (1,1,1,1)        _MainTex ("Albedo (RGB)", 2D) = "white" {} //1        _Glossiness ("Smoothness", Range(0,1)) = 0.5        _Metallic ("Metallic", Range(0,1)) = 0.0    }    SubShader {        Tags { "RenderType"="Opaque" }        LOD 200        CGPROGRAM        #pragma surface surf Standard fullforwardshadows                #pragma target 3.0        sampler2D _MainTex;  //2        struct Input {  //3            float2 uv_MainTex;        };        half _Glossiness;        half _Metallic;        fixed4 _Color;        void surf (Input IN, inout SurfaceOutputStandard o) {            // Albedo comes from a texture tinted by color            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;//4            o.Albedo = c.rgb;            // Metallic and smoothness come from slider variables            o.Metallic = _Metallic;            o.Smoothness = _Glossiness;            o.Alpha = c.a;        }        ENDCG    }    FallBack "Diffuse"}
  1. Albedo (RGB)纹理在代码中的参照是_MainTex属性

  2. 在CGPROGRAM中,这个纹理被定义为sampler2D,这个类型就是GLSL中的2D贴图的类型

  3. Input结构。这个是surface方法的输入参数,并且包含了一个名为uv_MainTex的压缩数组。
    每次suface的surf()方法被调用时,Input结构会包含渲染的3D模型的特定点的_MainTex的UV。
    Standard Shader认出这个名为uv_MainTex的变量是引用自MainTex,并且自动将它初始化。下一篇博客会介绍Surface的Input结构。

  4. 这里用到了Cg的函数tex2D(),它的参数是一个纹理和UV,然后返回在这个position上像素的颜色。
    附上NVDIA官方的文档http://http.developer.nvidia.com/Cg/tex2D.html

注意:U和V的坐标是从0到1,(0,0)和(1,1)相当于两个相反的角落。 不同的实现将UV与不同的角相关联, 如果你的纹理碰巧出现反转,尝试反转V分量。

调整画质(贴图)质量

这里CandyCat已经写得很详细了,可以直接查看她的博客学习
http://blog.csdn.net/candycat1992/article/details/22794773

0 0
原创粉丝点击