【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默认支持纹理映射,接下来将解释它工作的步骤
- 新建一个名为 TexturedShader的Standard Shader
- 新建一个名为TexturedMaterial的material
- 把这个shader通过拖拽指派给material
- 然后选中这个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"}
Albedo (RGB)纹理在代码中的参照是_MainTex属性
在CGPROGRAM中,这个纹理被定义为sampler2D,这个类型就是GLSL中的2D贴图的类型
Input结构。这个是surface方法的输入参数,并且包含了一个名为uv_MainTex的压缩数组。
每次suface的surf()方法被调用时,Input结构会包含渲染的3D模型的特定点的_MainTex的UV。
Standard Shader认出这个名为uv_MainTex的变量是引用自MainTex,并且自动将它初始化。下一篇博客会介绍Surface的Input结构。这里用到了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
- 【Unity5.x Shaders】Shader中的Texture纹理
- 【Unity5.x Shaders】Shader基本结构
- Unity5.x中的GUI Texture
- 【Unity5.x Shaders】最基本的Surface Shader-Diffuse shader以及Surface中的三种输出结构
- 【Unity5.x Shaders】使用Shader制作河流效果
- 【Unity5.x Shaders】Properties 属性
- 【Unity5.x Shaders】压缩数组Packed arrays
- 【Unity3D学习笔记】unity5.x中的双面材质shader实现
- 【Unity Shaders】Shader中的光照
- Three.js中的纹理Texture
- OpenGL 中的Texture(纹理)
- unity5 通过 WWW 加载 Assetbundle 中的 texture
- Cocos2d-x -- 纹理缓存(Texture Cache)
- Cocos2d-x 纹理缓存(Texture Cache)
- 【Unity Shaders】Shader中的光照,shadersshader
- 【Unity5.x Shader】SubShader Tags 标签
- Unity5.x shader打包AssetBundle总结
- Unity5.x shader打包AssetBundle总结
- canvas、bitmap、paint之间是什么关系
- 11 Python pyinstaller--将Python程序打包成单独的exe可执行文件
- 改变页面颜色
- Fragment 一些有用的知识点
- 构建五位数的反序数
- 【Unity5.x Shaders】Shader中的Texture纹理
- 【codevs1082】【树状数组】 区间修改 区间查询
- Android自定义对话框(Dialog)位置,大小
- Android Studio 最简单的NDK环境搭建和JNi调用
- EL表达式
- js 箭头函数
- leancloud后台导入cvs中文乱码问题解决办法
- insist fortress g55 机械键盘"得救了"
- HTTP/2协议–特性扫盲篇