当前位置:网站首页>Unity shader (learn more about vertex fragment shaders)
Unity shader (learn more about vertex fragment shaders)
2022-07-07 09:25:00 【heater404】
Unity Shader( Learn more about vertex fragment shaders )
What is a rendering pipeline
It can be roughly divided into the following three stages :
Application stage (Application Stage):
It's our raw material preparation stage , Including our model 、 Mapping 、 Camera and light source, etc , After this stage, all materials will be converted into rendering elements and submitted to the next stage . This stage usually consists of CPU Responsible for implementation .
Geometric stage (Geometry Stage):
It mainly processes the data transmitted in the previous stage on the vertex , Including various matrix transformations and vertex coloring , After the final processing, the two-dimensional vertex coordinates of screen space will be output 、 Vertex shading and other information , And then submit to the next stage . This stage is usually in GPU On .
Grating stage (Rasterizer Stage):
This stage mainly determines which pixels in each rendering primitive should be drawn on the screen , It requires the vertex by vertex data obtained in the previous stage ( For example, texture coordinates 、 Vertex color, etc ) Interpolation , Then pixel by pixel processing . This stage is also in GPU Up operation .
Structure
As shown in the figure above, the code , We put the vertex position information of the model in the application stage (float4 vertex : POSITION) Transmission to the geometric stage , Then use in vertex shaders UnityObjectToClipPos Matrix transformation transforms the vertex coordinates of the model from local to homogeneous clipping coordinates , And output the converted coordinates (SV_POSITION) To rasterization stage , Finally, in the rasterized slice shader, we return a color value to all pixels (_Color).
But when we think about it carefully, we will find some limitations , What if I want to pass multiple values in the application phase ? Besides vertex position, I also want to transfer vertex color 、uv What about coordinates and other information ? At the same time, now only vertex coordinates are output from the vertex shader in the geometric stage (SV_POSITION), What if I also want to pass other values to the slice shader ? It's time for the structure to come out .
Shader "Unlit/NewUnlitShader"
{
Properties
{
_Color("I am Color", Color) = (1,1,1,1)// In turn RGBA(0-1)
}
SubShader
{
pass
{
CGPROGRAM
//#pragma yes Unity Commands for built-in compilation instructions , stay Pass In, we use this command to declare the required vertex shaders and fragment shaders .
#pragma vertex vert
// Define vertex shaders , Usually it will be named vert.
#pragma fragment frag
// Define fragment shaders , Usually it will be named frag
// Structure of application stage
struct appdata
{
float4 vertex:POSITION;
};
// The vertex shader is passed to the structure of the slice shader
struct v2f
{
float4 pos:SV_POSITION;
};
fixed4 _Color;
// Vertex shaders in the geometry phase
v2f vert(appdata v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
return o;
}
// Fragment shaders in the rasterization phase
float4 frag():SV_TARGET0
{
return _Color;
}
ENDCG
}
}
FallBack "DIFFUSE"
}
Although compared with the previous version, it shows a lot more code , But this is more flexible and convenient .
Now we have some new ideas , Define multiple variables in the structure , For example, incoming vertices uv coordinate , Then we draw a checkerboard according to this information .
Shader "Unlit/NewUnlitShader"
{
Properties
{
_Size("the checker's size",int) = 10// Don't end with a semicolon
}
SubShader
{
pass
{
CGPROGRAM
//#pragma yes Unity Commands for built-in compilation instructions , stay Pass In, we use this command to declare the required vertex shaders and fragment shaders .
#pragma vertex vert
// Define vertex shaders , Usually it will be named vert.
#pragma fragment frag
// Define fragment shaders , Usually it will be named frag
int _Size;
// Structure of application stage
struct appdata
{
float4 vertex:POSITION;
float2 uv:TEXCOORD;
};
// The vertex shader is passed to the structure of the slice shader
struct v2f
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD;
};
// Vertex shaders in the geometry phase
v2f vert(appdata v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.uv=v.uv;
return o;
}
float4 checker(float2 uv)
{
uv=floor(uv * _Size)/2;
return frac(uv.x+uv.y)*2;// This function is built-in to find the decimal part
}
// Fragment shaders in the rasterization phase
float4 frag(v2f i):SV_TARGET0
{
return checker(i.uv);
}
ENDCG
}
}
FallBack "DIFFUSE"
}
UnityShader Built in functions
In fact, that is Cg Built in functions in the library , Official address: :Cg Standard Library Documentation (nvidia.cn), You can check the details when using .
Data passed into vertex shaders during the application phase
When the data in the application phase is transmitted , How can vertex shaders know who is the vertex data of the model and who is the discovery data of the model ? So we need a way to tell the computer what the variables we define represent .
struct appdata
{
float4 vertex : POSITION;
};
Here we declare a float4 Variable of type vertex, And gave him the semantics of vertex data ( Add a colon after the variable and a semantic ), in other words vertex Variables will represent the vertex data of the model, which is used and transferred by us . So what are the semantics ? as follows :
struct appdata
{
float4 vertex : POSITION; // The vertices
float4 tangent : TANGENT; // Tangent line
float3 normal : NORMAL; // normal
float4 texcoord : TEXCOORD0; //UV1
float4 texcoord1 : TEXCOORD1; //UV2
float4 texcoord2 : TEXCOORD2; //UV3
float4 texcoord3 : TEXCOORD3; //UV4
fixed4 color : COLOR; // Vertex color
};
Vertex shader to fragment shader data
The vertex shader processes the data passed from the application stage , You will need to output and pass in fragment shaders , At this time, we also need to define a structure to carry the data , alike , The value output to the fragment shader also needs semantics to identify .
struct v2f
{
float4 pos:SV_POSITION;
};
It is stated here float4 Variable of type pos, And designated as SV_POSITION semantics , Express pos It is the vertex position under the screen clipping space output by the vertex shader . This statement is necessary , otherwise GPU The following rasterization processing cannot be performed .
边栏推荐
- Huawei hcip datacom core_ 03day
- JVM 内存结构 详细学习笔记(一)
- Upgrade Alibaba cloud RDS (relational database service) instance to com mysql. jdbc. exceptions. Troubleshooting of jdbc4.communicationsexception
- Huawei HCIP - datacom - Core 03 jours
- Netease Cloud Wechat applet
- Integer or int? How to select data types for entity classes in ORM
- Information Security Experiment 2: using x-scanner scanning tool
- MySql数据库-事务-学习笔记
- Colorbar of using vertexehelper to customize controls (II)
- 消费互联网的产业链其实是很短的,它仅仅承接平台上下游的对接和撮合的角色
猜你喜欢
How to use Arthas to view class variable values
Pytest installation (command line installation)
[istio introduction, architecture, components]
Do you have any certificates with high gold content?
STM32的时钟系统
[SVN] what is SVN? How do you use it?
Kubernetes cluster capacity expansion to add node nodes
Postman setting environment variables
Register address name mapping
Common short chain design methods
随机推荐
浏览器中如何让视频倍速播放
JVM garbage collection detailed learning notes (II)
C language pointer (exercises)
Postman interface debugging method
Network request process
How can I apply for a PMP certificate?
JWT certification used in DRF
What is MD5
The configuration and options of save actions are explained in detail, and you won't be confused after reading it
Nested (multi-level) childrn routes, query parameters, named routes, replace attribute, props configuration of routes, params parameters of routes
SAP MM STO单据的外向交货单创建后新加ITEM?
[chaosblade: node disk filling, killing the specified process on the node, suspending the specified process on the node]
華為HCIP-DATACOM-Core_03day
Entity of cesium data visualization (Part 1)
Original collection of hardware bear (updated on May 2022)
Data association between two interfaces of postman
Locust performance test 5 (analysis)
Yapi test plug-in -- cross request
(3/8)枚举的不当用法 之 方法参数(二)
Regular matching starts with XXX and ends with XXX