Unity3D 运用GL屏幕画图(阴阳师画符)

运用GL屏幕画图基本效果

Unity3D 运用GL屏幕画图(阴阳师画符)_第1张图片

阴阳师火了之后,市面上很多游戏又多了一个模块——画符抽卡,可以通过使用Unity自带GL类来实现这个功能,上面一篇博客Unity研究 GL中有关于GL类的初步解析。今天直接来分析需求 看看阴阳师画符抽卡是怎么实现的:

1,绘图——鼠标按下进行拖拽,在屏幕中留下鼠标轨迹。
2,存图——松开鼠标,绘制的图片按比例映射到Texture上。

Unity的GL是通过两点之间连线来构成图像的。

1,通过一个集合List allPoints存储鼠标在屏幕上经过的轨迹(视图坐标系)

if (Input.GetMouseButton(0))
        {
            Vector3 tmpView = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            allPoints.Add(tmpView);
        }

2,遍历集合,将集合中具有前后关系的点连接起来(点动成线)

/// 
    /// 使用GL画线的回调
    /// 
    public void OnRenderObject()
    {
        //创建材质球
        CreateLineMaterial();
        //激活第一个着色器通过(在本例中,我们知道它是唯一的通过)
        lineMaterial.SetPass(0);
        //设置正交投影
        GL.LoadOrtho();
        // 开始画线  在Begin——End之间写画线方式
        GL.Begin(GL.LINES);
        GL.Color(Color.red);
        for (int i = 1; i < allPoints.Count; i++)
        {
            Vector3 tmpFront = allPoints[i - 1];
            Vector3 tmpBack = allPoints[i];
            GL.Vertex(tmpFront);
            GL.Vertex(tmpBack);
        }
        GL.End();
        //渲染出栈
    }
3,按照比例映射到图片上
  public void Texture()
    {
        //像素根据比例映射图片
        paintText = new Texture2D(300, 400);
        for (int i = 1; i < allPoints.Count; i++)
        {
            Vector3 tmpFront = allPoints[i-1];
            Vector3 tmpBack = allPoints[i];

            float frontX = paintText.width * tmpFront.x;
            float frontY = paintText.height * tmpFront.y;

            float backX = paintText.width * tmpBack.x;
            float backY = paintText.height * tmpBack.y;
            //两点之间的缝隙用插值连起来
            for (int j = 0; j < 100; j++)
            {
                int tmpX =(int)Mathf.Lerp(frontX, backX, j / 100.0f);
                int tmpY =(int)Mathf.Lerp(frontY, backY, j / 100.0f);
                paintText.SetPixel(tmpX, tmpY, Color.red);
            }

            //paintText.SetPixel(xx, yy, Color.red);
        }
        paintText.Apply();
}

你可能感兴趣的:(Unity3D 运用GL屏幕画图(阴阳师画符))