Shader学习笔记 (一) :利用shader在一个面绘制出圆
在各种游戏中,想必大家一定和我一样总是惊叹于游戏画面的各种炫酷的特效。
作为游戏开发中单独列出的一个职业TA(Technology Art),他们会利用GLSL或者HLSL等着色器语言绘制出一幅幅美丽的画面。
于是作为小白,从零开始学习ShaderLab,记录一下学习历程。
ShaderLab从入门到放弃过很多次,总是想搞清楚一个shader完整的语法结构和每一行声明的意义。
事实上,作为小白,如果不想总是碰壁然后放弃,也许先从修改开始比较合适。
1.创建第一个Shader
我们在Unity 工程文件中新建一个Unlit Shader文件,默认的Shader文件是一个具备基本功能的shader。
2.做出一些修改。比如说绘制一个自定义颜色的圆
首先应该公开定义一个颜色变量,所有在着色器列表属性中公开的属性都应该遵循①在Properties中定义 ②在Pass中声明
比如在这里我们声明一个颜色Color1
//着色器属性列表,定义了着色器材质上可以自定义的属性
Properties
{
//主纹理
_MainTex ("Texture", 2D) = "white" {}
_Color1("Color1",Color)=(1,1,1,1)
}
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color1;
其次绘制圆,要定下来圆心,比如把圆心放在面的中心点。
那么我需要知道每个像素点的坐标,我们可以在传递给片元着色器的数据结构中加入一个自定义的字段worldPos,就是每个像素点的坐标
//定义了传递给片元着色器的数据结构,包括纹理坐标、雾效坐标、裁剪空间位置和世界空间位置。
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 worldPos :TEXCOORD1;
};
其次在顶点着色器函数中增加一段逻辑,将输入的顶点数据转化为屏幕坐标,并传递给片元着色器
//顶点着色器函数的定义,将输入顶点数据转换为屏幕空间坐标,并传递给片元着色器。
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
// o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = mul(unity_ObjectToWorld, v.vertex).xyz;;
o.worldPos=v.vertex;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
最后我们调整片元着色器函数的逻辑,接受顶点着色器传递的数据,并计算最终像素颜色
//片元着色器函数的定义,接收顶点着色器传递的数据,并计算最终的像素颜色。
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv); //定义一个变量存储:当前像素点距离中心点的位置
float dist=distance(i.worldPos,float3(0,0,0));
//如果像素点距离中心点大于0.3小于0.32,将自定义的颜色赋值在这区间的像素内;
//否则丢弃当前像素点
if(dist>0.3&&dist<0.32){
col*=_Color1;
}
else{
discard;
}
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
附上最后的效果:

以及完整的Shader代码
Shader "Unlit/DrawCircle123"
//定义了着色器的名称为 “Unlit/DrawCircle”,表示这是一个不受光照影响的着色器。
{ //着色器属性列表,定义了着色器材质上可以自定义的属性
Properties
{
//主纹理
_MainTex ("Texture", 2D) = "white" {}
_Color1("Color1",Color)=(1,1,1,1)
}
SubShader
{
//指定了渲染类型为不透明物体。
Tags { "RenderType"="Opaque" } //指定了细节层级为 100
LOD 100 //在 SubShader 中定义了一个 Pass。 Pass
{
//在 Pass 中,通过 CGPROGRAM 和 ENDCG 标记将着色器代码包裹起来,表示代码块开始和结束。
CGPROGRAM
//定义了顶点着色器函数的入口
#pragma vertex vert //定义了片元着色器函数的入口
#pragma fragment frag // 启用雾效
#pragma multi_compile_fog #include "UnityCG.cginc" //定义了输入顶点数据的数据结构,包括顶点坐标和纹理坐标。
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; //定义了传递给片元着色器的数据结构,包括纹理坐标、雾效坐标、裁剪空间位置和世界空间位置。
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 worldPos :TEXCOORD1;
}; sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color1;
//顶点着色器函数的定义,将输入顶点数据转换为屏幕空间坐标,并传递给片元着色器。
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
// o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = mul(unity_ObjectToWorld, v.vertex).xyz;;
o.worldPos=v.vertex;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
//片元着色器函数的定义,接收顶点着色器传递的数据,并计算最终的像素颜色。
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv); //定义一个变量存储:当前像素点距离中心点的位置
float dist=distance(i.worldPos,float3(0,0,0.5));
//如果像素点距离中心点大于0.3小于0.32,将自定义的颜色赋值在这区间的像素内;
//否则丢弃当前像素点
if(dist>0.3&&dist<0.32){
col*=_Color1;
}
else{
discard;
}
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
Shader学习笔记 (一) :利用shader在一个面绘制出圆的更多相关文章
- Shader学习笔记
Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效. ...
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果) 浮雕效果主要有两个参数:Amount和Wid ...
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来 ...
- 学习笔记:利用GDI+生成简单的验证码图片
学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...
- 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据
机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...
- Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目
Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目 Spring Tool Suite 是一个带有全套的Spring相关支持功能的Eclipse插件包. ...
- Unity Shader学习笔记-1
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- Unity3D Shader 学习笔记(一):初识Shader
第一节:图形处理器简史 GPU发展简史 GPU英文全称Graphic Procssing Unit. T&L变换和光照流水线 可编程GPU GPU的优点和缺点 第二节:Unity Shader ...
随机推荐
- Redis设计
目录 过期键删除策略 持久化 RDB AOF AOF重写 主从复制 完整重同步和部分重同步 哨兵Sentinel 哨兵对redis服务器集群的监听 执行者选举 故障转移 选择新的主服务器流程 过期键删 ...
- PE结构总览
pe文件经历了从16位系统到32位系统的过度.因此32系统下的每一个PE文件都可以在16位系统下运行. 16位系统下的PE结构 在16位系统下,PE结构可以大致分为两个部分:DOS头和一些其他数据 # ...
- Linux 文件系统的设计
一 硬盘的最小存储单元是扇区,扇区大小为512B 文件系统将硬盘划分为固定大小的块(block),最常见的块大小为4KB 块是文件系统读写硬盘的最小单位 二 文件系统设计面临的基本问题: 用户怎么找到 ...
- P1941 [NOIP2014 提高组] 飞扬的小鸟 题解
我们先不管障碍物. 设 \(f[i][j]\) 表示来到点 \((i,j)\) 的最少点击屏幕数. 因为每秒要不上升 \(k\times x[i]\),要么下降 \(y[i]\). 所以有: \[f[ ...
- [go笔记]websocket入门
简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都 ...
- Winform跨线程访问UI
在开发winfrom应用时,经常遇到异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"xxxx"的线程访问它.出 ...
- quarkus数据库篇之三:单应用同时操作多个数据库
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 一个应用同时连接多个数据库进行操作,这是常见 ...
- 魔术方法__getitem__
Python中的魔术方法_getitem_ python中有许多的魔术方法,下文主要对_getitem_()进行介绍.__ 在python中_getitem_(self, key):方法被称为魔法方法 ...
- 《Kali渗透基础》11. 无线渗透(一)
@ 目录 1:无线技术 2:IEEE 802.11 标准 2.1:无线网络分层 2.2:IEEE 2.3:日常使用标准 2.3.1:802.11 2.3.2:802.11b 2.3.3:802.11a ...
- 《Kali渗透基础》05. 主动信息收集(二)
@ 目录 1:端口扫描 2:UDP 扫描 2.1:Scapy 2.2:nmap 3:半开放扫描 3.1:Scapy 3.2:nmap 3.3:hping3 4:全连接扫描 4.1:Scapy 4.2: ...