纹理映射脑洞一下,可以理解为,把一张图贴在模型表面,去控制模型的颜色和外观。本主题将记录在unity中利用纹理采样实现更加丰富的视觉效果。

通常美术人员会在建模软件中利用纹理展开技术把纹理映射坐标(texture-mapping coordinates)存储在每个顶点上。而纹理映射坐标定义了该顶点在纹理中对应的2D坐标,通常用一个二维变量(u,v)来表示,其中u是横向坐标,v是纵向坐标,故纹理映射坐标又称UV坐标。

纹理的大小可变(如256x256, 1028x1028),但顶点UV坐标通常归一化到[0,1]范围。特殊的情况是,纹理采样时,坐标范围不在[0,1]之内,会有特殊处理。

Unity使用的坐标系是符合OpenG传统的,坐标原点位于纹理左下角。

单张纹理

  • 运行平台:Unity 2018.4.2f1 (64-bit)
  • 项目地址:
    Unity_Shader_GetIn

目标

使用单张纹理作为物体的漫反射颜色

实践

在本例中仍使用Blinn-Phong光照模型。

准备工作:

  1. 在Unity中新建一个场景,命名为Scene_7_1。默认场景中将包含一个摄像机和一个平行光,并使用内置的天空盒子。为便于查看效果,在Window->Rendering->Lighting Seting->Skybox中去掉场景中的天空盒子。
  2. 新建Shader(右键Create->Shader->SingleTextureShader)并命名为SingleTexture;新建材质(右键Create->Material)并命名为SingleTextureMat,将新建的Shader拖拽赋给新建材质。
  3. 在场景中新建一个胶囊体(菜单栏GameObject->3D Object->Capsule),将其材质修改为新建材质。
  4. 保存场景。

Shader实现:

打开新建的SingleTexture,删除所有已有代码并写入如下代码:

