Version: 2023.2

GL

class in UnityEngine

切换到手册

描述

低级别图形库。

Use this class to manipulate active transformation matrices, issue rendering commands similar to OpenGL's immediate mode and do other low-level graphics tasks. Note that in almost all cases using Graphics.RenderMesh or CommandBuffer is more efficient than using immediate mode drawing.

GL 即时绘制功能会立即使用任何“当前材质”设置(请参阅 Material.SetPass)。 材质控制渲染方式(混合、纹理等),因此除非您在 使用 GL 绘制功能前显式将其设置为其他设置,否则此材质可能变成任何材质。 此外,如果您从内部 GL 绘制代码中调用其他任何绘制命令,它们可将 材质设置为其他材质,以便确保其也受到控制。

GL 绘制命令立即执行。这意味着如果您在 Update() 中调用它们,它们将在渲染 摄像机前加以执行(并且该摄像机很可能会清除屏幕,从而使 GL 绘制 不可见)。

调用 GL 绘制的常见位置最经常是在 OnPostRender() 中从附加到摄像机的脚本调用, 或者在图像效果函数 (OnRenderImage) 内调用。

_Note:_ The High Definition Render Pipeline (HDRP) and the Universal Render Pipeline (URP) do not support OnPostRender. Instead, use endCameraRendering or 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获取或设置 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将标识加载到当前的模型和视图矩阵中。
LoadOrthoHelper 函数,用于设置正交投影。
LoadPixelMatrix设置一个用于像素校正渲染的矩阵。
LoadProjectionMatrix将任意矩阵加载到当前投影矩阵。
MultiTexCoord对实际纹理 unit 设置当前纹理坐标 (v.x,v.y,v.z)。
MultiTexCoord2为实际纹理 unit 设置当前纹理坐标 (x,y)。
MultiTexCoord3对实际纹理 unit 设置当前纹理坐标 (x,y,z)。
MultMatrix将当前模型矩阵设置为指定的矩阵。
PopMatrix从矩阵堆栈顶部恢复模型、视图和投影矩阵。
PushMatrix将模型、视图和投影矩阵保存到矩阵堆栈顶部。
RenderTargetBarrier解析渲染目标,以便用于从该目标进行采样的后续运算。
TexCoord为所有纹理单位均设置当前纹理坐标 (v.x,v.y,v.z)。
TexCoord2为所有纹理单位均设置当前纹理坐标 (x,y)。
TexCoord3为所有纹理单位均设置当前纹理坐标 (x,y,z)。
Vertex提交一个顶点。
Vertex3提交一个顶点。
Viewport设置渲染视口。