低级图形库。
使用此类操作活动变换矩阵,发出类似于 OpenGL 即时模式的渲染命令,并执行其他低级图形任务。请注意,在几乎所有情况下,使用 Graphics.RenderMesh 或 CommandBuffer 比使用即时模式绘制更高效。
GL 即时绘制函数使用当前设置的“当前材质”(请参阅 Material.SetPass)。材质控制渲染方式(混合、纹理等),因此,除非您在使用 GL 绘制函数之前显式将其设置为某个值,否则材质可能为任何值。此外,如果您从 GL 绘制代码内部调用任何其他绘制命令,它们可能会将材质设置为其他值,因此请确保也对其进行控制。
GL 绘制命令会立即执行。这意味着如果您在 Update() 中调用它们,它们将在渲染相机之前执行(并且相机很可能会清除屏幕,导致 GL 绘制不可见)。
调用 GL 绘制的常用位置通常是在附加到相机的脚本中的 OnPostRender() 中,或在图像效果函数 (OnRenderImage) 内部。
注意: 高保真渲染管线 (HDRP) 和通用渲染管线 (URP) 不支持 OnPostRender。请改用 RenderPipelineManager.endCameraRendering 或 RenderPipelineManager.endFrameRendering。
using UnityEngine;
public class ExampleClass : MonoBehaviour { // When added to an object, draws colored rays from the // transform position. public int lineCount = 100; public float radius = 3.0f;
static Material lineMaterial; static void CreateLineMaterial() { if (!lineMaterial) { // Unity has a built-in shader that is useful for drawing // simple colored things. Shader shader = Shader.Find("Hidden/Internal-Colored"); lineMaterial = new Material(shader); lineMaterial.hideFlags = HideFlags.HideAndDontSave; // Turn on alpha blending lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); // Turn backface culling off lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); // Turn off depth writes lineMaterial.SetInt("_ZWrite", 0); } }
// Will be called after all regular rendering is done public void OnRenderObject() { CreateLineMaterial(); // Apply the line material lineMaterial.SetPass(0);
GL.PushMatrix(); // Set transformation matrix for drawing to // match our transform GL.MultMatrix(transform.localToWorldMatrix);
// Draw lines GL.Begin(GL.LINES); for (int i = 0; i < lineCount; ++i) { float a = i / (float)lineCount; float angle = a * Mathf.PI * 2; // Vertex colors change from red to green GL.Color(new Color(a, 1 - a, 0, 0.8F)); // One vertex at transform position GL.Vertex3(0, 0, 0); // Another vertex at edge of circle GL.Vertex3(Mathf.Cos(angle) * radius, Mathf.Sin(angle) * radius, 0); } GL.End(); GL.PopMatrix(); } }
注意: 当您需要绘制几条线或三角形并且不想处理网格时,几乎总是会使用此类。如果您想避免意外,则使用方法模式如下所示
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { void OnPostRender() { // Set your materials GL.PushMatrix(); // yourMaterial.SetPass( ); // Draw your stuff GL.PopMatrix(); } }
在“// 绘制您的内容”处,您应该对之前声明的某个材质调用 SetPass(),该材质将用于绘制。如果您不调用 SetPass,那么您将获得基本上是随机的材质(之前使用的任何材质),这不是很好。所以请这样做。
invertCulling | 选择是否反转背面剔除 (true) 或不反转 (false)。 |
LINE_STRIP | Begin 的模式:绘制线段带。 |
LINES | Begin 的模式:绘制线条。 |
modelview | 获取或设置模型视图矩阵。 |
QUADS | Begin 的模式:绘制四边形。 |
sRGBWrite | 控制渲染时是否执行线性到 sRGB 颜色转换。 |
TRIANGLE_STRIP | Begin 的模式:绘制三角形带。 |
TRIANGLES | Begin 的模式:绘制三角形。 |
wireframe | 渲染是否应以线框模式进行? |
Begin | 开始绘制 3D 图元。 |
Clear | 清除当前渲染缓冲区。 |
ClearWithSkybox | 使用相机的视景体清除当前渲染缓冲区。 |
Color | 设置当前顶点颜色。 |
End | 结束绘制 3D 图元。 |
Flush | 将驱动程序命令缓冲区中排队的命令发送到 GPU。 |
GetGPUProjectionMatrix | 根据相机的投影矩阵计算 GPU 投影矩阵。 |
InvalidateState | 使内部缓存的渲染状态失效。 |
IssuePluginEvent | 向原生代码插件发送用户定义的事件。 |
LoadIdentity | 将单位矩阵加载到当前模型和视图矩阵中。 |
LoadOrtho | 辅助函数,用于设置正交投影。 |
LoadPixelMatrix | 设置用于像素正确渲染的矩阵。 |
LoadProjectionMatrix | 将任意矩阵加载到当前投影矩阵中。 |
MultiTexCoord | 将当前纹理坐标 (v.x,v.y,v.z) 设置到实际的纹理单元。 |
MultiTexCoord2 | 为实际的纹理单元设置当前纹理坐标 (x,y)。 |
MultiTexCoord3 | 将当前纹理坐标 (x,y,z) 设置到实际的纹理单元。 |
MultMatrix | 将当前模型矩阵设置为指定的矩阵。 |
PopMatrix | 从矩阵堆栈顶部恢复模型、视图和投影矩阵。 |
PushMatrix | 将模型、视图和投影矩阵保存到矩阵堆栈顶部。 |
RenderTargetBarrier | 解析渲染目标,以便后续操作从中采样。 |
TexCoord | 为所有纹理单元设置当前纹理坐标 (v.x,v.y,v.z)。 |
TexCoord2 | 为所有纹理单元设置当前纹理坐标 (x,y)。 |
TexCoord3 | 为所有纹理单元设置当前纹理坐标 (x,y,z)。 |
Vertex | 提交顶点。 |
Vertex3 | 提交顶点。 |
Viewport | 设置渲染视口。 |