MIL12——模拟面试题
MIL12——模拟面试题 C# List 是链表还是数组 上一题追问:当 list 满了的时候,我再加入一个元素它的效率会比较低啊,它内部大概是一个什么样的执行过程呢? C# 里面有一个常用的接口叫做 IDispose,它的作用是? 上一题追问:C# 有垃圾回收机制,把一个对象设置为空的时候,系统会帮我们回收,它和接口 IDispose 有什么关系吗?为什么会存在两个做析构事情的东西呢? Unity 中的生命周期函数,为什么设计为反射调用,而不是通过继承重写生命周期函数的形式去实现呢?(至少答出一种原因) Unity CPU 和 GPU 他们分别是什么?他们主要完成什么工作 渲染管线中的几何阶段是由 CPU 主导还是 GPU 主导?该阶段主要是在做什么? 是不是所有矩阵都有逆矩阵?如何计算一个矩阵的逆矩阵? 齐次坐标是什么?对于我们有什么作用? Shader 开发中的坐标空间变换,主要是在哪几个空间中进行变换?变换顺序是什么? 答案 C# List 是链表还是数组 数组 上一题追问:当 list...
MIL11——模拟面试题
MIL11——模拟面试题 C# 文件中保存了文本信息,但是打开后却是乱码,一般是什么原因造成的? C# 中 new 关键字的作用(至少说出3种) 同步方法和异步方法的区别是什么?异步编程是什么意思?对于我们来说,什么时候需要使用异步编程?(至少说出3种) 回调函数指什么?一般在什么时候使用?(至少说出3种使用场景) 如何用一个 int 变量,记录 32 种状态?(注意:状态可以并存) Unity 请解释 Unity 中的 Prefab 是什么,以及它在游戏开发中的作用是什么? 在 Unity 中,什么是 Shader?它有什么作用,以及如何编写一个基本的 Shader? 在 Unity 中,什么是常见的性能优化技巧?请举例说明。 在 Unity 中,什么是协程(Coroutine)?它有什么作用,以及如何使用它? 解释一下 Unity 中的渲染管线(Rendering...
US5L14——表面着色器实现动态液体
US5L14——表面着色器实现动态液体 动态液体效果 在游戏开发中,动态液体效果就是用 Shader 模拟出透明容器装透明液体的效果 这种效果常用与游戏和动画中,比如用于制作玻璃瓶装液体的效果 动态液体效果的基本原理 一句话概括它的基本原理:动态液体效果是通过透明渲染、像素剔除、波纹效果模拟来实现的。 其中的关键点为: 如何被容器装载 用两个模型,一个容器模型,一个液体模型,液体模型其实和容器模型一模一样,只是稍小一些, 让这两个模型使用不同的材质。容器使用透明材质,液体使用动态液体材质即可 如何透明渲染 在表面着色器中实现透明渲染,和顶点/片元着色器的透明度混合基本一致, 只需要通过设置渲染类型、队列、混合模式、关闭深度写入即可 123Tags { "RenderType"="Transparent" "Queue"="Transparent" } // 设置渲染类型和队列为透明Blend DstColor SrcColor ...
US5L13——表面着色器实现顶点膨胀
US5L13——表面着色器实现顶点膨胀 表面着色器中处理顶点的方法 在编译指令中:#pragma surface 表面函数名 光照模型 可选额外参数 可选额外参数中添加:vertex:自定义函数名 函数格式:void 自定义函数名(inout appdata_full v) 实现顶点膨胀效果 直接复用之前表面着色器使用发现贴图的代码,在此基础上进行修改,代码详见:US5L12——表面着色器使用法线贴图 加入顶点碰撞控制参数 12345678910Properties{ _Color("Color", Color) = (1, 1, 1, 1) _MainTex("Albedo (RGB)", 2D) = "white"{} _BumpMap("BumpMap", 2D) = ""{} _Emission("Emission", Color) = (0, 0, 0, 0) ...
US5L12——表面着色器使用法线贴图
US5L12——表面着色器使用法线贴图 在表面着色器中使用法线贴图 我们以 SurfaceOutputStandard 来举例,步骤如下: 新建表面着色器 删除无关代码 声明相关属性 123456Properties{ _Color("Color", Color) = (1, 1, 1, 1) _MainTex("Albedo (RGB)", 2D) = "white"{} _BumpMap("BumpMap", 2D) = ""{}} 检查编译指令、结构体和变量声明 12345678910111213#pragma surface surf Standard fullforwardshadows#pragma target 3.0sampler2D _MainTex;sampler2D _BumpMap;struct Input{ float2...
US5L11——表面着色器结构体
US5L11——表面着色器结构体 表面着色器结构体 表面着色器结构体主要分为两类:一是输入结构体、二是输出结构体 表面着色器函数的参数有三种固定格式: void 表面函数名(Input IN, inout SurfaceOutput o) void 表面函数名(Input IN, inout SurfaceOutputStandard o) void 表面函数名(Input IN, inout SurfaceOutputStandardSpecular o) 其中 Input 结构体,就是输入结构体,而 SurfaceOutput、SurfaceOutputStandard、SurfaceOutputStandardSpecular 结构体,就是输出结构体 表面着色器输入结构体 表面着色器函数的参数列表中,Input 结构体,就是输入结构体,它是由我们自己声明的,是数据的来源,我们需要用到这些数据进行逻辑处理 输入结构体中我们能声明哪些成员 Input...
US5L10——表面着色器编译指令
US5L10——表面着色器编译指令 本章代码关键字 123456789101112131415161718192021#pragma surface // 表面着色器的编译指令// Unity自带光照模型Standard // Unity内置的基于物理的光照模型函数StandardSpecular // Unity内置的基于物理的高光光照模型函数Lambert // 简单的非基于物理的光照模型BlinnPhong // 简单的非基于物理的高光光照模型// 可选参数vertex:顶点函数名 // 自定义顶点修改函数finalcolor:自定义最终颜色修改函数名 // 定义最终颜色修改函数addshadow //...
US5L9——表面着色器
US5L9——表面着色器 表面着色器 表面着色器(Surface Shader)是 Unity 自己创造的一种着色器代码类型, 它的本质是对顶点 / 片元着色器的一层封装,它需要的代码量很少,很多工作都帮助我们去完成了 它的优点在于,它帮助我们处理了很多光照细节,我们可以直接使用而无需自己计算实现光照细节, 它的缺点是渲染的消耗较大,可控性较低。 我们可以在创建 Shader 时,选择创建 Standard Surface Shader 通过观察该 Shader 文件的内部结构,会发现着色器相关代码被放在 SubShader 语句块中(并非 Pass )的 CGPROGRAM 和 ENDCG 之间 表面着色器的特点就是: 直接在 SubShader 语句块中书写着色器逻辑 我们不需要关心也不需要使用多个 Pass,每个 Pass 如何渲染,Unity会在内部帮助我们去处理 可以使用 CG 或 HLSL 两种 Shader 语言去编写 Shader 逻辑 代码量较少,可控性较低,性能消耗较高 适用于处理需要和各种光源打交道的着色器(主机、PC...
UD3L6——Newtonsoft.Json
UD3L6——Newtonsoft.Json Newtonsoft.Json Newtonsoft.Json,通常也被称为 Json.NET,是一个非常流行的用于处理 JSON 数据的高性能 .NET 库。 它由 James Newton-King 开发,并广泛应用于各种 .NET 应用程序中,以实现对象与 JSON 之间的序列化和反序列化。 官网:Json.NET - Newtonsoft 官方文档:Json.NET Documentation 关于 Newtonsoft.Json 进阶用法可以参考此视频:分享一些Newtonsoft.Json的实用功能与技巧_哔哩哔哩_bilibili 导入 Newtonsoft.Json Newtonsoft.Json 已经提供了针对 Unity 的定制版本,因此,将 Newtonsoft.Json 导入到 Unity 项目非常简单 直接通过 Package Manager 即可导入 Newtonsoft.Json,此版本为 IL2CPP 做了优化,因此直接使用此版本即可 使用 Newtonsoft.Json...
US5L8——帧调试器
US5L8——帧调试器 帧调试器 我们可以利用 Unity 自带的帧调试工具,看到游戏图像的某一帧是如何一步步渲染出来的 我们可以在 Window(窗口) ——> Analysis(分析) ——> Frame Debugger(帧调试) 中打开帧调试工具 帧调试器是一个非常强大的工具,特别是在渲染调试、优化和效果分析方面有着重要的意义,它可以帮助我们: 精准调试渲染问题,可以逐步查看渲染调用 有助于优化性能,通过分析渲染调用,找出性能瓶颈并优化 有助于调试材质、纹理和着色器,可以查看渲染时使用的材质、纹理和参数、快速定位问题 可视化渲染过程,可以通过查看渲染目标和中间结果,深入了解渲染过程 等等 帧调试器的使用 要使用帧调试器,我们必须要认识该窗口上各部分有什么作用,帧调试器可以分为三个部分 第一部分:工具栏 Enable/Disable:该按钮控制调试窗口释放处于启用状态,启用后我们就可以查看渲染过程 不过要注意,此工具只能看特定一帧的渲染过程,也就是说如果在程序运行时激活该工具,将自动暂停程序的运行 Editor:Editor...