2012年4月21日土曜日

Unity GL (2) 四角形の描画

TestGL2.cs

using UnityEngine;
 
public class TestGL2 : MonoBehaviour {
    Vector3[]       m_VtxArray;                 // 頂点の配列
    Vector2[]       m_UvArray;                  // UVの配列
    Vector2         m_uvOffset = Vector2.zero;  // UVのオフセット

    public Material m_Mtl;                      // 使用するマテリアル

    public void Start () {
        // 頂点とUVの作成
        m_VtxArray = new Vector3[4];
        m_UvArray = new Vector2[4];

        // 時計回りだと描画される?
        m_VtxArray[0] = new Vector3(0.25f, 0.25f, 0.0f); // BottomLeft
        m_VtxArray[1] = new Vector3(0.25f, 0.95f, 0.0f); // TopLeft
        m_VtxArray[2] = new Vector3(0.75f, 0.75f, 0.0f); // TopRight
        m_VtxArray[3] = new Vector3(0.75f, 0.25f, 0.0f); // BottomRight

        m_UvArray[0] = new Vector2(0.0f, 0.0f);
        m_UvArray[1] = new Vector2(0.0f, 1.0f);
        m_UvArray[2] = new Vector2(1.0f, 1.0f);
        m_UvArray[3] = new Vector2(1.0f, 0.0f);
    }

    void OnRenderObject() {
        DrawQuad();
    }

    void DrawQuad() {
        m_Mtl.SetPass(0);

        GL.PushMatrix();
        GL.LoadOrtho();         // 正射影 左下が 0, 0, 0
        //GL.LoadIdentity();
        //GL.LoadProjectionMatrix(Matrix4x4.identity);
        
        GL.Begin(GL.QUADS);
#if false
        // 反時計回り 描画されない
        for(int i = 3; i >= 0; i--) {
            GL.TexCoord(m_UvArray[i] + m_uvOffset);
            GL.Vertex(m_VtxArray[i]);
        }
#else
        // 時計回り 描画された 
        for(int i = 0; i < 4; i++) {
            GL.TexCoord(m_UvArray[i] + m_uvOffset);
            GL.Vertex(m_VtxArray[i]);
        }
#endif
        GL.End();
        GL.PopMatrix();

        m_uvOffset.x -= 0.001f;
        m_uvOffset.y -= 0.001f;
    }
}