Unity Cg Shader编程 第一章 第一节

</pre>1. 基础知识1.1 最小的shader这篇教程主要讲在Unity中创建一个最小的shader所需的基本步骤。打开Unity,创建一个新的工程下载一个unity然后运行,你会看到一个空的工程。或者你可以创建一个新的工程, 在菜单中点击File->New Project...在这篇教程中,你不需要导入任何Unity插件或者package。以后的一些高级教程可能会需要导入一些脚本和天空盒组件。如果你对于Unity不是很熟悉的话,建议先读一下Unity使用手册的前两章节。创建一个Shader创建一个Cg shader不是很复杂:在Project视图里面,点击Create,然后选择Shader。一个新的文件“New Shader”就会出现在Project视图中了。双击这个文件可以打开它(或者右键点击,然后选择打开)。然后,一个默认的文本编辑器就会出现。删除编辑器中的所有文本,然后复制粘贴以下shader代码到编辑器中:<pre name="code" class="cpp">Shader "Cg basic shader" { // 定义shader的名字
  SubShader { // Unity为不同的GPU选择不同的subshader
    Pass {  // 某些shader需要多个Pass
      CGPROGRAM // Cg开始


      #pragma vertex vert
      // 指明顶点函数vert


      #pragma fragment frag
      // 指明片元函数frag


      float4 vert(float4 vertexPos : POSITION) : SV_POSITION
      // 顶点函数
      {
        return mul(UNITY_MATRIX_MVP, vertexPos);
        // 这个函数执行顶点坐标变换。他把由顶点函数传入的顶点
        // 位置与Unity內建的矩阵UNITY_MATRIX_MVP相乘,
        // 然后返回一个没有命名的顶点输出参数。
      }


      float4 frag(void) : COLOR // 片源函数
      {
        return float4(1.0, 0.0, 0.0, 1.0);
        // 这个函数返回一个没有名字的片元输出参数(实际上是颜色)。
        // 该颜色是不透明的红色(红色=1,绿色=0,蓝色=0,透明=1)。
      }


      ENDCG // Cg代码结束
    }
  }
}

保存shader文件。选择编辑器菜单中的文件->保存。
恭喜你,你已经成功在Unity里面创建了一个shader。如果你想给这个shader改名字的话,在Project视图中,点击名字,然后重新输入你想要的名字,然后回车。(重命名后,重新打开这个shader文件,确保你打开的是正确的文件。)
不幸的是,你现在还看不到shader的效果,因为你还没有把它设置给材质。


创建一个材质然后给它设置一个shader
要创建一个材质,在Unity的Project视图中点击Create,然后选择材质(Material)。成功创建材质后,会在Project视图中出现一个名字是“New Material”的对象。你可以重新命名它,就和重新命名shader一样。用鼠标选中它,一些详细的信息会出现在Inspector视图中。给材质设置shader可以使用以下的方法:
>>拖拽shader放到材质上,或者
>>在Project视图中点击材质,然后在Inspector视图中的shader下拉列表中选择一个shader。在本例子中,选择我们之前刚刚创建的shader。
不管使用哪一种方式,现在刚刚创建的材质会显示成一个红色球体。如果不是这种状态,一个错误提示会在Unity的Console视图中显示出来,你应该重新编辑shader文件确保输入的文本与上面的shader例子一样。


使用交互的方式来编辑shader
现在是时候让我们来玩一下shader了。你可以轻松的更改片元着色器输出的颜色。使用以下的代码来替换片元函数中的代码,你就可以得到霓虹绿色。

float4 frag(void) : COLOR // 片元着色器函数
{
  return float4(0.6, 1.0, 0.0, 1.0);
  // 红色=0.6,绿色=1.0,蓝色=0.0,透明=1.0
}

在编辑器中保存新的代码,然后回到Unity,Unity窗口会更新新的shader。选择刚才创建的材质,材质球的颜色现在会显示成绿色。你自己你可以随意修改RGB的颜色值,创建比如暖暖的橘色或者深深的蓝色。(实际上,有一部电影就是讲如何找到最暖的橘色和接近黑色的蓝色。)
你也可以玩玩顶点着色器vert函数,比如,试试下面的代码:

