大概总结一下吧,今天我还是在网上看了下关于unity的基础教程。因为自己本身对于3dmax 也自学了很久了,所以感觉听起来很轻松(毕竟还是些基本操作),全程开着1.5倍速观看。但是,得亏我没有觉得简单就跳过,视屏里的老师讲的还真挺好的。除了讲一些操作的原理之外,还会渗透很多重要的emm 应该说是方法吧!比如看了这几集教程,我对于诸如FPS游戏及一些2D游戏 的镜头(分屏,猪脚视野,俯瞰视野),小地图,灯光的原理有了清晰直观的认识,真是刷新了一遍。以前玩的时候没注意,原来这些游戏机制的实现在Unity中仅仅只是很简单的设定。当然对于这些机制,还是应该带着敬畏。毕竟我们也只是用着一个黑箱子,一旦深入到代码还是抓瞎。其次,在视频里,又听了一遍渲染管线的知识。由于之前已经看过书了,所以还是抱着快进的想法。但是认真听过之后,发现其实看书时的很多内容其实自己并没有真正的理解或者是记住。果然多次学习还是很有效果的。
下午的时候,我只是精读了一个shader代码。自己一个字符的敲,并且打上注释。感觉收获还是很大的,虽然前几天看了很多页,但当我认真读这个代码的过程中,自己还是得不停往前翻阅。最后关于代码的原理,还是有两个小点不是很清楚。不过今天还得写作业,就只能放到明天了。
休息的时候,翻了两本CG画册看看,也就是只能看看了。会画画还是牛逼啊!
**
Unity学习
**
摄像机还具有耳朵的功能
clear Flags:屏幕空白部分的处理 (Depth only)
solid Color:纯色
天空盒:模拟天空的材质;包装器 ;6面:procdural 1 专门有组件使用 可以作为反射源。
layer:层 culling mask:遮罩(可视化)
Perspective(透视) Orthographic(正交) Field of view(镜头距离,仅在正交模式中存在,狙?)
Clipping Plane:视野范围(太远的不渲染)(Near --Far)
Viewport Rect: 可以实现分屏操作 (x w的调整)
地图相机(小地图显示)
Depth:主摄像机 的深度大于次摄像机时,次摄像机才有效(渲染覆盖)
Ctrl Shift+f:切换至选定物体的视角
第三人称视角:创建一个空物体作为猪脚,模型 集合(model)和主相机都放在猪脚(player)附属内; 实现相机跟人跑 。
采用地图的俯瞰视角时,最好使用正交方式,避免因为透视导致过多的遮蔽。如果希望猪脚在俯瞰时能够是立体的,我们可以在猪脚的头顶放一张Plane并附上贴图(真是个好方法!)(原来如此,我贴三角形,那可不就是三角形,还会转向。。)
我们需要对层的操作灵活运用!!
地图摄像机一定不要去看地形,避免重复渲染,降低性能。在整个场景的最底下放一张Plane。俯瞰时只看图,避免渲染地形(!!)
渲染管线:(图形数据在GPU上经过运算处理,最后输出到屏幕的过程)
Draw call:(game–>stats–>Batches[批次])
每次引擎准备数据并通知GPU的过程。每帧调用显卡渲染物体的次数。
顶点处理–>图元装配–>光栅化(计算三角面内的像素点的数目 ,并为着色阶段提供合理插值???)
像素处理:着色,写缓存(帧缓存【色彩】;深度缓存Z-buffer【深度信息,距离】)
Instant Occlusion culling:即时遮挡剔除
物体在进入渲染流水线之前,将看不到的物体剔除。
cam后缀表示摄像机。
原理:发射线 biubiubiu 给物体添加Box Collider
分布密集的时候用,否则CPU性能浪费
步骤:1创建层 2为物体指定层 3添加物体碰撞组件Collider
4 添加IOCcam脚本
全局光照(GI):能计算直接光,间接光,环境光,反射光的光照系统
类型:方向光(和位置无关)
点光源(球形范围)
聚光(Spot)手电筒
多细节层次技术(LOD):
根据物体模型的节点重要性,分配渲染资源
Shader学习
标准光照模型中的漫反射光照模型
Shader “Unity Shaders Book/Chapter 6/Diffuse Vertex-Level” {
Properties {
_Diffuse (“Diffuse”, Color) = (1, 1, 1, 1) //声明反射的颜色属性
}
SubShader {
Pass {
Tags { “LightMode”=“ForwardBase” } //声明光照模式,是标准光照模型,这个关系到对入射光颜色强度的取值
CGPROGRAM
#pragma vertex vert //告诉Unity 顶点,片元着色器分别叫什么
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse; //为了在SubShader中使用Properties声明的属性,我们需要定义一个相同类型的变量
struct a2v { //顶点着色器输入结构体,存放顶点坐标及法线数据
float4 vertex : POSITION;
float3 normal : NORMAL;
};
//顶点着色器输出结构体(片元着色器输入结构体),存放裁剪空间的坐标,及顶点着色器所计算出来的颜色数据
struct v2f {
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
//顶点着色器函数
v2f vert(a2v v) {
v2f o; //定义一个输出变量
// 将顶点坐标从模型空间转换到世界空间(裁剪的空间);数据来自于顶点着色器的输入v
o.pos = UnityObjectToClipPos(v.vertex);
// 定义一个变量获得环境光的强度,颜色
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
// 将法线参数从模型空间转换到裁剪空间【??这部分的线代还不是很清楚】;
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
// 得到入射光线在世界空间中的方向
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
//计算反射的颜色【需要三个数据】光源的颜色 漫反射的颜色 顶点法线 光源的方向
//[反射光强度??]
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));
//saturate函数限定取值范围【0,1】
o.color = ambient + diffuse; //将反射光颜色和环境光叠加,得到最后结果
return o;
}
fixed4 frag(v2f i) : SV_Target { //片元着色器直接输出
return fixed4(i.color, 1.0);
}
ENDCG
}
}
FallBack "Diffuse" //回调函数
}
//一点小问题: 为什么只有反射光的颜色数据(强度?)模型空间到裁剪空间的变换细节? 对漫反射颜色参数的改变会有什么影响?