低级别图形库。
使用此类可操纵活动变换矩阵,
发出类似于 OpenGL 即时模式的渲染命令,以及执行其他低级别
图形任务。注意,在几乎所有情况下,使用 Graphics.DrawMesh 或 CommandBuffer
比使用即时模式绘制更加高效。
GL 即时绘制功能会立即使用任何“当前材质”设置(请参阅 Material.SetPass)。
材质控制渲染方式(混合、纹理等),因此除非您在
使用 GL 绘制功能前显式将其设置为其他设置,否则此材质可能变成任何材质。
此外,如果您从内部 GL 绘制代码中调用其他任何绘制命令,它们可将
材质设置为其他材质,以便确保其也受到控制。
GL 绘制命令立即执行。这意味着如果您在 Update() 中调用它们,它们将在渲染
摄像机前加以执行(并且该摄像机很可能会清除屏幕,从而使 GL 绘制
不可见)。
调用 GL 绘制的常见位置最经常是在 OnPostRender() 中从附加到摄像机的脚本调用,
或者在图像效果函数 (OnRenderImage) 内调用。
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 | 将标识矩阵加载到当前 modelview 矩阵。 |
LoadOrtho | Helper 函数,用于设置正交透视变换。 |
LoadPixelMatrix | 设置一个用于像素校正渲染的矩阵。 |
LoadProjectionMatrix | 将任意矩阵加载到当前投影矩阵。 |
MultiTexCoord | 对实际纹理 unit 设置当前纹理坐标 (v.x,v.y,v.z)。 |
MultiTexCoord2 | 为实际纹理 unit 设置当前纹理坐标 (x,y)。 |
MultiTexCoord3 | 对实际纹理 unit 设置当前纹理坐标 (x,y,z)。 |
MultMatrix | 将当前 modelview 矩阵与指定的矩阵相乘。 |
PopMatrix | 从矩阵堆栈顶部恢复投影和 modelview 矩阵。 |
PushMatrix | 将投影和 modelview 矩阵保存到矩阵堆栈。 |
RenderTargetBarrier | 解析渲染目标,以便用于从该目标进行采样的后续运算。 |
TexCoord | 为所有纹理单位均设置当前纹理坐标 (v.x,v.y,v.z)。 |
TexCoord2 | 为所有纹理单位均设置当前纹理坐标 (x,y)。 |
TexCoord3 | 为所有纹理单位均设置当前纹理坐标 (x,y,z)。 |
Vertex | 提交一个顶点。 |
Vertex3 | 提交一个顶点。 |
Viewport | 设置渲染视口。 |