OpenTKOpenTKがGitHubで更新されるようになりました。NuGetから手に入れることができるようになりました。Coreに対応する機運があるようです。光源いろいろ-Lighting[2]ライトもいろいろ以前のLighting[1]では平行光源を使いましたが、今回は点光源とスポットライトを使います。「場所」情報が光の向きだったのに対し、点光源の「場所」情報は光を発する場所です。点光源には減衰率を設定することができ、OpenGLの固定機能ではモデル表面のある点での光の強さは1a+b⁢x+c⁢x2(x:光源からの距離)で計算されます。この定数abcの値を各自が設定できるようになっています。スポットライトスポットライトは点光源を発展させたものです。スポットライトには点光源の設定に加え、光を発する向きの情報、光の角度、光の強さの分布を設定します。クラスを定義してコードをきれいに光源を追加させるだけでは面白くないので、モデルを1つ扱うクラスを定義して、VBOやVAOなどを意識せず描画するというようなことをやってみます。今回はモデルとクラスが1対1になっていますが、ちょっとコード弄るだけで、同じモデルが簡単に追加できます。それらはある基底クラスから派生させているので、すべてのモデルクラスを配列に格納してfor文ですべてを動かすなんてこともできると思います多分。スポットライトは...点光源スポットライトソースコードは、クラス関係の処理が多くなってしまいましたが、本処理はすっきりしたと思います。このプログラムはデフォルトでは点光源でライティングしますが、Lキーを押している間はスポットライトでのライティングになります。isPointLight;光源のパラメータで共通のものはまとめました。torus、sphere、plateは、実際にはModelクラスの派生クラスが入ります。それぞれトーラス、球、地面を扱います。//ウィンドウの起動時に実行される。ColorMaterialParameter.Diffuse);torus.CreateBuffers();sphere.CreateBuffers();plate.CreateBuffers();}なんということでしょう。クラスを利用したことにより、あんなに長くて見にくかったコードが、モデルにつき1行になってしまいました。処理をクラスに含めることで、見やすくなる、メンテナンスが楽という利点があります。//ウィンドウの終了時に実行される。e){base.OnUnload(e);torus.DeleteBuffers();sphere.DeleteBuffers();plate.DeleteBuffers();GL.DisableClientState(ArrayCap.VertexArray);//VertexArrayを無効化GL.DisableClientState(ArrayCap.NormalArray);//NormalArrayを無効化GL.DisableClientState(ArrayCap.ColorArray);//ColorArrayを無効化}こちらはもともと単純だったので、少しの効果しかありません。light1Exponent);}スポットライトのパラメータがやけに多くなっています。ここで光源のパラメータをまとめてみます。Position位置(または方向)Ambient環境光成分Diffuse拡散光Specular鏡面光ConstantAttenuation距離によらない減衰LinearAttenuation距離に比例する減衰QuadraticAttenuation距離の2乗に比例する減衰SpotDirectionスポットライトの方向SpotCutoffスポットライトの発光する角度SpotExponentスポットライトの強さの分布パラメータによって、きれいに見えたり変に見えたりするので注意が必要です。Vector3.UnitY);sphere.Draw();GL.PopMatrix();plate.Draw();Modelの派生クラスはDrawメソッドで、名前の通り描画します。ここでもスッキリしています。*/}クラスの中はごちゃごちゃしていますが、うまくカプセル化できていると思います。派生クラスでInitializeメソッドをオーバーライドさせることで、それぞれ違うモデルを扱わせることができます。MasuqaT.NET。