Unity3D研究 GL详解
程序员文章站
2022-05-24 23:50:46
...
Unity内置了GL类 封装了OpenGL,可以通过GL类来实现一些简单的画图操作,
根据Unity官方API来研究一下。
将官方GL的实例代码考到Unity执行后是这个效果
代码中有这样一个回调是属于屏幕渲染的,需要在API里了解一下
public void OnRenderObject()
Unity的生命周期执行顺序中,屏幕渲染会在GameLogic后会执行
其中有几个屏幕渲染回调API来了解一下
官方的GL示例代码 我翻译了一下便于大家理解
其中需要注意的是:
GL.Push 和 GL.Pop 之间写GL代码
GL.Begin 和 GL.End 之间写画线逻辑Begin和End 之间的两个Vector3表示起点和终点
//划线的数量
private int lineCount = 100;
//每条线的长度
private float radius = 3.0f;
//划线使用的材质球
static Material lineMaterial;
/// <summary>
/// 创建一个材质球
/// </summary>
static void CreateLineMaterial()
{
//如果材质球不存在
if (!lineMaterial)
{
//用代码的方式实例一个材质球
Shader shader = Shader.Find("Hidden/Internal-Colored");
lineMaterial = new Material(shader);
lineMaterial.hideFlags = HideFlags.HideAndDontSave;
//设置参数
lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
//设置参数
lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
//设置参数
lineMaterial.SetInt("_ZWrite", 0);
}
}
/// <summary>
/// 使用GL画线的回调
/// </summary>
public void OnRenderObject()
{
//创建材质球
CreateLineMaterial();
//**第一个着色器通过(在本例中,我们知道它是唯一的通过)
lineMaterial.SetPass(0);
//渲染入栈 在Push——Pop之间写GL代码
GL.PushMatrix();
//矩阵相乘,将物体坐标转化为世界坐标
GL.MultMatrix(transform.localToWorldMatrix);
// 开始画线 在Begin——End之间写画线方式
//GL.LINES 画线
GL.Begin(GL.LINES);
for (int i = 0; i < lineCount; ++i)
{
float a = i / (float)lineCount;
float angle = a * Mathf.PI * 2;
// 设置颜色
GL.Color(new Color(a, 1 - a, 0, 0.8F));
//画线起始点
GL.Vertex3(0, 0, 0);
// 划线重点
GL.Vertex3(Mathf.Cos(angle) * radius, Mathf.Sin(angle) * radius, 0);
}
GL.End();
//渲染出栈
GL.PopMatrix();
}
将官方API简单注释一下, 大部分是用不到的,常用的有
Begin,Clear,Color,End,LoadOrtho,Vertex3
Static Functions
Begin | 开始绘制 |
Clear | 清空当前缓存区域 |
ClearWithSkybox | 清空当前缓存区域和摄像机天空盒 |
Color | 设置当前顶点颜色 |
End | 结束绘制 在Begin 和 End 执行一次绘制 |
Flush | 在驱动程序的命令缓冲区中向GPU发送排队的命令。 |
GetGPUProjectionMatrix | 从摄像机的投影矩阵计算出GPU的投影矩阵. |
InvalidateState | 使内部缓存呈现状态无效 |
IssuePluginEvent | Send a user-defined event to a native code plugin. |
LoadIdentity | 将当前矩阵加载到Modelview矩阵 |
LoadOrtho | 转换为正交投影变换 |
LoadPixelMatrix | 设置为视图坐标系变换 |
LoadProjectionMatrix | 转换为透视投影变换 |
MultiTexCoord | 将当前纹理坐标设置为实际纹理单元 |
MultiTexCoord2 | 将当前纹理坐标设置为实际纹理单元 |
MultiTexCoord3 | 将当前纹理坐标设置为实际纹理单元 |
MultMatrix | 将当前矩阵与指定矩阵相乘 |
PopMatrix | GL出栈 在Pop 和 Push 中写GL代码 |
PushMatrix | GL入栈 |
RenderTargetBarrier | Resolves the render target for subsequent operations sampling from it. |
TexCoord | 将所有纹理坐标设置为当前纹理单元 |
TexCoord2 | 将所有纹理坐标设置为当前纹理单元 |
TexCoord3 | 将所有纹理坐标设置为当前纹理单元 |
Vertex | 提交一个顶点 |
Vertex3 | 提交一个顶点 |
Viewport | Set the rendering viewport. |
上一篇: C++includes函数详解
下一篇: 在vscode中运行Python