Text 与 TextMeshPro
Text
Text基于位图的渲染技术
原理
Text会根据所给定的字符串生成相关的图集,然后对图集进行采样就可以渲染出文字了。文本字形是作为独立的面片(quad)进行渲染的,每个字符都是一个面片。
OnPopulateMesh(会在Rebuild时调用)
根据组件的配置生成一个 TextGenerationSettings ,用来生成后面的信息。
调用 TextGenerator.PopulateWithErrors 生成 Mesh 的顶点、顶点颜色、UV和三角形信息。
计算偏移量(例如左对齐需要紧靠左边),最后遍历 TextGenerator 的顶点数组,将它们的位置除以 pixelsPerUnit(每单元像素)并加上偏移量(如果有的话),得到的结果填到 VertexHelper(可以拿到顶点信息)。
字符图集
被加载的每个不同的Font对象都会维护自己的纹理集。在Unity的实现中,这些字体在运行时根据Text组件中出现的字符构建一个字形图集(glyph atlas)。
动态字体为每种不同的结合(尺寸、样式、字符)在其纹理集中维护了一个字形。也就是说,如果一个UI中有两个T ...
Unity Texture
Unity Texture 基础纹理
纹理 Texture 用于覆盖在 3D 物体上, 其本质是一张图片, 用于替代物体上渲染的颜色。
它可以用来添加物体的细节,我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。
为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分,这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样,之后在图形的其它片段上进行片段插值(Fragment Interpolation)。
纹理坐标在x和y轴上,范围为0到1之间(注意我们现在使用的是2D纹理图像),使用纹理坐标获取纹理颜色叫做采样(Sampling),纹理坐标起始于(0, 0),也就是纹理图片的左下角,结束于(1, 1),即纹理图片的右上角。
下图是把纹理坐标映射到三角形上
网格 Mesh只能表示 3D 模型的形状
材质 Material只能进行 3D 模型的纯色渲染
纹理 Texture 可以进行 3D 模型的图片渲染
纹理贴图是在建模软件中制作完成的, 是 ...
继 Unity Shader
继 Unity ShaderLambert (兰伯特)光照模型
基础准备
1234567891011121314151617181920212223242526272829303132333435363738// Unity自带结构体(要引用#include "UnityCG.cginc")struct appdata_base { float4 vertex : POSITION; //顶点坐标 float3 normal : NORMAL; //法线 float4 texcoord : TEXCOORD0; //第一纹理坐标 UNITY_VERTEX_INPUT_INSTANCE_ID //ID信息};struct appdata_tan{ float4 vertex : POSITION; //顶点坐标 float4 tangent : TANGENT; //切线 float3 normal : NORMAL; ...
Unity Shader
Unity Shader 基础渲染管线在 Unity 中,可以选择不同的渲染管线。渲染管线执行一系列操作来获取场景的内容,并将这些内容显示在屏幕上。概括来说,这些操作如下:
剔除
渲染
后期处理
不同的渲染管线具有不同的功能和性能特征,并且适用于不同的游戏、应用程序和平台。将项目从一个渲染管线切换到另一个渲染管线可能很困难,因为不同的渲染管线使用不同的着色器输出,并且可能没有相同的特性。因此,必须要了解 Unity 提供的不同渲染管线,以便可以在开发早期为项目做出正确决定。
选择要使用的渲染管线Unity 提供以下渲染管线:
内置渲染管线是 Unity 的默认渲染管线。这是通用的渲染管线,其自定义选项有限。
通用渲染管线 (URP) 是一种可快速轻松自定义的可编程渲染管线,允许您在各种平台上创建优化的图形。
高清渲染管线 (HDRP) 是一种可编程渲染管线,可让您在高端平台上创建出色的高保真图形。
可以使用 Unity 的可编程渲染管线 API 来创建自定义的可编程渲染管线 (SRP)。这个过程可以从头开始,也可以修改 URP 或 HDRP 来适应具体需求。
详情可参考 渲染管 ...
继 渲染管线
渲染管线中各个阶段的可控性
阶段名
具体步骤
可控程度
由谁控制
应用阶段
完全可控
应用程序编程
几何阶段
顶点着色
完全可控
Vertex Shader
几何着色
完全可控
Geometry Shader
投影
完全可控
Vertex Shader 中编程
视锥体裁剪
不可控
硬件中的 ViewPort Transform 组件负责
屏幕映射
不可控
硬件中的 ViewPort Transform 组件负责
背面剔除
可配置
Shader 中的选项,cull back
光栅化
三角形设置
不可控
硬件中的 Raster Engine 组件负责
三角形遍历
不可控
硬件中的 Raster Engine 组件负责
逐像素阶段
顶点属性插值
不可控
硬件中的 Attribute Setup 组件负责
Early Z-Test(深度测试)
不可控
硬件中的 Raster Engine 组件负责
片元着色
完全可控
Fragment Shader
混合
可配置
Shader中的选项,blend命令等
渲染管线
渲染管线
渲染的三个阶段一般分为:应用阶段、几何阶段和光栅化阶段, 如下图
三个阶段的操作对象的流程图可参考下图
应用阶段
这一阶段由CPU处理,主要任务是为接下来GPU的渲染操作提供所需要的几何信息,即输出渲染图元(rending primitives)以供后续阶段的使用。渲染图元就是由若干个顶点构成的几何形状,点,线,三角形,多边形面都可以是一个图元
数据的准备
第一步应先将不需要的数据剔除出去,如以包围盒为单位的视锥体(粗粒度)剔除,遮挡剔除,层级剔除等等
第二步根据UI对象在Herachy面板深度值的顺序(DFS深度优先搜索)设置渲染的顺序,其余物体大体可以按照离摄像机先近后远的规则为后续循环绘制所有对象制定排队顺序
第三步先将所有需要的渲染数据从硬盘读取到主存中,再把GPU渲染需要用到的数据打包发给显存(GPU一般没有对主存的访问权限,且与显存进行交换速度较快)
打包的数据详情见下图
设置渲染状态
渲染状态包括着色器(Shader),纹理,材质,灯光等等。
设置渲染状态实质上就是,告诉GPU该使用哪个Shader,纹理,材质等去渲染模型网格体,这个过程也就是S ...