Unity shader教程-第三课:实践!同一个shader,多个material。

本文首发地址:http://98jy.net/article/18

更多更及时的文章请关于98教育

这节课我们开始利用我们学到的Properties知识来改动代码,用一个shader实现如下图的几个不同的球体:

步骤:

  • 使用MonoDevelop打开shader文件
  • 保证Properties里面是如下内容
_EmissiveColor ("Emissive Color", Color) = (1, 1, 1, 1)
_AmbientColor ("Ambient Color", Color) = (1, 1, 1, 1)
_SomeValue ("Coefficient", Range(0, 10)) = 2.5
  • 找到代码中的#pragma surface surf Lambert这一行,回车另起一行后加入下面的三行代码
float4 _EmissiveColor;
float4 _AmbientColor;
float _SomeValue;
  • 清除原来在这个地方的
sampler2D _MainTex;
  • 找到方法 void surf(Input IN, inout SurfaceOutput o),把里面的内容改成
float4 c = pow((_EmissiveColor + _AmbientColor), _SomeValue);

o.Albedo = c.rgb;
o.Alpha = c.a;

为保证你做成的最后内容跟我的一样,这里是最后的shader代码

Shader "myDiffuse"
{
	Properties
	{
		_EmissiveColor ("Emissive Color", Color) = (1, 1, 1, 1)
		_AmbientColor ("Ambient Color", Color) = (1, 1, 1, 1)
		_SomeValue ("Coefficient", Range(0, 10)) = 2.5
	}

	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 200

		CGPROGRAM
		#pragma surface surf Lambert

		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _SomeValue;

		struct Input
		{
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o)
		{
			float4 c = pow((_EmissiveColor + _AmbientColor), _SomeValue);

			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

到这里,我们就可以保存shader。回到Unity中。

回到Unity后,选中名字为myDiffuse的material,然后按下键盘上的Ctrl+D,复制出material,把它改名为myDiffuse2。同样的方式,复制出myDiffuse3, myDiffuse4。这个方式,能让我们制作出使用同一个shader的不同的四个material出来。

在Scene面板中,如果你没有加满4个sphere,可以现在添加。然后分别给这四个球拖入我们的myDiffuse、myDiffuse2、myDiffuse3、myDiffuse4这几个material。

选中任意一个material,你可以在Inspector上选择Emissive Color或者Ambient Color,也可以通过拖动滑动条来改动数值,改动的过程中可以看到Scene中的物体会随你的改动而变化显示。同时,虽然我们只写了一个shader用到4个物体上,改动一个物体的material并不会影响到跟它使用不一样的material的物体。也就是说,我们属性里的值,其实是存在于material中。在我们改变相关的值的时候,unity会把值存到material对应的文件中,并在运行的时候,作为shader需要的参数送到shader中。由此,虽然我们只写了一个shader,但是因为送入的参数不同,因此物体的表现也就不同(为那些好奇的人,这节课的附录部分介绍了怎么打开material文件的方式,可以看到存储的内容)。

对于我们上面改动的代码的解释

当你在Properties块声明一个新的属性值的时候,你也就给shader提供了一种让用户通过Inspector面板调整内部值的方式。每个变量都会存储下最后用户修正的结果。但是,如果代码需要在SubShader{}这个块中用到这些值,必须在这个块中同时声明同样名字的变量,这个方式把我们在Inspector上的值和最后代码的值链接起来,形成一个整体。

一旦你在SubShader{}块中声明这些变量后,你就可以在surf()方法中使用到这些变量了。surf()方法中,我们用到的pow()方法是NVidia的cg语言提供的一个方法,unity shader可以用cg中的方法,这个方法跟其他语言中的pow类似,是“返回指定数字的指定次幂”。

附录:

Unity提供了把一些文件存成文本型的方式,我们可以利用这个方式来查看material文件的内容。

步骤:

  • 菜单 Edit | Project Settings | Editor,会打开如下的面板

  • 该面板的Asset Serialization中,Mode点开,选择 Force Text
  • 等进度条完成任务
  • 硬盘上找到我们的myDiffuse材质(material)文件(以.mat)结尾,用可以打开文本文件的软件打开(写字本、Ultraedit、Notepad++都可以)
  • 查看里面的内容,我这里的如下图

图中高亮的地方可以看到我们选择的颜色值。

时间: 2024-10-10 10:31:53

Unity shader教程-第三课:实践!同一个shader,多个material。的相关文章

Unity shader教程-第六课:Ramp Texture

本文首发地址:http://98jy.net/article/25 更多文章,请入传送门 ---------------------------------------------- Ramp Texture在Valve公司的军团要塞2后开始成为一种控制漫反射的方法. Ramp Texture是类似下图的一张贴图: 在一般的Blinn/Phong模型中,我们对漫反射的系数是基于入射光和击中的点的法线的角度.在这种情况下,系数的计算代码大致如下: float DiffuseCoeff(in flo

NeHe OpenGL教程 第三课:颜色渲染

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. 第三课:颜色渲染 添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色. 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边形添加2种不同类型的着色方法.使用F

[译文]JOAL教程 第三课 多声源播放

[译文]JOAL教程 原文地址:http://jogamp.org/joal-demos/www/devmaster/lesson3.html 原文作者:Athomas Goldberg 译文:三向板砖 转载请保留以上信息. 本节对应的连续代码页及学习笔记:http://blog.csdn.net/shuzhe66/article/details/40260861 第三课 多声源 本文是DevMaster.net(http://devmaster.net/)的OpenAL教程对应的JOAL版本.

Unity shader教程-第四课:自定义光照模型(方程)

本文首发地址:http://98jy.net/article/22 更多文章,请入传送门 ---------------------------------------------- 在我们前面的课程中,有一行代码如下 #pragma surface surf Lambert 这行代码指示unity在编译我们的shader代码的时候,选用"Lambert"这个光照模型.它的格式是 #pragma surface surf LightModel 其中LightModel是unity自带的

Unity shader教程-第五课:自定义光照模型之Half Lambert模型

本文首发地址:http://98jy.net/article/24 更多文章,请入传送门 ---------------------------------------------- Half Lambert光照模型是Valve公司在制作"半条命"游戏时发明的,用来给在比较暗的区域显示物体.总体来说,该光照模型提高了物体表面的漫反射光.下图是Valve的示例,左手边是Lambert模型,右手边是Half Lambert模型. 使用我们原来的基础的shader,我们把LightingBa

ionic新手教程第三课-在项目中使用requirejs分离controller文件和server文件

继上篇教程中提到的,我们新建一个简单的tabs类型的Ionic项目. 依据文件夹文件我们知道,系统自己主动创建了一个controller文件和server文件,而且把全部的控制器和服务都写到这两个文件中面. 这是一个简单的项目,业务逻辑代码也非常少.这样子实现并没有什么问题.可是当我们的项目越写越多.业务逻辑越来越复杂.假设我们还是把全部的控制器写到同一个文件中面.那可能我们将要面对的就是一个有着上万行代码的文件. 每次编辑仅仅能通过搜索keyword来定位了. 所以真正编辑项目的时候我们应该都

【Mongodb教程 第三课 】MongoDB 删除数据库

dropDatabase() 方法 MongoDB db.dropDatabase() 命令是用来删除一个现有的数据库. 语法: dropDatabase() 命令的基本语法如下: db.dropDatabase() 这将删除选定的数据库.如果还没有选择任何数据库,然后它会删除默认的 ' test' 数据库 示例: 首先,检查列表数据库通过使用命令 show dbs >show dbs local 0.78125GB mydb 0.23012GB test 0.23012GB > 如果想删除新

Unity3D 开发之shader教程(浅谈GPU渲染之shader language概述)

尊重他人智慧成果,欢迎转载,请注明作者 心若透明 地址  http://www.cnblogs.com/ubanck/p/4110618.html 在上一篇博客里,大致讲解了一下3D渲染的原理,即从一个简单的模型到渲染到屏幕的过程!其中提到了重要的坐标变换方式,说的不够清楚!今天来谈谈shader语言的执行过程 从硬件上讲,GPU内部有顶点着色器与片段着色器,从渲染管线来看,顶点着色器控制这顶点的坐标转换过程,片段着色器控制像素的颜色计算过程.顶点着色器将顶点转换完成,输入到片段着色器进行处理(

Unity shader教程-第一课:写shader和应用shader的流程

这是我们Unity shader(着色器)教程的第一课,在这节课中,你会学到怎么样来用程序来编写一个在Unity中能使用的着色器:漫反射着色器.这节课的内容主要让我们熟悉创建shader和应用shader的流程. 准备工作: 安装Unity版本4.6以上 创建一个新的工程 菜单GameObject | 3D Object | Plane创建出一个平面,作为我们的地面 菜单GameObject | 3D Object | Sphere创建出球来,反复多次创建多个 注意: 1. 创建地面后选中该物体