【Unity Shaders】Vertex Magic —— 访问顶点颜色
来源:互联网 发布:ios内购 java 编辑:程序博客网 时间:2024/05/24 04:30
本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。
这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。
========================================== 分割线 ==========================================
写在前面
啦啦啦~我又回来看书啦。文章开始说一些题外话。因为写博客和在群里比较活跃(为什么QQ给我的称谓是“吐槽”。。。我这么乖。。。),最近有一些朋友给我发邮件或者私信,很多人都给了我鼓励,我很开心,也有人给了我很好的学习建议,这些经历让我觉得坚持写博客是正确的一条路~也谢谢所有鼓励、支持和关注我的人!我会坚持下去的。
好啦,言归正传~这篇开始,我决定开始一个新的章节——Vertex Magic。顾名思义,就是学习顶点相关的内容。自从看了下面Unity Gems里面的一张图,我对整个Surface Shader的工作流程有了更好的理解,在此再重温一下。
可以看出来共有四个阶段我们可以参与。我们之前学习的大多是在上图的第二和第三个阶段,也就是编写surf和LightingXXX函数来影响表面着色和光照函数的。在卡通风格的Shader中,我们也对最后一个更改像素颜色的机会——finalcolor命令有了一个初步的尝试。而现在,我们将用一章的时间来学习如何利用第一个阶段——顶点函数来影响像素颜色。
顶点函数是在每个顶点被传送到GPU之前被调用一次。它的作用是从模型坐标系中得到三维坐标,然后再转换到其渲染到屏幕时在屏幕坐标系中的二维位置。因此,通过顶点函数,我们可以修改顶点的位置、颜色和UV坐标。一旦我们完成了对顶点的修改后,就会进入到surf函数的执行。与顶点函数是逐顶点执行的方式不同,surf函数则是逐像素执行的。
通过顶点函数,我们可以创造像海上的波浪、旗帜飘动的动态效果,或者使用Shader来给顶点着色。这一篇,我们来学习如何在一个Surface Shader中创建一个最简单的顶点函数!
准备工作
在深入学习顶点函数之前,我们得首先了解如何通过顶点函数得到和存储顶点相关信息。
- 首先,我们要准备一个已经给顶点着色过的模型,以便我们可以在顶点函数中查看顶点颜色。为了方便,我们使用本书自带资源(见文章开头)中第七章的模型资源——VertexColorObject.fbx。我们把VertexColorObject.fbx导入Unity,并拖入到一个新的场景中。最后添加一个平行光。
- 新建一个Shader和Material,可以分别命名为SimpleVertexColor,并将Shader赋给Material,再将Material赋给模型。
你的场景应该看起来是这样的:
实现
下面,我们开始编写Shader。
- 在Properties块中添加新的Properties:
Properties {_MainTint("Global Color Tint", Color) = (1,1,1,1)}
- 接下来,告诉Unity我们将使用自己的顶点函数:
CGPROGRAM#pragma surface surf Lambert vertex:vert
- 为Properties中新添加的属性添加对应的引用:
float4 _MainTint;
- 下面是很重要的Input结构。我们添加了一个新的变量vertColor以便surf函数可以访问vert函数中传递的数据:
struct Input {float2 uv_MainTex;float4 vertColor;};
- 下面是一个非常简单的vert函数。我们访问模型的顶点颜色,再存储到Input结构体中:
void vert(inout appdata_full v, out Input o){o.vertColor = v.color;}
- 最后,我们使用从Input中得到的数据填充SurfaceOutput结构体的Albedo参数:
void surf (Input IN, inout SurfaceOutput o) {o.Albedo = IN.vertColor.rgb * _MainTint.rgb;}
Shader "Custom/SimpleVertexColor" {Properties {_MainTint("Global Color Tint", Color) = (1,1,1,1)}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM#pragma surface surf Lambert vertex:vertfloat4 _MainTint;struct Input {float2 uv_MainTex;float4 vertColor;};void vert(inout appdata_full v, out Input o){o.vertColor = v.color;}void surf (Input IN, inout SurfaceOutput o) {o.Albedo = IN.vertColor.rgb * _MainTint.rgb;}ENDCG} FallBack "Diffuse"}
效果如下:
解释
void surf (Input IN, inout SurfaceOutput o) {o.Albedo = IN.vertColor.rgb * _MainTint.rgb;o.Alpha = IN.vertColor.a;}
- 【Unity Shaders】Vertex Magic —— 访问顶点颜色
- Unity Shaders and Effects Cookbook (7-1) 在Surface Shader 中 访问 顶点颜色
- 顶点着色器详解 (Vertex Shaders)
- 【Unity Shaders】Vertex & Fragment Shader入门
- Unity3D shader(6)——vertex shader(顶点颜色变换)
- Cg入门12:Vertex Shader - 几何变换 —顶点颜色变换
- Unity Shaders and Effects Cookbook (7-3) 在地形中使用顶点颜色做混合
- Vertex Shaders
- Unity中使用Vertex Snapping(顶点捕捉)
- OpenGL ES 2.0——顶点着色器Vertex Shader
- Unity3D shader(7)——Vertex Shader(顶点几何变换)
- OpenGL ES 2.0——顶点着色器Vertex Shader
- Cg入门13: Vertex Shader - 几何变换 —顶点位移
- Cg入门14:Vertex Shader - 几何变换 —顶点扭曲
- Unity Shader——Writing Surface Shaders
- 【Unity Shaders】学习笔记——序
- Unity Shader——Writing Surface Shaders
- Unity顶点光照路径细节(Vertex Lit Rendering Path Details)
- Error: javac: 找不到文件
- shell环境变量以及set,env,export的区别
- poj 3628 Bookshelf 2
- 黑马程序员:java集合框架(二)
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
- 【Unity Shaders】Vertex Magic —— 访问顶点颜色
- 线性dp<一>
- 设计模式六大原则(Design patterns six principles)
- 在Android中绘制圆角矩形图片
- 水仙花数(杭电2010)
- JCIP_5_01_CopyOnWriteArrayList为什么不会产生ConcurrentModificationException?
- uitabbarcontroller上的tabbaritem的图片设置
- Python读取键盘输入
- 关于iOS,Xcode的一些小技巧整理