みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

UnityでOpenGL

UnityでOpenGLを使う

Unityで幾何学的な図形を書きたい時に便利そうなので、自分用にGLクラスについてまとめました。http://unity3d.com/support/documentation/ScriptReference/GL.htmlの翻訳とみーのコメントです。翻訳は専門用語は英語のままの意訳です。

GL

ローレベルな描写ライブラリです。

行列変換を行ったり、OpenGLのimmediate modeと類似の命令を使ってレンダリングをしたり、その他ローレベルな描写をするのには、このクラスを用います。ほとんどの場合、Graphics.DrawMeshを用いた方がimmediate modeの描写をするよりも効率的であることに注意してください。

OpenGLのimmediate modeの描写命令は、命令が実行される時に設定されている"current material"を使用します。設定されたmaterialをもとに、blendingやtextureなどのレンダリングが行われます。したがって、GL描写命令を使う前にmaterialを明示的に設定する必要があります。また、GLの描写のコードの中で別の描写命令を呼び出すと、materialは別の物に変更されることがあります。したがって、materialの設定が常に正しくされるようにする必要があります。

GL描写命令はすぐに実行されます。したがって、Update()関数で呼び出すと、カメラのレンダリングの前に描写が行われるので、GLの描写が見えなくなります。

通常、GL描写命令はカメラにあるスクリプトのOnPostRender()の中に記述します。

注意:このクラスは、メッシュを扱うことなくいくつかの線や三角形を描く必要があるときに用いられます。思った通りに描写するために、以下のパターンを用います。

import UnityEngine #Boo
class example(MonoBehaviour):
    public mat as Material
    def OnPostRender() :
        // materialを設定
        GL.PushMatrix();
        // yourMaterial.SetPass( );
        // 描写を行う
        GL.PopMatrix();

「//描写を行う」の部分で、SetPass()を始めに宣言してください。このmaterialを用いて、描写が行われます。SetPassを呼び出さないと、ランダムなmaterialが指定されるので、思った通りに描写されません。

このクラスはUnity Proのみで使用できます。(みーはUnity Proのライセンスは持っていませんが、GLクラスを使えています。この記述はおそらく誤りだと思われます。)

以上がリファレンスの訳です。とりあえず、以下のようなスクリプトを書いて、Cameraに追加して、実行すればいいということですね。

import UnityEngine 
class myGL(MonoBehaviour): 
    public mat as Material 
    def OnPostRender(): 
        if not mat: 
            Debug.LogError("Please Assign a material on the inspector") 
            return 
        GL.PushMatrix() 
        mat.SetPass(0) 
        GL.LoadOrtho() 
        GL.Begin(GL.LINES) 
        GL.Color(Color.red) 
        GL.Vertex3(1, 0, 0) 
        GL.Vertex3(0, 1, 0) 
        GL.Color(Color.yellow) 
        GL.Vertex3(0, 0, 0) 
        GL.Vertex3(1, 1, 0) 
        GL.End() 
        GL.PopMatrix()

PushMatrix()したらPopMatrix()。Begin()したらEnd()する。というOpenGLの基本を知っていたら、簡単ですね。これをカメラに追加して実行すると、色が反映されません。GL.Colorに書いてあるのですが、In order for per-vertex colors to work reliably across different hardware, you have to use a shader that binds in the color channel. See BindChannels documentation.ということで、自分でshaderを作成する必要があります。幸い、http://unifycommunity.com/wiki/index.php?title=VertexColorUnlit#DescriptionにVertexColorUnlit2.shaderというのがありまして、これをshaderに設定すれば色が反映されるようになります。

このプロジェクト及びweb playerを以下にアップしているので、参考にしてみてください。

たまに、うまく描画できないことがあるかと思いますが、その際は以下のことを確認しましょう。

以下のプログラムで、三角形が表示されない。

        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.red);
        GL.Vertex3(0,0.5,0);
        GL.Vertex3(1,0.5,0);
        GL.Vertex3(0.5,0,0);

GL.End()し忘れている。

以下のプログラムで、三角形が表示されない。

        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.red);
        GL.Vertex3(0,0.5,0);
        GL.Vertex3(1,0.5,0);
        GL.Vertex3(0.5,0,0);
        GL.End()

3頂点の順番の回転が逆向き。3つめの頂点を(0.5,1,0)にする、など、順番の回転を修正する。

(2012.12.30 追加)

(2012/10/2 修正) 

(2012/04/06)