欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity3D研究 GL详解

程序员文章站 2022-05-24 23:50:46
...

Unity内置了GL类  封装了OpenGL,可以通过GL类来实现一些简单的画图操作,

根据Unity官方API来研究一下。

将官方GL的实例代码考到Unity执行后是这个效果

Unity3D研究 GL详解

代码中有这样一个回调是属于屏幕渲染的,需要在API里了解一下
 public void OnRenderObject()

Unity的生命周期执行顺序中,屏幕渲染会在GameLogic后会执行
其中有几个屏幕渲染回调API来了解一下

Unity3D研究 GL详解

Unity3D研究 GL详解

官方的GL示例代码 我翻译了一下便于大家理解

其中需要注意的是:

GL.Push  和  GL.Pop  之间写GL代码

GL.Begin 和 GL.End  之间写画线逻辑Begin和End 之间的两个Vector3表示起点和终点

Unity3D研究 GL详解

  //划线的数量
    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.
相关标签: Unity 屏幕划线