#region OpenTK

OpenTKがGitHubで更新されるようになりました。NuGetから手に入れることができるようになりました。
現在は.NET Coreに対応する機運があるようです。

VBOとテクスチャ

テクスチャの座標も効率よく指定

いままで、テクスチャの指定はポリゴンを描画するときに毎回していました。以前、VBOを使ったポリゴンの描画を紹介しましたが、そこに処理を追加することで、テクスチャ座標情報も格納することができます。

今回はモデルの頂点データを構造体として、格納します。

通常は、何らかのモデルファイルを読み込んで、それをOpenGLで使えるように整える場合が多いですが、今回はすべてコードで書いています。

今回は下のテクスチャを貼っていきます。

Texture

テクスチャ座標も効率よく

TextureVBO
角が少し丸いサイコロを描画

ソースコードは、サイコロのデータを指定している部分以外は、単純なものです。

まずは、このプログラムで使う頂点のクラスを示します。

	struct Vertex
	{
		public Vector3 position;
		public Vector3 normal;
		public Vector2 uv;

		public Vertex(Vector3 position, Vector3 normal, Vector2 uv)
		{
			this.position = position;
			this.normal = normal;
			this.uv = uv;
		}

		public static readonly int Size = Marshal.SizeOf(default(Vertex));
	}

1つの頂点データにつき、場所、法線、テクスチャ座標のデータを格納します。

			//VAOを1コ作成し、設定
			GL.GenVertexArrays(1, out vao);
			GL.BindVertexArray(vao);

			//各Arrayを有効化
			GL.EnableClientState(ArrayCap.VertexArray);
			GL.EnableClientState(ArrayCap.NormalArray);
			GL.EnableClientState(ArrayCap.TextureCoordArray);

			GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);

			//頂点の位置、法線、テクスチャ情報の場所を指定
			GL.VertexPointer(3, VertexPointerType.Float, Vertex.Size, 0);
			GL.NormalPointer(NormalPointerType.Float, Vertex.Size, Vector3.SizeInBytes);
			GL.TexCoordPointer(2, TexCoordPointerType.Float, Vertex.Size, Vector3.SizeInBytes * 2);

			GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
			GL.BindVertexArray(0);

ここでは、GL.EnableClientStateとGL.????Pointerの設定項目が増えています。

			GL.BindTexture(TextureTarget.Texture2D, texture);

			//サイコロを描画
			GL.BindVertexArray(vao);
			GL.BindBuffer(BufferTarget.ElementArrayBuffer, ibo);
			GL.DrawElements(BeginMode.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0);
			GL.BindVertexArray(0);

テクスチャの指定は、テクスチャ座標をVBOで指定していても、いつも通りGL.BindTextureで行います。

記事

外部リンク

Thanks