在没有接触Unity3D  Shader 之前,总感觉shader特别神奇,因为听说是对渲染流水线进行编程,就是对GPU进行编程。听着特别高大上。这不,最近刚刚接触Shader,学了几个小案例,然后本文作为学习笔记将这个小案例的实现记录下来。

笔者也是刚开始学习shader 没几天。在刚开始学shader 的时候,刚觉shader好难,面对shader一些奇怪的语法和一些语义,有点让人头疼。学着感觉一头雾水,因为在学一些小案例之前还需要学习(复习)一些数学知识,因为涉及到坐标空间的转换,所以看了很多矩阵运算和其他的一些数学知识。

我想很多学shader的人和我一样吧,刚开始接触shader的时候,发觉好难,我觉是因为没有实现过一些小案例,所以让shader披上了一层神秘的面纱。等实现了一些小案例就会发现,原来这东东是这样玩的···

接下来我们就来实现一个小案例,效果如下图:

然后来看看实现这种效果的过程

1.首先我们先建立一个测试项目,然后创建一个material(材质) 和 shader  ,在场景中创建一个球体和胶囊体。

2.把创建的shader赋给材质:

3.接下来就打开编辑器对shader进行编辑。

在此之前我们先来简单了解以下shader框架

Shader "Custom/myshader"{
Properties
{
// 属性
}
Subshader
{
// 用于实现效果
}
}

简单了解过后,我们在Properties区域添加我们所需要的属性

    Properties
{
_Color("Base Color",color)=(,,,)
_MainTex("Base(RGB)",2D) = "white"{}
}

属性将会显示在材质的属性面板上,我们就可以通过面板对上面两个属性进行值的变换。为了让美术和程序员合作,在shader中属性的定义就是作为一个接口,程序员定义这个接口让美术来调节渲染效果。

然后来看shader的核心部分,Subshader

Subshader
{
Tags{"Queue" = "transparent" "RenderType" = "transparent" "IgoreProjector" = "true" } // 定义渲染所需要的一些标签,读者可以去查阅其他资料进行了解,在此不再累述
Blend SrcAlpha oneMinusSrcAlpha // 混合
pass // 渲染通道 注:一个Subshader里可以有多个pass
{
CGPROGRAM // 开始CG代码
#pragma vertex vert // 重点,对顶点vert函数进行声明
#pragma fragment frag // 对片元frag函数进行声明
#include "UnityCG.cginc" // 引入需要的文件(就像C++语言里的include一样) sampler2D _MainTex; // 变量名称要和properties中的变量名称相同,这个变量就有值了。
float4 _Color; // 同上 struct v2f // 结构体的定义是为了 vert 到 frag 的过度
{
float4 pos : POSITION;
float4 uv : TEXCOORD;
float4 col :COLOR;
};
v2f vert(appdata_base v) // appdata_base 来自于UnityCG.cginc
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); // 坐标空间的转换
o.uv = v.texcoord;
o.col.xyz = v.normal*0.5+0.5; // 法线的取值范围是-1到1 所以先乘0.5让范围到-0.5到0.5 ,在加上0.5,就符合颜色的取值范围了。
o.col.w = 1.0;
return o;
}
half4 frag(v2f i) :COLOR
{
half4 h = i.col; // 赋值颜色
return h;
}
ENDCG // 结束CG代码
}

写的很简要,不过对于对shader有一小点了解的读者来说可以理解了。

以下是完整源码:

Shader "Custom/myshader"{
Properties
{
_Color("Base Color",color)=(,,,)
_MainTex("Base(RGB)",2D) = "white"{}
}
Subshader
{
Tags{"Queue" = "transparent" "RenderType" = "transparent" "IgoreProjector" = "true" }
Blend SrcAlpha oneMinusSrcAlpha
pass
{
Cull off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" sampler2D _MainTex;
float4 _Color; struct v2f
{
float4 pos : POSITION;
float4 uv : TEXCOORD;
float4 col :COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
o.col.xyz = v.normal*0.5+0.5;
o.col.w = 1.0;
return o;
}
half4 frag(v2f i) :COLOR
{
half4 h = i.col;
return h;
}
ENDCG
}
}
}

Unity3D Shader 入门之简单案例的实现(通过法线实现颜色变化)的更多相关文章

  1. 转 猫都能学会的Unity3D Shader入门指南(二)

    猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...

  2. Unity3D Shader入门指南(二)

    关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...

  3. 猫都能学会的Unity3D Shader入门指南(二)

    关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...

  4. Unity3D Shader入门指南(一)

    动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解.虽然说Unity引擎设计的初衷就是创建简单的不需要开发者操心 ...

  5. (转载)猫都能学会的Unity3D Shader入门指南(一)

    原文地址 http://onevcat.com/2013/07/shader-tutorial-1/ 动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚 ...

  6. 猫都能学会的Unity3D Shader入门指南(一)

    动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解.虽然说Unity引擎设计的初衷就是创建简单的不需要开发者操心 ...

  7. Unity3D Shader 入门

    什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这 ...

  8. Spring Boot【快速入门】简单案例

    Spring Boot[快速入门]   Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point ...

  9. 猫都能学会的Unity3D Shader入门指南

    https://onevcat.com/2013/07/shader-tutorial-1/ https://onevcat.com/2013/08/shader-tutorial-2/

随机推荐

  1. tp5使用外部类的三种方法

    在tp5中使用外部类的时候有三种方法 第一种就是通过composer下载,通过这种方式下载的外部类能够支持自动加载,我们只要在使用的时候use一下命名空间就可以使用了 比如:我们的tp5第四季项目要使 ...

  2. java代码导出数据到Excel、js导出数据到Excel(三)

     jsp内容忽略,仅写个出发按钮:          <button style="width: 100px" onclick="expertExcel()&quo ...

  3. nrf52810学习笔记——二

    nrf52810为nordic支持蓝牙 5.0性价比最高的一款芯片,不过这个芯片的rom不得不吐槽下,只有192KB,不知道为什么定了个192,而不是大家所熟悉的256KB,估计价格是个原因吧,15. ...

  4. (转)减少oracle sql回表次数 提高SQL查询性能

    要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块. 我们大家都 ...

  5. gpg: signing failed: secret key not available

    1 使用png签名tag时报错“ jb@39:~/11$ git tag -s gpg -m "gpg"gpg: directory `/home/jb/.gnupg' creat ...

  6. 制作iso文件

     genisoimage -o fusionstor-yi-2017-03-08.iso(镜像名称) -v -cache-inodes -joliet-long -R -J -T -V ZS  -c  ...

  7. 针对NM_CUSTOMDRAW消息的学习

    消息的形式:1 窗口消息,2 命令消息,3 WM_NOTIFY消息,4 自定义消息 我们的NM_CUSTOMDRAW消息就是就属于第三种WM_NOTIFY消息,而添加消息映射的方法分为两种: BEGI ...

  8. #2 create and populate a database && realistic and practical applications

    The Chapter3 & Chapter4 of this book tells you how to create a realistic app on the web through ...

  9. python基础学习笔记——单继承

    1.为什么要有类的继承性?(继承性的好处)继承性的好处:①减少了代码的冗余,提供了代码的复用性②提高了程序的扩展性 ③(类与类之间产生了联系)为多态的使用提供了前提2.类继承性的格式:单继承和多继承# ...

  10. org.hibernate.AnnotationException: No identifier specified for entity: com.example1.demo1.Entity.User错误

    最近在公司带人,他们问我的问题在这里也顺便总结下. 此项目为SpringDataJpa项目. 出现的错误如下: Caused by: org.hibernate.AnnotationException ...