siki入门学习
前述
终于感觉有一丢丢入门shader了,这里总结一下
属性
简单来说,属性中的值可以在unity 的inspector面板中修改,当然是否有效就要看shader的编写了
案例
本章就通过这一个案例来阐述吧
Shader "Unlit/shader3"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
//只有在CGPROGRAM 定义一个与属性块类型名字相同的变量,properties中的才会起作用
fixed4 _Color;
struct a2v{
float4 v:POSITION;//用模型顶点填充v变量
float3 n:NORMAL;//法线是三维的,用模型的法线填充n
float4 texcoord: TEXCOORD0;//用模型的第一套UV 填充texcoord
};
struct v2f{ //顶点着色器到片元着色器
float4 pos:SV_POSITION;//裁剪空间中的位置信息
fixed3 color:COLOR0;//可以储存颜色信息
};
v2f vert(a2v av)
{
v2f frame;
frame.pos = UnityObjectToClipPos(av.v);
frame.color = av.n*0.5+fixed3(0.5,0.5,0.5);
return frame;
}
fixed4 frag(v2f i):SV_TARGET
{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c,1);
}
ENDCG
}
}
}
案例分析
- 关于属性的使用,要在代码块中定义:
fixed4 _Color;
_Color 是和属性中的命名保持一致才可以使用。
当然代码块中没有设置_Color 时,在面板调节属性颜色值是无效的
- UnityObjectToClipPos 这个是一个相对较新的使用吧
啥意思呢:
In the past, we uses mul(UNITY_MATRIX_MVP, v.vertex) to convert vertex position from local to world space. v.vertex is float4 which has w component.
But in most cases w is = 1. To make vertex shader run faster, Unity replaced it with UnityObjectToClipPos(float3 pos), which ignores w component even you pass a float4 position instead of float3.
For some advanced users who still need the w component in their custom shaders, here is a cheaper UnityObjectToClipPos() function which respects the w component!
简单来说就是把局部空间转换成世界空间
可以借鉴一下这个链接
内置矩阵
-
a2v 是一个结构体 表示的是 应用到顶点着色器
里面传递的值也可以理解为顶点着色器到片元着色器的输入 -
v2f 也是一个结构体,表示的是定点着色器到片元着色器
关于这些定义可以看一下图形学那章,对于图形学的实现有一个大概的了解
5._Color.rgb
其中的rgb 就是红绿蓝,嗯~ rab 就是红 透明度 蓝 嘻嘻
关于输入输出中的属性呢 有一个常用的调用:
关于shader model 那个先忽略
知乎上的阐述是
SM是微软提出的,要求显卡厂商提供对应的功能和指令的支持。不同的SM包含不同的指令集和shader相关规范,高版本的SM往往是低版本的超集。
SM针对是HLSL,和GLSL没有关系。