版本: Unity 6 (6000.0)
语言English
  • C#

GL

UnityEngine 中的类

/

实现于:UnityEngine.CoreModule

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实阅读了用户提出的每一项更改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

低级图形库。

使用此类操作活动变换矩阵,发出类似于 OpenGL 即时模式的渲染命令,并执行其他低级图形任务。请注意,在几乎所有情况下,使用 Graphics.RenderMeshCommandBuffer 比使用即时模式绘制更高效。

GL 即时绘制函数使用当前设置的“当前材质”(请参阅 Material.SetPass)。材质控制渲染方式(混合、纹理等),因此,除非您在使用 GL 绘制函数之前显式将其设置为某个值,否则材质可能为任何值。此外,如果您从 GL 绘制代码内部调用任何其他绘制命令,它们可能会将材质设置为其他值,因此请确保也对其进行控制。

GL 绘制命令会立即执行。这意味着如果您在 Update() 中调用它们,它们将在渲染相机之前执行(并且相机很可能会清除屏幕,导致 GL 绘制不可见)。

调用 GL 绘制的常用位置通常是在附加到相机的脚本中的 OnPostRender() 中,或在图像效果函数 (OnRenderImage) 内部。

注意: 高保真渲染管线 (HDRP) 和通用渲染管线 (URP) 不支持 OnPostRender。请改用 RenderPipelineManager.endCameraRenderingRenderPipelineManager.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_STRIPBegin 的模式:绘制线段带。
LINESBegin 的模式:绘制线条。
modelview获取或设置模型视图矩阵。
QUADSBegin 的模式:绘制四边形。
sRGBWrite控制渲染时是否执行线性到 sRGB 颜色转换。
TRIANGLE_STRIPBegin 的模式:绘制三角形带。
TRIANGLESBegin 的模式:绘制三角形。
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设置渲染视口。