Legacy Documentation: Version 2017.1 (Go to current version)
LanguageEnglish
  • C#
  • JS

Script language

Select your preferred scripting language. All code snippets will be displayed in this language.

GL

class in UnityEngine

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Description

Low-level graphics library.

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.DrawMesh or CommandBuffer is more efficient than using immediate mode drawing.

GL immediate drawing functions use whatever is the "current material" set up right now (see Material.SetPass). The material controls how the rendering is done (blending, textures, etc.), so unless you explicitly set it to something before using GL draw functions, the material can happen to be anything. Also, if you call any other drawing commands from inside GL drawing code, they can set material to something else, so make sure it's under control as well.

GL drawing commands execute immediately. That means if you call them in Update(), they will be executed before the camera is rendered (and the camera will most likely clear the screen, making the GL drawing not visible).

The usual place to call GL drawing is most often in OnPostRender() from a script attached to a camera, or inside an image effect function (OnRenderImage).

#pragma strict
public var lineCount: int = 100;
public var radius: float = 3.0f;
static var lineMaterial: Material;
static function CreateLineMaterial() {
	if (!lineMaterial) {
		// simple colored things.
		var shader: Shader = Shader.Find("Hidden/Internal-Colored");
		lineMaterial = new Material(shader);
		lineMaterial.hideFlags = HideFlags.HideAndDontSave;
		// Turn on alpha blending
		lineMaterial.SetInt("_SrcBlend", intUnityEngine.Rendering.BlendMode.SrcAlpha);
		lineMaterial.SetInt("_DstBlend", intUnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
		// Turn backface culling off
		lineMaterial.SetInt("_Cull", intUnityEngine.Rendering.CullMode.Off);
		// Turn off depth writes
		lineMaterial.SetInt("_ZWrite", 0);
	}
}
// Will be called after all regular rendering is done
public function OnRenderObject() {
	CreateLineMaterial();
	// Apply the line material
	lineMaterial.SetPass(0);
	GL.PushMatrix();
	// match our transform
	GL.MultMatrix(transform.localToWorldMatrix);
	// Draw lines
	GL.Begin(GL.LINES);
	for (var i: int = 0; i < lineCount; ++i) {
		var a: float = i / floatlineCount;
		var angle: float = 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;

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(); } }

Note: This class is almost always used when you need to draw a couple of lines or triangles, and don't want to deal with meshes. If you want to avoid surprises the usage pattern is this:

#pragma strict
function OnPostRender() {
	// Set your materials
	GL.PushMatrix();
	// Draw your stuff
	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(); } }

Where at the "// Draw your stuff" you should do SetPass() on some material previously declared, which will be used for drawing. If you dont call SetPass, then you'll get basically a random material (whatever was used before) which is not good. So do it.

Static Variables

invertCullingSelect whether to invert the backface culling (true) or not (false).
LINE_STRIPMode for Begin: draw line strip.
LINESMode for Begin: draw lines.
modelviewThe current modelview matrix.
QUADSMode for Begin: draw quads.
sRGBWriteControls whether Linear-to-sRGB color conversion is performed while rendering.
TRIANGLE_STRIPMode for Begin: draw triangle strip.
TRIANGLESMode for Begin: draw triangles.
wireframeShould rendering be done in wireframe?

Static Functions

BeginBegin drawing 3D primitives.
ClearClear the current render buffer.
ClearWithSkyboxClear the current render buffer with camera's skybox.
ColorSets current vertex color.
EndEnd drawing 3D primitives.
FlushSends queued-up commands in the driver's command buffer to the GPU.
GetGPUProjectionMatrixCompute GPU projection matrix from camera's projection matrix.
InvalidateStateInvalidate the internally cached render state.
IssuePluginEventSend a user-defined event to a native code plugin.
LoadIdentityLoad the identity matrix to the current modelview matrix.
LoadOrthoHelper function to set up an ortho perspective transform.
LoadPixelMatrixSetup a matrix for pixel-correct rendering.
LoadProjectionMatrixLoad an arbitrary matrix to the current projection matrix.
MultiTexCoordSets current texture coordinate (v.x,v.y,v.z) to the actual texture unit.
MultiTexCoord2Sets current texture coordinate (x,y) for the actual texture unit.
MultiTexCoord3Sets current texture coordinate (x,y,z) to the actual texture unit.
MultMatrixMultiplies the current modelview matrix with the one specified.
PopMatrixRestores both projection and modelview matrices off the top of the matrix stack.
PushMatrixSaves both projection and modelview matrices to the matrix stack.
RenderTargetBarrierResolves the render target for subsequent operations sampling from it.
TexCoordSets current texture coordinate (v.x,v.y,v.z) for all texture units.
TexCoord2Sets current texture coordinate (x,y) for all texture units.
TexCoord3Sets current texture coordinate (x,y,z) for all texture units.
VertexSubmit a vertex.
Vertex3Submit a vertex.
ViewportSet the rendering viewport.

Did you find this page useful? Please give it a rating: