本文共 2384 字,大约阅读时间需要 7 分钟。
Shader 是干什么的?
它的作用可以先简单理解为对屏幕上的物体,进行颜色处理。
而大家都知道,所有计算机,处理颜色的当然是显卡,也就是 GPU 。
所以我们写 Shader 的目的就是告诉 GPU ,我需要对物体的颜色,纹理,等方面,怎样处理,达到我们想要的效果。
UnityCG.cginc中一些常用的函数
//摄像机方向(视角方向)float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向//光源方向float3 WorldSpaceLightDir(float4 v) 模型空间中的顶点坐标==》世界空间中从这个点到光源的方向float3 UnityWorldSpaceLightDir(float4 v) 世界空间中的顶点坐标==》世界空间中从这个点到光源的方向float3 ObjSpaceLightDir(float4 v) 模型空间中的顶点坐标==》模型空间中从这个点到光源的方向//方向转换float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=》模型空间
什么是OpenGL、DirectX
shader可以认为是一种渲染命令 ,由opengl 或者dx进行解析,来控制渲染丰富多彩的图形OpenGL 使用GLSL 编写shader
DirectX 使用HSSL 编写shader 英伟达 CG 编写shader(跨平台)Unity Shader的分类
使用的是ShaderLab编写Unity中的Shader 1,表面着色器 Surface Shader 2,顶点/片元着色器 Vertex/Fragment Shader 3,固定函数着色器 Fixed Function ShaderUnityshader中属性的类型有哪些
_Color(“Color”,Color)=(1,1,1,1) _Vector(“Vector”,Vector)=(1,2,3,4) _Int(“Int”,Int)= 34234 _Float(“Float”,Float) = 4.5 _Range(“Range”,Range(1,11))=6 _2D(“Texture”,2D) = “red”{} _Cube(“Cube”,Cube) = “white”{} _3D(“Texure”,3D) = “black”{}从应用程序传递到顶点函数的语义有哪些a2v
POSITION 顶点坐标(模型空间下的) NORMAL 法线( 模型空间下) TANGENT 切线(模型空间) TEXCOORD0 ~n 纹理坐标 COLOR 顶点颜色从顶点函数传递给片元函数的时候可以使用的语义
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用) COLOR0 可以传递一组值 4个 COLOR1 可以传递一组值 4个 TEXCOORD0~7 传递纹理坐标片元函数传递给系统
SV_Target 颜色值,显示到屏幕上的颜色什么是光照模型
光照模型就是一个公式,使用这个公式来计算在某个点的光照效果标准光照模型
在标准光照模型里面,我们把进入摄像机的光分为下面四个部分 自发光 高光反射 Blinn光照模型 Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和视野方向的夹角 Blinn-Phong光照模型 Specular=直射光 * pow( max(cosθ,0),10) θ:是法线和x的夹角 x 是平行光和视野方向的平分线 漫反射 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向 环境光Tags{ “LightMode”=”ForwardBase” }
只有定义了正确的LightMode才能得到一些Unity的内置光照变量包含unity的内置的文件,才可以使用unity内置的一些变量
normalize() 用来把一个向量,单位化(原来方向保持不变,长度变为1)
max() 用来取得函数中最大的一个 dot 用来取得两个向量的点积 _WorldSpaceLightPos0 取得平行光的位置 _LightColor0取得平行光的颜色 UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间 _World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间 UNITY_LIGHTMODEL_AMBIENT用来获取环境光半兰伯特光照模型
Diffuse = 直射光颜色 *( cosθ *0.5 +0.5 ) 兰伯特光照模型 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向shader中的各种空间坐标
什么是切线空间pixel = (normal+1)/2
normal = pixel*2 - 1
转载地址:http://abjhl.baihongyu.com/