Unity3d shader 教程二 最小着色器

本教程将介绍在Unity中创建最小Cg着色器的基本步骤。

启动Unity并创建新项目

下载并启动Unity后,您可能会看到一个空项目。如果没有,您应该从菜单中选择“文件”>“新建项目…”来创建一个新项目。对于本教程,您不需要导入任何软件包。

如果您不了解Unity的场景视图,层次结构窗口,项目窗口和检查器窗口,读者应该参考Unity手册(Unity基础知识资源工作流程主窗口)这三部分。

创建一个Shader

创建Cg着色器并不复杂:在项目窗口中,单击Create并选择Shader> Standard Surface> Shader。一个名为“NewSurfaceShader”的新文件应该出现在项目窗口中。双击它以打开它(或右键单击并选择打开)。应该出现一个包含Cg默认着色器的文本编辑器。(要更改Unity使用的文本编辑器,请从主菜单中选择Edit> Preferences … > External Tools ,然后更改外部脚本编辑器的设置。)

现在,删除所有文本,并将以下着色器复制并粘贴到此文件中:

Shader "Cg basic shader" { //定义着色器的名称 
   SubShader { //Unity选择最适合GPU的subshader
      Pass { //有些着色器需要多个Pass
         //这里开始Unity的Cg部分
         CGPROGRAM 

         //将vert函数指定为顶点着色器函数
         #pragma vertex vert 
         //将Frag函数指定为片段着色器函数    
         #pragma fragment frag 

         //顶点着色器函数 
         float4 vert(float4 vertexPos:POSITION):SV_POSITION 
         {
            return mul(UNITY_MATRIX_MVP, vertexPos);
            //该行将顶点输入参数vertexPos转换为内置矩阵UNITY_MATRIX_MVP,
            //并将其作为无名顶点输出参数返回 
         }

         //片段着色器函数
         float4 frag(void):COLOR 
         {
            return float4(1.0, 0.0, 0.0, 1.0); 
            //此片段着色器返回设置为不透明红色(red=1,green=0,blue=0,alpha=1)
            //的无名片段输出参数(带语义COLOR)
         }

         ENDCG //这里是CG的结束部分
      }
   }
}

保存着色器(通过单击保存图标或从编辑器菜单中选择 File > Save )。

恭喜,您刚刚在Unity中创建了一个着色器。如果需要,您可以重命名着色器文件。(重命名后,请在编辑器中重新打开着色器,以确保正在编辑正确的文件。)

不幸的是,在着色器连接到材质(Material)之前,看不到任何东东。

创建材质(Material)并附加着色器

要创建材质,请返回到Unity并通过在“ 项目”窗口中单击“ Create”并选择“ Material ”来创建新材质。新材质(默认名为“New Material”)将出现在项目窗口中。(您可以像着色器一样重命名它。)如果未选择,请通过单击来选择它。有关材质的详细信息现在显示在检查器窗口中。为了将着色器设置为此材质,您也可以

  • 拖放项目窗口中的着色器材质或
  • 在选择材质项目窗口,然后在Inspector窗口选择着色器(在这种情况下,如上面的着色器代码中指定“CG基本着色器”)从标有下拉列表着色器。

在任意一种情况下,材质的检查器窗口中的预览将显示红色球体;
如果没有,您可能必须单击检查器窗口底部的灰色条,使其出现。如果没有预览或球体是明亮的洋红色,则应在Unity窗口的底部显示错误信息。在这种情况下,您应该重新打开着色器,并在编辑器中检查文本是否与上述相同。

交互式编辑着色器

这将是玩着色器的好机会,特别是,您可以轻松地在片段着色器中更改颜色。通过打开着色器并使用以下代码替换frag函数中的代码,尝试把它变成绿色:

// 片段着色器函数
float4 frag(void):COLOR 
{
    return float4(0.6, 1.0, 0.0, 1.0); 
    // (red = 0.6, green = 1.0, blue = 0.0, alpha = 1.0)
 }

您必须将代码保存在编辑器中,并再次激活Unity窗口以应用新的着色器。
如果在“Project 窗口”中选择材质,“Inspector 窗口”中的球体现在应该是绿色的。 你也可以通过修改红、绿、蓝的三个值来找到最暖的橙色,或者最深的蓝色。
(实际上,有一部电影是关于找到最暖的橙色,另一部是关于深蓝色的电影,几乎是黑色的。)

您也可以在函数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,将任何输入的几何体压扁。(这是向量的一个经典用法;如果想了解Cg中的向量和矩阵的更多信息,请阅读 “向量和矩阵操作”中的讨论部分)

如果着色器未编译成功,Unity将在底部显示错误消息,并将其显示为明亮的洋红色。为了看到所有的错误和警告信息,你应该在Project窗口中选择这个shader,然后在Inspector窗口中阅读所看到的信息,包含了行号。您也可以通过从菜单中选择Window > Console来打开控制台窗口,但这有时不会显示所有错误消息,因此有时不会报告关键错误。

把材质赋给游戏物体

我们还有一个重要的步骤:将新材质附加到三角网格。为此,通过从菜单中选择GameObject> 3D Object> Sphere来创建一个球体(它是Unity的预定游戏对象之一)。球体应出现在Scene视图中,标签“Sphere”应显示在Hierarchy窗口中。(如果没有出现在Scene视图中,在Hierarchy 窗口中单击它,移动(不点击)鼠标到Scene视图上,然后按“f”,球体现在应该在Scene视图中居中显示。

要将材料附加到新球体,您可以:

  • 将材质从Project窗口中拖拽到Hierarchy窗口中的球体上,或者
  • 将材质从Project窗口中拖拽到Scene窗口中的球体上,或者
  • 在Hierarchy窗口中选择球体,在Inspector窗口中找到Mesh Renderer组件(如果该组件没展开,就点击组件名字让它展开),将“Default-Diffuse”默认材质修改为新的材质,单击打开Mesh Renderer中的Materials设置。点击材质名称右侧的小原点图标,然后在弹出的窗口中选择想要指定的材质。

无论如何,场景视图中的球体现在应该具有与Inspector 窗口中的材质的预览具有相同的颜色。再修改shader代码的话(保存并切换回Unity窗口之后),Scene窗口中的球体的表现就应该立即被改变了。

在场景中保存你的作品

还有一件事:你应该把你的工作保存在一个“场景”中(通常对应一个game level)。选择File > Save Scene (或者 File > Save Scene As… ) ,然后在项目的“Assets”目录中选择一个文件名。场景文件应该出现在Project 窗口中,并可以在下次打开项目时使用。

术语的注意事项

可能有必要把几个术语明确一下。在某些API中,“着色器”指的是顶点着色器或片段着色器。两者的组合称为“程序”。在另一些API的解释是:“程序”是指顶点程序或片段程序,两者的组合是“着色器”。不幸的是,Unity的文档混合了这两个约定。为了简单起见,我们尝试在此避免使用术语“程序”,并使用术语“着色器”来表示顶点着色器和片段着色器的组合。

总结

恭喜,您已经看完本章节教程了。在这章节中您学习到了:

  • 如何创建一个着色器
  • 如何在Unity中定义Cg顶点和片段着色器。
  • 如何创建材质并将shader附加到材质上。
  • 如何使用片段着色器中的语义COLOR操作片段输出参数。
  • 如何使用顶点着色器中的语义POSITION来转换顶点输入参数。
  • 如何创建游戏对象并附加材质(material)。
    恩,其实这里东西真不少呢。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值