Shader 源代码下载:
Unity 每次版本更新的时候,不单单会更新 Unity,配套的资源也是会一块更新
的,比如版本配套的 Shader 源代码。

一:下载步骤:

1.打开unity官网将纵向滑动条拉倒最底部点击红框区域【见图】

2.点击后还是将 纵向滑动条拉倒最底部点击红框区域【见图】

3.找到自己对应的unity版本点击红色区域即可【见图】 

4.下载下来后是一个压缩包,解压之后双击打开文件夹找到DefaultResourcesExtra/Standard.shader使用记事本或者     notepad++打开就可以看到Shader的源码了!(备注:每个版本的着色器所存在的文件夹路径不同,我这边的unity版本是2017.2)

代码控制Shader面板的参数

相关 API
获取 Shader 中参数的值:
material.GetFloat(“参数名”); //获取小数类型值;
material.GetColor(“参数名”); //获取颜色类型值;
material.GetTexture(“参数名”); //获取贴图类型值;
修改 Shadder 中参数的值:
material.SetFloat(“参数名”,值); //设置小数类型值;
material.SetColor(“参数名”,颜色值); //设置颜色类型值;
material.SetTexture(“参数名”,贴图); //设置贴图类型值;

演示:将一个球体改变成红色

测试代码:

最终效果:

代码动态修改材质球的颜色:

gameObject.GetComponent<Renderer>().material.color=Color.red;//当材质球的Shader为标准时,可直接使用此方法修改颜色值gameObject.GetComponent<Renderer>().material //得到的material是经过实例化之后的material(Instantiate)Color color=new Color(0.5f,0.5f,0.5f,.0.5f);//修改颜色的RGB数值时,填入的值为float类型,且值为:数值/255gameObject.GetComponent<Renderer>().material.SetColor("_TintColor",color);//若材质的Shader为Particles时,可使用此方法改变颜色

unity3d 用到 renderer.material.color.a 总是出现下面错误怎么解决?

