顶点色的访问

顶点函数是在每个顶点被传送到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坐标等值。在本节中我们使用了一个从maya导入的已给顶点着色的模型,但我们可以发现,在使用默认材质的情况下这些颜色在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;

}

时间: 2024-08-23 09:44:47

顶点色的访问的相关文章

[小明学Shader]9.顶点方法(Vertex Function)和顶点色

渲染过程中,Shader总是优先对每个顶点进行计算(这里如果我们用顶点方法,那么我们的顶点方法就会被调用);顶点计算出后按照一定的格式输出给下面的流程,其中的某一步就是我们放置的surfa方法,它接收的输入可以进行一定的控制(我们将用顶点方法输出). 整个 shader 相关流程如下: 1. shader 准备对一个顶点进行计算.因我们自定义顶点方法,因此 vert 被调? 2. vert 的第一参数决定该顶点需要带进来哪些属性,我们得到这个属性里的顶点色,把这个顶点色放到 Input 结构中,

火云开发课堂 - 《Shader从入门到精通》系列 第三节:在Shader中使用顶点色

<Shader从入门到精通>系列在线课程 第三节:在Shader中使用顶点色 视频地址:http://edu.csdn.net/course/detail/1441/22667?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

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)

max 顶点色绘制

https://blog.csdn.net/zolin7/article/details/79854073?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1 原文地址:https://www.cnblogs.com/nafio/p/1264368

Vertex and FragmentShader顶点与片段着色器

一.顶点与片段着色器简介 Vertex and FragmentShader:最强大的Shader类型,也是本系列的重点,下文中简称V&FShader,属于可编程渲染管线.使用的是CG/HLSL语法.分为2个部分vertex顶点部分和Fragment像素部分.下面依然通过写几个简单的Shader来学习. 二. CG语言一些关键词和常用函数解释 1.Cg顶点程序必须在结构中传递顶点数据.几种常用的顶点结构定义在文件UnityCG.cginc中.在大部分情况下仅仅使用它们就够了.结构如下: 1.ap

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

_DataStructure_C_Impl:在图G中求距离顶点v0最短路径为k的所有顶点

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define MaxSize 50 //最大顶点个数 typedef enum{DG,DN,UG,UN}GraphKind; //边结点的类型定义 typedef struct ArcNode{ int adjvex;

Shader 之 顶点变形

可以使3D物体通过顶点变形弯曲,常见于跑酷游戏的跑道.可向左.右.上.下弯曲. Shader "Custom/VertexColorCurved" { Properties { // Shader需要的6个参数 _MainTex ("Base (RGB)", 2D) = "white" {} _QOffset ("Offset", Vector) = (0,0,0,0) _Dist ("Distance",

设计一个算法,求不权无向图连通图G中距离顶点v的最远的一个顶点

思想:图G是不带权的无向连通图,一条边的长度为1,因此,求距离顶点v的最远的顶点,即求距离顶点v的边数最多的顶点.利用广度优先遍历算法,从v出发进行广度遍历,类似于从顶点v出发一层层地向外扩展,到达j, -,最后到达的一个顶点k即为距离v最远的顶点.遍历时利用队列逐层暂存各个顶点,最后出队的一个顶点k即为所求.如图所示: 对应的算法如下: int Maxdist(AGragh *G,int v) { ArcNode *p; int Qu[MAXV]; //循环队列 int front=0,rea