float4 vert(float4 vertexPos : POSITION) : SV_POSITION
// 顶点着色器函数
{
  return mul(UNITY_MATRIX_MVP,
    float4(1.0, 0.1, 1.0, 1.0) * vertexPos);
}

这个顶点着色器函数让输入的任意几何顶点的y坐标乘以0.1,它让输入的几何体变得扁平。(这是一个向量积,想了解更多的向量和矩阵的知识,请阅读“向量和矩阵操作”章节。)
如果shader没有被编译,Unity会在屏幕的下方区域显示红色的错误信息。如果想看到所有的错误信息和警告,在Project视图中选中shader,阅读Inspector视图中的信息,它会显示出错的行数。你也可以打开Console视图,点击菜单中的Window->Console进入Console视图。但是Console视图不会显示所有详细的错误信息,所以有时很关键的错误不会被显示出来。


给游戏对象(GameObject)设置材质
我们还需要很重要的一步要走:给三角形网格附加新的材质。在菜单中,选择GameObject->Create Other->Sphere创造一个球体(球体是Unity中预制的一个游戏对象,Unity新版本中是GameObject->3D Object->Sphere)。这样一个球体就会出现在Scene视图中,在Hierarchy视图中同时也会有一个“Sphere”出现。
给新建的球体设置材质可以使用以下的方法:
>>从Project视图中拖拽材质放到Hierarchy视图中的球体上,或者
>>从Project视图中拖拽材质放到Scene视图中的球体上,或者
>>在Hierarchy视图中选择球体,在Inspector视图中找到Mesh Renderer组件,展开Materials设置。把“Default-Diffuse” 材质设置成为我们之前新建的材质。设置方法是点击它右侧的一个中心是黑点的圆圈,然后在弹出的对话框中选择我们刚刚创建的材质。
现在,在Scene视图中的球体现在的颜色和Inspector视图中的材质颜色应该是一致的。改变shader的代码会使Scene视图中的球体的外观发生改变。


保存Scene
还有一件事情就是保存你的Scene(通常是游戏的关卡)。选择菜单中的File->Save Scene(或者 File->Save Scene As...),写入Scene的名字。通常会被保存在工程目录下面的“Assets”文件夹中。Scene文件在下次打开Unity的时候,会出现在Project视图中。


关于名词定义
我们最好确定一下名词定义。在某些API中,“shader”指的是一个顶点着色器或者一个片元着色器。这2个着色器在一起被称作程序(Program)。在另外一些API中,是另一种方式。一个程序(program)指的是一个顶点着色器或者一个片元着色器。这2个着色器在一起被称作“shader”。不幸的是,Unity文档中,这两种名词定义都会用到。在本教程中,为了简单,我们不用“program”这个概念。我们会用“shader”来表示一个顶点着色器和一个片元着色器。


小结
恭喜,你已经快要完成这一部分的教程了。相信你已经知道:
>>如何创建一个shader。
>>如何在Unity中定义Cg顶点着色器和片元着色器。
>>如何创建材质并给材质设置shader。
>>如何在片元着色器中操作颜色输出。
>>如何在顶点着色器中进行位置变换。
>>如何创建游戏对象并且设置材质。
这些东西真是不少啊!


更多阅读
如果你想要了解更多关于:
>>顶点着色器和片元着色器,请阅读“可编程渲染管线”章节。
>>顶点坐标变换,比如UNITY_MATRIX_MVP,包含模型-视图矩阵和投影矩阵,你应该阅读“顶点坐标变换”章节。
>>Cg中的向量和矩阵,你应该阅读“向量和矩阵操作”章节。
>>如何应用顶点坐标变换,比如比如UNITY_MATRIX_MVP,请阅读章节“应用矩阵变换”。
>>Unity ShaderLab语言,请阅读Unity ShaderLab手册。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值