Unity Shaders and Effects Cookbook (7-1) 在Surface Shader 中 访问 顶点颜色

在OpenGL中,需要顶点着色器和片段着色器的支持才能进行正确的渲染,在顶点着色器中,每一帧 对 场景中物体的每个顶点都要执行一次处理。

如果自己使用OpenGL,需要在C++ 代码读取模型数据,将顶点坐标、顶点颜色、UV坐标传递到顶点着色器中。

所以在顶点着色器中 ,是可以对顶点数据进行修改的。

搭建好测试场景,导入随书的FBX模型。

在Unity3d中,将FBX 或者其它模型  导入编辑器,默认会创建一个 Diffuse 材质。这个材质中是 没有顶点函数的,也就是说不能 对 顶点数据进行处理,所以导进来的 模型都是灰色的没有颜色的。

新建材质 VertexColor.mat ,新建 VertexColor.shader 。

下面给 Shader 添加 vert()函数 (顶点函数) ,来获取模型中的顶点颜色。

1、声明 vertex 参数,告诉Unity  我们的着色器中包含有一个顶点函数

pragma surface surf Lambert vertex:vert

2、编写顶点函数 vert()

void vert(inout appdata_full v,out Input o)
{

};

编写顶点函数的目的是,获取顶点颜色、传递到 surf () 函数中,顶点颜色存储在 appdata_full 这个结构体中,然后从 Input 中传出去,默认的 Input 中是没有存储顶点颜色的变量的,我们需要加上去。

struct Input
{
	float2 uv_MainTex;
	float4 vertexColor;
};

然后补充 vert() 顶点函数。

void vert(inout appdata_full v,out Input o)
{
    UNITY_INITIALIZE_OUTPUT(Input,o);
    o.vertexColor=v.color;
}

在UnityCG.cginc 文件中可以找到 appdata_full 的定义

struct appdata_full
{
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;
    fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
	half4 texcoord2 : TEXCOORD2;
	half4 texcoord3 : TEXCOORD3;
	half4 texcoord4 : TEXCOORD4;
	half4 texcoord5 : TEXCOORD5;
#endif
};

可以看到 appdata_full中包含了 顶点坐标、tangent、法线、UV、UV1、顶点颜色。转自http://www.thisisgame.com.cn http://blog.csdn.net/huutu

同时法线还有下面两个版本,可以根据需求选取。

struct appdata_base
{
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
};

struct appdata_tan
{
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
};

3、在 surf() 函数中使用 顶点颜色作为输出。

void surf (Input IN, inout SurfaceOutput o)
{
	o.Albedo=IN.vertexColor;
}

完整Shader 代码

