学习日记10
shader入门
研究了shader一段时间
UnityShader 基本 结构
渲染流水线:
顶点数据
顶点着色器
曲面细分着色器
几何着色器
裁剪
三角形设置
三角形遍历
片元着色器
屏幕映射
Shader "这里写Shader的名字"
{
Properties // 这里公布的属性将会被置于unity主面板上
{
// 变量声明采用下划线开头首字母大写
_Color("这是一个颜色", Color) = (1,1,1,1) // 颜色分量
_Diffuse("这是一个漫反射系数", Color) = (1,1,1,1) // diffuse = _LightPos0.rgb(内置的第一个重要光源的颜色) *
// _Diffuse * max(0, dot(worldNormal, worldLightDir)) (兰伯特模型漫反射 将点积结果从 -1~1 * 0.5 + 0.5 成为半兰伯特模型)
_Specular("这是一个镜面反射系数", Color) = (1,1,1,1) // specular = pow(max(0, dot(viewDir, reflect_lightDir)), _Gloss) phong模型 // specular = pow(max(0, dot(normal, halfDir)), _Gloss) 布林冯模型,采用半程向量
_Gloss("镜面反射的控制系数", Range(8.0, 256)) = 20
_MainTex("这是一个主纹理贴图", 2D) = “white”{} // 纹理贴图
_Bump("凹凸贴图,实现高度纹理", 2D) = “normal”{} // 需要转换到切线空间进行法线贴图映射
_BumpScale("法线贴图的控制", Float) = 4
_CubeMap("立方体纹理,可实现金属度效果,镜面反射效果等,是一个3d纹理", Cube) = “”{}
}
SubShader // 可有多个subshader 由显卡选择渲染
{
Tags // 标志声明
{
"LightMode" = "ForwardBase" // 前向渲染 ForwarAdd Base逐片元渲染,最多四个,其他逐顶点或球谐函数
// 延迟渲染 顶点lit渲染
"IgnorePorject" = "True" // 不受投影和阴影影响
"RenderType" = "Transparent" // 透明 Oqueup 不透明
"Queue" = "Alpha" // 渲染队列,透明,不透明物体等
}
ZWrite Off 深度测试
Blend ScrAlpha OneMinuScrAlpha // 混合因子
Pass // 通道 渲染流水线着色器部分
{
Tags{}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UntiyCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
float4 _MainTex;
float4 _MainTex_ST; // 变量声明
struct a2v{
// 语义化
float4 vertex : POSITION; // 位置
float3 normal : NORMAL; // 法线
float3 tangle : TRANGLE; // 切线
float4 texcoord : TEXCOORD0 // 纹理
};
struct v2f{
float pos:SV_POSITION;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
// UnityObjectToClipPos MVP矩阵 Model View Projection
// unity_ObjectToWorld
// _WorldSpaceToWorldNormal
// _LightColor
return o;
}
fixed4 frag(v2f i):SV_Target
{
//
diffuse;
specular;
ambient;
return fixed4((diffuse + ambient + specular) *,1.0)
}
ENDCG
}
}
Fallback "VertexLit" // 在其他都渲染不了的渲染这个
}