【Unity Shaders】Diffuse Shading——创建一个基本的Surface Shader

原创 2013年12月05日 00:46:26

本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。

这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。

========================================== 分割线 ==========================================



这一次的工作非常简单,我们主要是为了了解Unity Shaders的基本工作原理。



准备工作

  1. 创建一个新的Unity Project
  2. 在Assets目录下新建一个文件夹:Shaders
  3. 在Assets目录下新建一个文件夹:Materials

实现

  1. 在Shaders文件夹下,点击右键新建一个Shader,命名为BasicDiffuse,并打开它;
  2. Materials文件夹下,创建一个Material,并使用我们之前创建的BasicDiffuse.shader;
  3. 创建一个Sphere,并把之前创建的Material拖到它上面,查看效果;
  4. 你还可以给Material添加一个texture。


解释

打开BasicDiffuse.shader后,我们可以发现Unity实际上已经为我们写好了很多代码:

Shader "Custom/BasicDiffuse" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {
			half4 c = tex2D (_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}

  1. 第一行表明了这个shader在Unity中的路径,它会出现在你选择某个Material的shader时的下拉列表里,并且可以随时更改;
  2. 最后一行表明,当这个shader在当前环境中运行失败后,会默认调用Unity自带的Diffuse Shader;
  3. 其他内容在下面的章节会讲到。

Unity内部使用的是Cg来实现的,它把这些实现细节封装了起来,提供我们一种基于构件的编写shader的方法,像调整图片的uv坐标、矩阵转换等工作它都帮你做好了。而以前,我们需要重复编写一些基本功能的代码,来从头创建一个shader。当你的经验逐渐丰富起来,自然而然就会想要了解Unity是怎样处理图像处理单元(GPU)的工作的。如果你想了解Unity是怎样调用Cg的,可以到Unity的安装目录Unity4\Editor\Data\CGIncludes  下查看。在靠后面的一些章节中,会讲到。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Unity加载模块深度解析之Shader篇

原文链接:http://blog.uwa4d.com/archives/LoadingPerformance_Shader.html 接上一篇Unity加载模块深度解析之网格篇 ,我们重点讨论了...
  • UWA4D
  • UWA4D
  • 2016年12月28日 10:43
  • 928

Unity3D内置Shader私房课(一)视差Parallax

在Unity内建Shader的DefaultResourcesExtra的目录中,可以看到Normal-Parallax.shader这个文件。可以使用这个shader配合法线贴图创建视差效果来更好的...
  • ecidevilin
  • ecidevilin
  • 2016年11月14日 22:37
  • 1518

【Unity Shaders】Diffuse Shading——创建一个自定义的diffuse lighting model(漫反射光照模型)

上一篇中,我们学了怎样在surface shader(这里即指surf函数)中使用自己定义的Properties变量。而在之前的学习中,我们实际上使用的都是Unity内置的Diffuse Lighti...
  • candycat1992
  • candycat1992
  • 2013年12月20日 15:01
  • 14617

常见两种Shader讲解

Vertex and Fragment Shader与Surface Shade的一些常见性质
  • aiyan1111111
  • aiyan1111111
  • 2016年10月24日 22:25
  • 1470

【Unity Shaders】Diffuse Shading——使用2D ramp texture来创建一个假的BRDF(双向反射分布函数)

终于到了Diffuse Shading一章的最后一篇了!回忆一下,在上一篇中,一共学习了两种改善漫反射光照的方法:一种是完全根据感性认识,使用Half Lembert方法改变了光照值区间,使得物体颜色...
  • candycat1992
  • candycat1992
  • 2013年12月22日 17:33
  • 14794

【Unity5.x Shaders】最基本的Surface Shader-Diffuse shader以及Surface中的三种输出结构

某些物体可能具有均匀的颜色和光滑的表面,但光滑程度不足以照射反射光。 这些哑光材料最好用Diffuse Shader。 在现实世界中,不存在纯diffuse materials Di...
  • TreePulse
  • TreePulse
  • 2016年10月17日 22:33
  • 1336

【Unity Shaders】概述及Diffuse Shading介绍

概述 几个月以前我就一直在找关于Unity Shader相关的资料,大三的时候有一门叫《计算机图形学》,让我觉得如果游戏程序员要从beginner成长为advancer,就必须了解底层渲染的一些知...
  • candycat1992
  • candycat1992
  • 2013年12月03日 17:34
  • 17279

Unity Shaders and Effects Cookbook (1-1) 基本的表面着色器 (Surface Shader)

在 Shader 中,对指定的 _EmissiveColor 进行了 以 _EmissivePowValue 为指数的求幂。 在编辑器中对 EmissiveColor 指定的值是 0-255 范...
  • cp790621656
  • cp790621656
  • 2016年03月15日 01:10
  • 1708

Unity Shader——Writing Surface Shaders

从今天起,开始翻译Unity关于shader的官方文档。翻译水平比较一般,目的主要是通过翻译来提升对shader的见解,也让其他人更容易的了解shader。以下开始正文内容:   编写Su...
  • u012966744
  • u012966744
  • 2015年05月15日 16:49
  • 892

Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画

使用顶点函数,我们可以访问网格中的每个顶点位置。这使我们在着色器运行的过程中可以动态的改变顶点位置。创造出丰富的效果。...
  • cp790621656
  • cp790621656
  • 2016年05月12日 01:14
  • 10478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Unity Shaders】Diffuse Shading——创建一个基本的Surface Shader
举报原因:
原因补充:

(最多只允许输入30个字)