Shader "CookBookShaders/Chapt7-1/VertexColor"
{
	Properties
	{
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 200

		CGPROGRAM
		#pragma surface surf Lambert vertex:vert

		sampler2D _MainTex;

		struct Input
		{
			float2 uv_MainTex;
			float4 vertexColor;
		};

		void vert(inout appdata_full v,out Input o)
		{
			UNITY_INITIALIZE_OUTPUT(Input,o);
			o.vertexColor=v.color;
		}

		void surf (Input IN, inout SurfaceOutput o)
		{
			o.Albedo=IN.vertexColor;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

将材质赋值给 模型,查看效果如下

测试工程下载:

http://pan.baidu.com/s/1pL3pkmv
时间: 2024-10-17 01:08:42

Unity Shaders and Effects Cookbook (7-1) 在Surface Shader 中 访问 顶点颜色的相关文章

unity, 在surface shader中访问顶点色

//ref: Custom data computed per-vertex: http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.htmlShader "Custom/myStandard_vertexColor" {    Properties {        _Color ("Color", Color) = (1,1,1,1)        _MainTex ("Albedo (RGB)

Unity Shaders and Effects Cookbook (4-6)震撼的实时反射 动态立方图系统

昨天逛街的时候看到太平鸟里面摆了个金属的米老鼠,于是职业病犯了,一直在想金属的颜色是什么,这个反射该怎么写,想不出来-- 今天正好看到动态反射立方图系统这一节,看完觉得很别扭,因为书上介绍的是事先踩点生成Cubemap的方式而不是实时的.于是到官方文档找到实时反射的代码,做了一个比较花俏的场景,运行之后吃了一大惊,实时反射是如此的震撼.. 第四章第一节第二节介绍了创建Cubemap,然后学习了如何使用. Unity Shaders and Effects Cookbook (4-1)(4-2)静

Unity Shaders and Effects Cookbook (4-3)遮罩反射

今天看完了4.3小节,Unity3d 中的遮罩反射,这一节内容比较少. 如果大家对Unity Shader 感兴趣的白菜,那么推荐大家购买一本 Unity 着色器和屏幕特效开发秘笈 .这本书写的浅显易懂,很适合入门. 当看完这本书,大概了解 Shader 的用处的时候,再去看更高级的 Shader 教程也可以. 京东图书连接 http://item.jd.com/1338728578.html 转自http://blog.csdn.net/huutu http://www.thisisgame.

Unity Shaders and Effects Cookbook (4-4)在Cubemap 上使用 法线贴图 (法线贴图与反射)

法线贴图 在之前学习过了,我们使用法线贴图在低分辨率的模型上 模拟 高分辨率的效果. Unity中 通过 UnpackNormal 函数 来使用法线贴图. 之前学习法线贴图的记录 Unity Shaders and Effects Cookbook (2-5) 如何使用法线贴图 这一节讲的是 在Cubemap 上使用法线贴图.模拟凹凸效果. 最终效果如图 一起来做吧. 首先搭建好场景,和上一节一样. 导入法线贴图 创建材质 .Shader . 复制上一节的 Shader 就行.然后修改成下面的内

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

上一节中说了,在 Surface Shader 中,添加顶点函数,我们可以在 顶点函数中获取到 顶点数据,比如顶点颜色.顶点坐标等. 这一节学习获取顶点坐标,并且修改顶点坐标,来实现顶点动画. 简单介绍原理: 在顶点函数中,获取到顶点坐标 vertex,然后,求float offsetY = sin(vertex.x) ,然后将 offsetY 加到 vertex.y 上,这样就把原来的平面 ,变成了 正弦 波浪. 然后再使用之前学过的 内置变量 _Time ,算式变为 float offset

Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器

对于游戏项目,透明是很消耗资源的一个操作,在Unity的Profile 中可以很直观的看到透明所消耗的系统资源. 在Unity的表面着色器 Surface Shader 中,我们可以很方便的创建一种全透明的效果.如草的表面.这一节学习 通过在 #pragma 语句中添加 alpha 参数 来使用透明功能. 这一节我使用了下面这张贴图作为球 的表面纹理. 这张 512x 512 的图片分为了 4个色块区域.分别是 Green .Red.White.Blue. Green:就是 G通道为1,R.B

Unity Shaders and Effects Cookbook (2-4) 压缩和混合纹理贴图:使用灰度图存储插值信息

这一节看了几次才慢慢的读懂. 首先是这个灰度图,为什么叫灰度图,是因为 这个图片中的 R.G.B 存放的都是同一份数据,打开Unity 来调一下颜色看看 更直观. 可以看到,当 R.G.B 三个值相同的时候,图片是只有黑白,而丢失了其它的颜色的,所以我们叫灰度图. 什么时候用到灰度图? 本文转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 比如说高度图,在这个坐标的点,海拔高,就记作 1,海拔低就记作0 .把这一份数据 同时存储到

Unity Shaders and Effects Cookbook (3-6) 创建各向异性高光类型(Anisotropic) 模拟金属拉丝效果

这一次学习各向异性高光类型,名字真拗口,Anisotropic 这个英文单词也很拗口. 各向异性是模拟物体表面 沟槽方向性的高光反射类型,他会修改或延伸垂直方向上的高光. 比如模拟金属拉丝的效果,就可以使用各向异性来模拟. 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 首先需要准备一张各向异性 的法线贴图,代表各向异性镜面高光的方向性. 注意法线贴图导入到Unity之后要在属性面板中勾选类型为 Normal Map. 首先在

Unity Shaders and Effects Cookbook (6-4) GUI 和 透明度

在游戏项目中使用透明最多的地方就是 GUI 了.这一节用一个非常简单的 GUI 例子,来熟悉控制透明物体的渲染顺序. 搭建场景,导入随书资源. 创建着色器 GUI,创建两个Material,一个 GUIBG 用于背景图片,一个 GUIGRP 用于 按钮界面. 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 把创建的Material 分别赋值给 GUIBG 和 GUIGRP. 场景搭建完毕后 效果如下 因为创建的Shader 默认