博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
顶点色的访问
阅读量:5995 次
发布时间:2019-06-20

本文共 2104 字,大约阅读时间需要 7 分钟。

顶点函数是在每个顶点被传送到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)}

 

为Properties中新添加的属性添加对应的引用:

float4 _MainTint;

下面是很重要的Input结构。我们添加了一个新的变量vertColor以便surf函数可以访问vert函数中传递的数据:

 

struct Input {      float2 uv_MainTex;      float4 vertColor;};

 

最后,我们使用从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 200      CGPROGRAM      #pragma surface surf Lambert vertex:vert      float4 _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”}

效果如下:

解释

通过顶点函数,我们可以修改顶点的位置、颜色、UV坐标等值。在本节中我们使用了一个从导入的已给顶点着色的模型,但我们可以发现,在使用默认材质的情况下这些颜色在Unity中是不显示的。我们需要编写Shader,提取这些颜色再在模型上显示出来。

我们首先通过在#pragma声明中添加vertex:vert语句。这实际上告诉Unity,嘿,不要用你自己内置的顶点函数访问模型顶点信息啦,去我写的Shader里找一个名叫vert的家伙,用它去处理信息!如果Unity没有找到,它就会报一个编译错误。

vert函数里,除了我们熟悉的Input结构体,还有一个很特别的参数——appdata_full 。这个参数也是Unity内置的一个变量,它包含了模型顶点的所有信息,包括位置、切线、法线、两个纹理坐标和颜色信息。其他的还有appdata_base和appdata_tan,具体可以看见官网。

你还可以发现,vertColor是一个float4类型的变量,这意味着我们还可以访问它的透明通道。像下面这样:

void surf (Input IN, inout SurfaceOutput o) 

{

      o.Albedo = IN.vertColor.rgb * _MainTint.rgb;

      o.Alpha = IN.vertColor.a;

}

 

转载地址:http://hgmlx.baihongyu.com/

你可能感兴趣的文章
卡特兰数
查看>>
windows 2008 r2 安装TabsStudio
查看>>
级联分类器训练
查看>>
Linux命令工具基础04 磁盘管理
查看>>
SVG
查看>>
maven web配置发布路径 cargo自动部署项目到tomcat
查看>>
linxu select 返回值
查看>>
代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
Android开发(20)--RadioGroup的使用
查看>>
iphone开发之获取网卡的MAC地址和IP地址
查看>>
【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo...
查看>>
java中不常见的keyword:strictfp,transient
查看>>
INDEX--创建索引和删除索引时的SCH_M锁
查看>>
linux C(hello world)
查看>>
微信平台BAE
查看>>
数学图形之牟合方盖
查看>>
Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)复习...
查看>>
PHP多次调用Mysql存储过程报错解决办法
查看>>
mysql的二级索引
查看>>
Cobar是提供关系型数据库(MySQL)分布式服务的中间件
查看>>