Shader "Custom/SingleTexture" {Properties{_Specular("Specular Color", Color) = (1, 1, 1, 1)_Gloss("Gloss", Range(8.0, 256)) = 20//除了已有属性之外,应添加一个名为_MainTex的纹理属性,2D是纹理属性的声明方式,“white”是内置纹理的名字,意为全白_MainTex("Main Tex", 2D) = "white"{}//wei控制物体的整体色调,还可声明_color属性_Color("Color Tint", Color) = (1, 1, 1, 1)}SubShader{Pass {//LightMode标签是Pass标签的一种,它用于定义该Pass在Unity的光照流水线的颜色Tags{"LightMode" = "ForwardBase"}//CGPROGRAM和ENDCG共同包裹最重要的顶点着色器和片元着色器的代码CGPROGRAM#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;sampler2D _MainTex;fixed4 _Specular;float _Gloss;//需要为纹理类型的属性声明一个float4类型的变量_MainTex_ST//p.s.:Unity中需要使用纹理名_ST的方式来声明某个纹理的属性。ST为缩放(scale)和平移(translation)的缩写float4 _MainTex_ST;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;//用TEXCORD0将模型的第一组纹理坐标存储到该变量中float4 texcoord : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;//用uv存储纹理坐标,以便在片元着色器中使用该纹理坐标进行纹理采样float2 uv : TEXCOORD2;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_WorldToObject, v.vertex).xyz;//_MainTex_ST.xy存储的是缩放值,_MainTex_ST.zw存储的是偏移值,这些值可以在材质面板的纹理属性中调节,分别作用于顶点纹理坐标上o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;return o;}//通过 scale/bias 属性转换2D UV,其中第一个参数是顶点纹理坐标,第二个是纹理名#define TRANSFORM_TEX(tex, name)(tex.xy * name##_ST.xy + name##_ST.zw)// 计算每个像素点的颜色值fixed4 frag(v2f i) : SV_Target {// 计算世界空间下的法线方向和光照方向fixed3 worldNormal = normalize(i.worldNormal); fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));//使用CG的tex2D函数对纹理进行采样,第一个参数是需要被采样的纹理,第二个参数是一个float2类型的纹理坐标,用于返回计算得到的纹素值//采样结果* 颜色属性_Color作为材质反射率albedofixed3 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(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(worldLightDir + viewDir);//高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(worldNormal, halfDir), 0), _Gloss);// 最终颜色 = 漫反射 + 环境光 + 高光反射return fixed4(diffuse + ambient + specular, 1.0);}ENDCG}}FallBack "Specular"
}

在SingleTextureMat面板上可以使用资源Brick_Diffuse.jpg纹理(或其他图片)对Main Tex属性进行赋值

效果图如下:

纹理的属性

如图所示为材质面板,接下来就其中几个属性进行声明:

  • 纹理类型(Texture Type):使用此选项可以从源图像文件中选择要创建的纹理的类型

    • Default
    • Normal Map
    • Sprite (2D and UI)

本节使用Default类型,它是用于所有纹理的最常见设置。它提供对大多数属性的访问以进行纹理导入。另外,法线纹理通常使用Normal map类型将颜色通道转换为适合实时法线贴图的格式;在2D游戏中使用Sprite(2D和UI)

  • 纹理形状(Texture Shape):使用它来选择和定义纹理的形状和结构。

    • 2D
    • Cube

本节使用2D类型,这是所有纹理的最常见设置。它将图像文件定义为2D纹理。它提供对大多数属性的访问以进行纹理导入。另外,Cube将纹理定义为立方体(cubemap)。用户可以将其用于“天空盒子(skybox)”或“ 反射探测器(Reflection Probes)”, 例如。选择cube去显示不同的映射选项。

  • Alpha is Transparency:

如果指定的Alpha通道为透明度,则启用Alpha为透明度可放大颜色并避免过滤边缘上的瑕疵。

另提几个重要的高级属性:

  • Wrap Mode: 决定了纹理坐标超过[0,1]时如何平铺。 Repeat模式下纹理坐标超过了1,则其整数部分会被舍弃,而直接使用小数部分进行采样。这样使得纹理结果不断重复;Clamp模式下,若纹理坐标大于1,则直接截取到1,若小于0,则截取到0。其他还有Mirror,Mirror Once等模式,不作详述。

p.s.: 说起平铺模式,则可以在材质面板中设置TillingOffset两种属性来调整纹理的重复次数和偏移位置

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

它支持3种:PointBIlinear,Trilinear。得到图片的滤波效果依次提升,需要耗费的性能也依次增大。纹理滤波会影响放大或缩小纹理时得到的图片质量

p.s. Point滤波内部实现使用了最近邻滤波,在放缩时采样像素数目仅有一个,所以看上去有像素风效果(23333,好复古!)。Bilinear使用线性滤波,图像看起来有模糊的效果,Trilinear与之大致相同,只不过混合时采用了多级渐远纹理。

  • 最大尺寸(Max Size) :导入的最大纹理尺寸(以像素为单位)。美工人员通常喜欢使用巨大的尺寸大小的纹理;使用最大尺寸将纹理缩小到合适的尺寸大小。值得一提的是,若导入纹理的长宽大小不是2的幂次则会占用更多内存,降低读取速度。
  • 纹理模式(Format) : 这将绕过自动系统来指定用于纹理的内部表示.使用的纹理格式精度越高(如,RGBA 32 bit),占用内存空间越大,但得到效果越好。因此需要具体需求具体分析。

参考

Unity_Shaders_Book : https://github.com/candycat1992/Unity_Shaders_Book

Unity Scripting Reference : https://docs.unity3d.com/ScriptReference/index.html

Unity Manual: https://docs.unity3d.com/Manual/TextureTypes.html

c# imager让图片有圆角unity_Unity纹理-引题和单张纹理相关推荐

  1. c# imager让图片有圆角unity_使用Unity着色器实现精灵(Sprite)涂鸦效果

    本文将由来自英国的游戏开发工程师Alan Zucconi分享如何在Unity中使用着色器制作近来流行的精灵涂鸦效果. 精灵涂鸦效果在过去几年逐渐流行起来,<GoNNER>和<Baba ...

  2. c# imager让图片有圆角unity_C# 10分钟完成百度图片提取文字(文字识别)——入门篇...

    现在图片文字识别已经很成熟了,比如qq长按图片,点击图片识别就可以识别图片的文字,将不认识的.文字数量大的.或者不能赋值的值进行二次可复制功能. 我们现在就基于百度Ai开放平台进行个人文字识别,dem ...

  3. c# imager让图片有圆角unity_Qt编写自定义控件24-图片轮播控件

    一.前言 上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成, ...

  4. Android之设置资源图片为圆角图片

    效果图: 参看以下代码: public class MainActivity extends Activity {private ImageView imageView1;private ImageV ...

  5. Android图片转换类 1. Bitmap去色,转换为黑白的灰度图, 2. Bitmap图片加圆角效果

    /** * 处理图片的工具类. * */public class ImageTools { /***//** * 图片去色,返回灰度图片 * @param bmpOriginal 传入的图片 * @r ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 图片:为图片添加圆角 (IE8 不支持)

    <!DOCTYPE html> <html><head><meta charset="utf-8"> <title>菜鸟 ...

  7. 微信小程序 canvas type = 2d 绘制海报心得(包括怎么绘制图片和圆角图片和圆角矩形等)

    微信小程序 canvas type=2d 使用心得 为了方便这里我封装成了一个component 然后说说怎么使用最新的方法(使用方法类似于html中的canvas可以进行参考)获取--canvas ...

  8. Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask)

    Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask) 目录 Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask)

  9. 怎么将图片进行圆角处理?

    怎么将图片进行圆角处理?最近公司为了宣传自己扩大自身的影响力,制作了一批宣传图片,但是宣传科的人建议把这些图片进行圆角处理,这样不那么棱角分明显得更加美观温和.这个任务又被我光荣的分到了,本来我以为W ...

最新文章

  1. C++ primer第六章6.5函数的学习 之特殊用途的语言特性
  2. SpringMVC 通过post接收form参数或者json参数
  3. 到底图啥?百度工程师非法控制155台服务器“挖矿”,被判刑3年
  4. 使用c 对mysql数据库_c对mysql数据库的操作
  5. 串口IO、定时器、回调函数
  6. 小蚂蚁学习C语言(2)——C语言编程预备知识(上)
  7. Windows内存体系(4) -- 内存映射文件
  8. Access数据库,以及一些其他的库。
  9. 上门洗车APP --- Android客户端开发 之 项目结构介绍
  10. 录播系统服务器大全,专业高清录播服务器 全高清录播系统 系统设计精美
  11. 陈莉君linux操作系统,Linux操作系统原理与应用(陈莉君)学习笔记.pdf
  12. 《调教命令行04》触碰Linux的每个角落(长文)
  13. netstat查看网络状态(windows)
  14. 【web开发】利用User-Agent获取浏览器类型
  15. caffe生成lmdb数据集的脚本
  16. 统一软件过程的基本概念
  17. Hive 外部表的练习(多表关联查询,以及分组,子查询)
  18. 数据库领域正在发生巨变,从 TiDB 5.0 发布会看未来的数据库发展趋势
  19. 上海计算机一级二级三级考纲,上海高校计算机一级考纲.doc
  20. OpenCV之图像相似度

热门文章

  1. 引用js实现checkbox批量选中
  2. 通过JQUERY获取SELECT OPTION中选中的值
  3. HTML5 实现图片预览和查看原图
  4. Ubuntu 12.04 安装配置 Apache2
  5. linux-ubuntu txt乱码
  6. Linux下MySQL 5.5.11编译安装笔记(待验证)
  7. 初学C语言没有项目练手怎么行,这17个小项目收下不谢
  8. 汉游天下公司的一些感悟
  9. 控件的WM_NOTIFY消息映射
  10. 程序员思维是什么?程序员思维从哪里来?程序员思维到哪里去?