Cannot modify a value type return value of `UnityEngine.Material.color' Consider storing the value in a temporary variable

//错误用法
renderer.material.color.a
//正确用法
Color c = renderer.material.color;
c.a = 0.4;
renderer.material.color = c; 

unity中代码使用(R,G,B)颜色值需要除255f,颜色值才会生效。

label.effectColor = new Color(39f / 255f, 83f / 255f, 150f / 255f);

我们知道在Unity中可以在代码中动态地改变Material监视面板中的参数,如改变数值大小或替换贴图。常用的API有:SetColor , SetFloat, SetInt, SetTexture.

然而今天在设置一个StandardShader的材质贴图的时候,发现设置了法线贴图但是场景中的物体并没有法线凹凸的效果,需要激活一下材质面板才行。经过反复检查以及查找资料,主要有以下两个问题:

// 贴图类型
string[] TEXTURE_TYPE = { "_MetallicGlossMap", "_BumpMap", "_ParallaxMap", "_OcclusionMap", "_DetailMask", "_DetailAlbedoMap", "_DetailNormalMap"};// Material需要设置的关键字
string[] TEXTURE_KEYWORD = { "_METALLICGLOSSMAP", "_NORMALMAP", "_PARALLAXMAP", "", "_DETAIL_MULX2", "_DETAIL_MULX2", "_DETAIL_MULX2" };
  1. 法线贴图导入进来需要设置类型为NormalMap

    // 设置法线贴图的类型
    if (fileName == diffuseName + TEXTURE_TYPE[1])
    {TextureImporter importer = (TextureImporter)AssetImporter.GetAtPath(filePath);importer.textureType = TextureImporterType.NormalMap;importer.SaveAndReimport();
    }

  2. 使用标准着色器(StandardShader)的Material要设置启用相应的关键字

    // 在Material.SetTexture之前 开启相应的KeyWord
    mat.EnableKeyword(TEXTURE_KEYWORD[i]);

    以下是我查文档自己理解的,不一定准确。

    一个Material所使用的标准着色器在Unity中其实是多个着色器的集合。因为一个材质的着色器不可能涵盖所有的功能,比如GI、雾效、HDR等高耗能的效果,所以Unity把标准着色器分成了带有不同特殊功能的着色器变体(Shader Variant)。当把NormalMap分配给材质,就是激活了支持法线贴图的着色器变体;把视差贴图分配给材质,就是激活了支持视差贴图的着色器变体。所以,如果要把某个特殊的贴图赋给材质,就要开启材质相应的关键字,以激活支持相应功能的着色器变体。

    需要专门开启的关键字有以下几个:

    关键字 特性
    _NORMALMAP 法线映射
    _ALPHATEST_ON 用于CutOut渲染模式
    _ALPHABLEND_ON 用于Fade渲染模式
    _ALPHAPREMULTIPLY_ON 用于Transparent渲染模式
    _EMISSION 设置自发光
    _PARALLAXMAP 设置视差贴图
    _DETAIL_MULX2 用于设置第二个贴图通道
    _METALLICGLOSSMAP 在 Metallic工作流中设置金属度贴图
    _SPECGLOSSMAP 在 Specular工作流中设置高光贴图

    下面附上设置材质属性的部分代码:

    /// <summary>
    /// 设置材质中shader的相关属性
    ///<para name = "mat"> 需要设置的Material </para>
    ///<para name = "meshMat"> 要传入shader的数据集合 </para>
    ///<para name = "fbxName"> 模型的名字,在这里主要是为了得到材质贴图文件夹的位置 </para>
    /// </summary>
    void SetShader(Material mat, ShaderData data, string fbxName)
    {  // 这里默认贴图资源中主贴图的名字就是材质名,其他贴图的名字是材质名+贴图类型string diffuseName = mat.name;// textureFiles用于记录贴图文件夹中所有的图片文件,记录它们的贴图名和路径Dictionary<string, string> textureFiles = new Dictionary<string, string>();// texturePath是之前记录好的一个fbx模型对应的贴图文件夹的路径string[] filesPath = Directory.GetFiles(texturePath[fbxName]);foreach (string filePath in filesPath){   // TEXTURE_EXT是预设的图片后缀名,用于标记图片格式(如.jpg,.png,.tif等)if (Array.IndexOf(TEXTURE_EXT, Path.GetExtension(filePath)) != -1){string fileName = Path.GetFileNameWithoutExtension(filePath);if (fileName.IndexOf(diffuseName) == 0){textureFiles[fileName] = filePath;Debug.Log(fileName + " , " + filePath);// 设置法线贴图的类型if (fileName == diffuseName + TEXTURE_TYPE[1]){TextureImporter importer = (TextureImporter)AssetImporter.GetAtPath(filePath);importer.textureType = TextureImporterType.NormalMap;importer.SaveAndReimport();}}}}// 设置材质的主贴图,也就是Albedo贴图if (textureFiles.ContainsKey(diffuseName)){Debug.Log("MainTexture Exist");mat.mainTexture = AssetDatabase.LoadAssetAtPath<Texture>(textureFiles[diffuseName]);}// 设置其他特殊类型的贴图for (int i = 0; i < TEXTURE_TYPE.Length; ++i){if (textureFiles.ContainsKey(diffuseName + TEXTURE_TYPE[i])){Debug.Log(TEXTURE_TYPE[i] + " Exist ");if (TEXTURE_KEYWORD[i] != "")mat.EnableKeyword(TEXTURE_KEYWORD[i]);mat.SetTexture(TEXTURE_TYPE[i], AssetDatabase.LoadAssetAtPath<Texture>(textureFiles[diffuseName + TEXTURE_TYPE[i]]));}}mat.color = data.color;mat.SetFloat("_Metallic", data.metallic);mat.SetFloat("_Glossiness", data.glossiness);mat.SetColor("_EmissionColor", data.emissionColor);
    }

有时候我们可能会动态创建、或者加载一些物体需要改变一下物体的基本颜色,但是一个材质球我们可能用在很多物体上,所以就需要用到下边的这个方法;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SetMatColor : MonoBehaviour
{private Material cubeMat;//使用代码动态创建void Update(){if (Input.GetMouseButtonDown(0))cubeMat = new Material(Shader.Find("Assets/NewMaterial1"));//在project窗口中找到这个shader脚本Debug.Log("材质球名称:"+cubeMat.name);float r = 100 / 255;float g = 255 / 255;float b = 150 / 255;cubeMat.color = new Color(r, g, b, 1);//设置颜色(注意:new Color 的rgb的数值范围是0-1 ,无论你给rgb 设置的什么都要除于255,这样才是你在unity里面看到的颜色。 color32则是 0-255的数值范围)gameObject.GetComponent<Renderer>().material = cubeMat;//将设置的颜色赋给你的物体}}

material.SetColor("_TintColor", new Color(0.133333333f, 0.04313725f, 0, Mathf.Min(0.5f, fadeTime += Time.deltaTime / 10)));

修改材质球面板shader属性数值相关推荐

  1. Unity3D代码动态修改材质球的颜色

    代码动态修改材质球的颜色: gameObject.GetComponent<Renderer>().material.color=Color.red;//当材质球的Shader为标准时,可 ...

  2. Unity动态修改材质球

    脚本里直接两个材质球赋值代码,当不同情况触发时调用相应的函数: public class CM_missingScreen : MonoBehaviour {          public void ...

  3. Unity3D 获取子孙物体并修改材质球属性

    如图要获取划线物体并修改其材质球: private Transform[] FindChild; public Material ChangeMat;//变换后的材质球 private Materia ...

  4. unity 材质球无法编辑_【每天一个Unity技巧】批量修改材质球的主贴图和添加法线贴图...

    注释以后有空再写吧,加班到现在还没吃饭呢 using System.Collections; using System.Collections.Generic; using UnityEngine; ...

  5. Unity 修改材质球的属性为透明

    1 问题 新建cube时,Inspector面板中的Material是灰色的,无法修改. 2 设置材质 任意选一个材质就可以进行修改了. 3 下载资源 在asset store中下载ICE_sushi ...

  6. u3d:动态的用代码调节材质球的属性

    如图 以图中材质所圈属性为例子,点击材质球右上角的Edit Shader出现界面 每一个材质球中的属性都能在这里找到相应的变量,以及改变该变量所需要用到的参数类型 this.transform.Get ...

  7. Unity实现动态修改模型材质球

    一.定义需要替换的材质球(且加载该材质球) private Material _HighLightMat; //实现闪烁高亮效果材质球 _HighLightMat = Resources.Load(& ...

  8. Unity用代码批量修复材质球shader丢失的问题

    假设现在有一大批模型的材质球的shader丢失了,我们想把这批模型的材质球都使用Mobile/Unlit (Supports Lightmap)这个shader,挨个挨个点太麻烦了,可以用代码来批量执 ...

  9. Unity 自动创建材质球工具

    一个新的模型导入Unity,所有的材质都是绑定的不能修改,想调材质就只能一个个的去创建再拖贴图,想搞个工具一键创建材质并且上好贴图.百度了一下,这玩意靠谱的也是没几个,自己写一个吧. 这个稍微靠谱点, ...

最新文章

  1. HPE谢少毅:更敏捷的企业服务,做有生命力的落地实践
  2. Client Dimensions , offsetHeight , scrollTop 属性详解
  3. java js 转换_[Java教程]javascript 类型转换。
  4. createprocess 系统找不到指定的文件_windows找不到gpedit.msc请确定文件名
  5. 极简_Gradle多Module项目组建
  6. Angular:where does watchers in scope come from
  7. 给Sublime Text2安装GraphQL语法高亮插件
  8. 【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现
  9. Springboot2Web原生组件注入
  10. 软件架构-接口隔离原则
  11. DVWA中国菜刀连接不上问题(低安全级别就连不上,看看这!!)
  12. eclipse从SVN检出的项目大面积报错怎么办
  13. Android MVP模式 谷歌官方代码解读
  14. Python代码加密 - 4种方案
  15. GoogleEarth-- 一日坐看天下八千里
  16. 椭圆抛物面matlab程序,椭圆抛物面画法.pdf
  17. 科学解释超级计算机,人工智能、现代科学证明:宇宙是虚拟的,真实世界是超级计算机...
  18. 初中计算机实践研究计划,初中信息技术教研工作计划
  19. Eclipse小技巧--修改@auther和去掉//TODO
  20. pe中怎么卸载服务器系统更新,如何卸载win7系统更新用pe装win7

热门文章

  1. 用 22 张照片打开 23 年
  2. 没有windows安装光盘怎么修复计算机,电脑没有u盘光盘重装windows7系统的方法步骤教程 - 系统家园...
  3. 资产负债表和利润表的编制公式
  4. 【计量经济学导论】04. 多重共线性
  5. react函数组件实现四栏轮播图切换
  6. 第四章:3ds max样条线建模
  7. Parallels Desktop2023最新版免费虚拟机软件
  8. 推流yasea遇到问题,即调转摄像头算法
  9. ABAP HASH TABLE 主键重复时
  10. 第一节计算机课学什么,第一节电脑课作文