在没有接触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. JFinal 结合Dubbo发生的一些问题

    1.java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/co ...

  2. excel日期格式取年份

    具体思路:先将日期格式更改为常规格式,再取常规格式的前4位数字 例如:A1==1981/12/22 第一步B1=TEXT(A1,"emd") 第二步C1=LEFT(B1,4) 结束

  3. NOIP 2017 小凯的疑惑

    # NOIP 2017 小凯的疑惑 思路 a,b 互质 求最大不能表示出来的数k 则k与 a,b 互质 这里有一个结论:(网上有证明)不过我是打表找的规律 若 x,y(设x<y) 互质 则 : ...

  4. SQL_5_子句

    接下来讲到的子句有: WHERE STARTING WITH ORDER BY GROUP BY HAVING WHERE: 使用频率仅次于SELECT和FROM STARTING WITH: 附加于 ...

  5. poj 3107 Godfather(树的重心)

    Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7885   Accepted: 2786 Descrip ...

  6. [转] immutability-helper 插件的基本使用(附源码)

    概念 先理解一下 Immutable 的概念,Immutable数据就是一旦创建,就不能更改的数据.每当对Immutable对象进行修改的时候,就会返回一个新的Immutable对象,以此来保证数据的 ...

  7. luogu2865 [USACO06NOV]路障Roadblocks 次短路

    注意:如果是这么个写法,堆数组要开成n+m的. 为什么呢?设想一下从1到2有m条长度递减的路,这岂不是要入队m次-- #include <algorithm> #include <i ...

  8. WebApp开发入门

    web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...

  9. 在Asp.net MVC中添加一个全局的异常处理的过滤器及Log4Net的使用

    1:捕获异常新建一个异常处理的类MyExceptionAttribute捕获异常信息. //写到日志中.多个线程同时操作一个文件,造成文件的并发,这时用队列 public static Queue&l ...

  10. 筒子们,使用Protobuf优化你的协议

    Protocol buffers是google提供的一种将结构化数据进行序列化和反序列化的方法,其优点是语言中立,平台中立,可扩展性好,目前在google内部大量用于数据存储,通讯协议等方面.PB在功 ...