IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【待续】【unity笔记】L5基础纹理 -> 正文阅读

[游戏开发]【待续】【unity笔记】L5基础纹理

一、基本概念

  • 定义:纹理是为了控制模型的外观,使用的是纹理映射技术,逐纹素地控制模型的颜色(与像素 进行区分)。
  • 方法:在建模时利用纹理展开技术把纹理映射坐标存储在每个顶点上,纹理映射坐标定义了该顶点在纹理中对应的2D坐标,用一个二维变量(u,v)来表示。
  • 注意:纹理的大小可以多样,但是通过归一化后,UV坐标的范围都在[0,1]m内。

二、利用单张纹理

  • 代码逻辑图
    在这里插入图片描述

  • 代码

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Chapter7-SingleTexture2"
{
    Properties
    {
        _Color ("Color Tint", Color) = (1,1,1,1)
        //设置纹理
        _MainTex ("Main Tex", 2D) = "white" {}
        _Gloss ("Gloss", Range(8.0,256)) = 20
        _Specular ("Specular", Color) = (1,1,1,1)
    }
    SubShader
    {        
      Pass{
         Tags { "LightingMode"="ForwardBase"}
         CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "Lighting.cginc"

           fixed4 _Color;
           sampler2D _MainTex;
           float4 _MainTex_ST;
           fixed4 _Specular;
           float _Gloss;

           struct a2v{
             float3 normal : NORMAL;
             float4 vertex : POSITION;
             //在模型阶段进行纹理采样
             float3 texcoord : TEXCOORD0;
           };

           struct v2f{
             float4 pos : POSITION;
             float3 worldNormal : TEXCOORD0;
             float worldPos : TEXCOORD1;
             float2  uv : TEXCOORD2; 
           };

           v2f vert(a2v v){
              v2f o;
              o.pos = UnityObjectToClipPos(v.vertex);
              o.worldNormal = UnityObjectToWorldNormal(v.normal);
              o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
              o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
              return o;  
           }

           fixed4 frag(v2f i) : SV_Target {
             fixed3 worldNormal = normalize(i.worldNormal);
             fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

             //利用纹理映射关系获取纹并输出到屏幕空间
             fixed3 albedo = tex2D(_MainTex,i.uv).rgb* _Color.rgb;
             fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

             fixed3 diffuse = _LightColor0.rgb * albedo * max (0,dot(worldNormal,worldLightDir));

             fixed3 viewDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
             fixed3 halfDir = normalize(viewDir+worldLightDir);
             fixed3 specular = _LightColor0.rgb * _Specular.rgb + pow(max(0, dot(worldNormal , halfDir)) , _Gloss);

             return fixed4(ambient + diffuse + specular,1.0);
           }
         ENDCG
      }
       
    }
    FallBack "Diffuse"
}

三、纹理属性

1. Wrap Mode:决定了纹理坐标与物体表面纹理该如何对应

  • 主要有两种模式,一种是重复,代表着如果纹理坐标大于1,那么后续坐标的整数部分会被丢弃,使得坐标一直在1以内,这样纹理不断重复。
  • 还有一种是填充模式,如果纹理坐标大于1,那么后续纹理坐标就会为1位置时的纹素值。
    在这里插入图片描述

2. Filter Mode:决定了当纹理由于变换时而产生拉伸时将会采用哪种滤波模式:

  • Point模式使用了最近邻滤波,在放大或缩小时,他的采样像素数目通常只有一个,因此图像会看起来有一种像素的风格。
    在这里插入图片描述
  • Mipmap :在介绍三线性插值前,必须提到的就是Mipmap了,Mipmap也叫做多级渐变纹理技术,用于观察者/相机距离物体不同距离时为了更准确的表示纹理颜色所提出来的。远处的纹理被压缩后再进行插值会得到明显的锯齿(颜色过度不均),于是提出根据距离远近,将原始纹理进行压缩,再在该位置对应的纹理上进行插值。

在这里插入图片描述

  • Bilinear和Trilinear模式表示了双线性插值和三线性插值。双线性插值表示会在该坐标周围的四个像素里进行插值得到该坐标实际的颜色值。三线性插值表示除了在周围的四个像素里进行插值外,还会结合Mip对应的信息进行插值,最后得到该坐标实际的颜色值。
    在这里插入图片描述

四、凹凸映射

1.定义:使用一张纹理在不改变模型顶点位置的前提下,通过修改纹理表面的法线使得模型表面看起来凹凸不平。主要方法有高度映射和法线映射两种。

2.高度映射:

定义:也就是利用一张高度图实现凹凸映射,高度图中存储的是强度值,其中颜色越深表示物体表面越向外凸起,颜色越浅表示物体表面越向内凹陷。

优点:可以明确知道物体表面凹凸的情况

缺点:计算更复杂,实时性不足

3.法线映射

定义:

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:41:46  更:2022-05-12 16:42:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:40:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码