当前位置:网站首页>Unity shader learning (3) try to draw a circle
Unity shader learning (3) try to draw a circle
2022-07-04 14:06:00 【ToDoNothing】
On the first code
Shader "Unlit/shader4"
{
Properties
{
}
SubShader
{
Tags {
"RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f{
float4 vertex:SV_POSITION;
float4 position:TEXCOORD1;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v){
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);
o.position=v.vertex;
o.uv=v.texcoord;
return o;
}
float circle(float2 uv,float2 center){
float2 offset=uv-center;
float len=length(offset);
return step(len,0.2)-step(len,0.19);
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col=circle(i.uv,float2(0.5,0.5));
return col;
}
ENDCG
}
}
}
Here's an explanation
According to the second tutorial , We are Pass Two processing flows are defined in the block , Respectively vertex and fragment, Execute first vertex Vertex shader , Processing vertex information , Proceed again fragment Chip shader , Deal with color, illumination and other information . So we define a structure at the top , Information used to define a vertex :
struct v2f{
float4 vertex:SV_POSITION;
float4 position:TEXCOORD1;
float2 uv:TEXCOORD0;
};
You can see , The defined structure contains two Texcoord, Texture information , Only two groups are read here . In addition to that SV_POSITION Is the position of the vertex , except SV_POSITION, There is another parameter called POSITION, There is not much difference between the two , As follows :
POSITION: Used to store , Model in local coordinates , In model space (objcet space) The coordinates of the vertices of , Coordinates before converting to clipping space coordinates ,unity Tell our model vertex coordinates , Not converted . Can be used as vertex shader (vertex shader) The input of 、 Output ; Chip shader (frag) The input of .
SV_POSITION: Used to store , The model is in the clipping space , Location information in projection space , That is, the fixed-point coordinates of the model space , Convert to the coordinates of the clipping space , Can be used as vertex shader (vertex shader) Output ; Chip shader (frag) The input of .
Next is the processing of vertex shaders , namely vert function , Corresponding to the above #pragma vertex Name , As shown below , Input appdata_base For defined built-in variables , Never mind , The whole function returns a structure , Internal variables have been re assigned .
Such as o.vertex, Through the built-in conversion function UnityObjectToClipPos, Model space , Convert to cutting space . About model space 、 The concept of cutting space , Reference resources Render several basic coordinate spaces in the pipeline ( Object space 、 World space 、 Camera space ( Observe the space )、NDC Space 、 Cutting space 、 Screen space )
v2f vert(appdata_base v){
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);
o.position=v.vertex;
o.uv=v.texcoord;
return o;
}
When it's done , Handle the slice shader
fixed4 frag (v2f i) : SV_Target
{
fixed4 col=circle(i.uv,float2(0.5,0.5));
return col;
}
The slice shader just runs a function , Color the current point , So let's look at this function
float circle(float2 uv,float2 center){
float2 offset=uv-center;
float len=length(offset);
return step(len,0.2)-step(len,0.19);
}
circle Function has parameters and return values , Input two coordinate information , One is the coordinates of the vertex , One is the center point of the circle , First , Calculate the distance between the vertex coordinate and the center point coordinate , Reuse step Function to process .
step The logic of the function is as follows :
step (a, b)
{
if (a > b)
{
return 0;
}
else
{
return 1;
}
}
therefore , Its principle is to judge the distance between the current point and the central point , Whether it is within the appropriate range , If in , return 1, Indicates that colors can be filled , Here I use two step function , Make him form a circle , In this range , Just display the color , As shown in the figure below . Two Step Subtracting the , You can judge whether it is within this range .
The specific effect is as follows :
If you want to change the color , Radius and center , The code is as follows
Shader "Unlit/shader4"
{
Properties
{
_Radius("Radius",Float)=0.1
_Center("Center",Vector)=(0.5,0.5,0,0)
_LineColor("LineColor",Color)=(1,1,1,1)
}
SubShader
{
Tags {
"RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f{
float4 vertex:SV_POSITION;
float4 position:TEXCOORD1;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v){
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);
o.position=v.vertex;
o.uv=v.texcoord;
return o;
}
float _Radius;
float4 _Center;
fixed4 _LineColor;
float circle(float2 uv,float2 center){
float2 offset=uv-center;
float len=length(offset);
return step(len,_Radius+0.01)-step(len,_Radius);
}
fixed4 frag (v2f i) : SV_Target
{
float2 center=float2(_Center.x,_Center.y);
fixed4 col=circle(i.uv,center)*_LineColor;
return col;
}
ENDCG
}
}
}
The effect is as follows 

边栏推荐
- Byte interview algorithm question
- 奇妙秘境 码蹄集
- JVM memory layout detailed, illustrated, well written!
- 392. 判断子序列
- 忠诚协议是否具有法律效力
- Deming Lee listed on Shenzhen Stock Exchange: the market value is 3.1 billion, which is the husband and wife of Li Hu and Tian Hua
- gorm 之数据插入(转)
- Getting started with the go language is simple: go implements the Caesar password
- Interviewer: what is the internal implementation of hash data type in redis?
- 華昊中天沖刺科創板:年虧2.8億擬募資15億 貝達藥業是股東
猜你喜欢

Huahao Zhongtian sprint Technology Innovation Board: perte annuelle de 280 millions de RMB, projet de collecte de fonds de 1,5 milliard de Beida Pharmaceutical est actionnaire

392. 判断子序列

markdown 语法之字体标红

392. Judgement subsequence

Interview disassembly: how to check the soaring usage of CPU after the system goes online?

源码编译安装MySQL

One of the solutions for unity not recognizing riders
![[antd step pit] antd form cooperates with input Form The height occupied by item is incorrect](/img/96/379d1692f9d3c05a7af2e938cbc5d7.png)
[antd step pit] antd form cooperates with input Form The height occupied by item is incorrect

德明利深交所上市:市值31亿 为李虎与田华夫妻档

Redis - how to install redis and configuration (how to quickly install redis on ubuntu18.04 and centos7.6 Linux systems)
随机推荐
go vendor 项目迁移到 mod 项目
Distributed base theory
One of the solutions for unity not recognizing riders
FS4059C是5V输入升压充电12.6V1.2A给三节锂电池充电芯片 输入小电流不会拉死,温度60°建议1000-1100MA
动画与过渡效果
. Net delay queue
C language dormitory management query software
Go 语言入门很简单:Go 实现凯撒密码
【Matlab】conv、filter、conv2、filter2和imfilter卷积函数总结
基于YOLOv1的口罩佩戴检测
Haobo medical sprint technology innovation board: annual revenue of 260million Yonggang and Shen Zhiqun are the actual controllers
C语言集合运算
golang fmt.printf()(转)
markdown 语法之字体标红
吃透Chisel语言.05.Chisel基础(二)——组合电路与运算符
Huahao Zhongtian sprint Technology Innovation Board: perte annuelle de 280 millions de RMB, projet de collecte de fonds de 1,5 milliard de Beida Pharmaceutical est actionnaire
锐成芯微冲刺科创板:年营收3.67亿拟募资13亿 大唐电信是股东
学习项目是自己找的,成长机会是自己创造的
CVPR 2022 | 大幅减少零样本学习所需的人工标注,提出富含视觉信息的类别语义嵌入(源代码下载)...
MongoDB常用28条查询语句(转)