#region OpenTK

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

ボリュームテクスチャ

テクスチャの3次元版

いままで使ってきたテクスチャは、写真や絵のような、2次元のデータでした。

今回扱うのは、3次元のテクスチャ(ボリュームテクスチャ)です。無理して現実世界に当てはめるとすれば、細かく賽の目状にした物体の破片の色になるのでしょうか。

2次元のテクスチャと比べると大量の画素データが必要になるので、注意が必要です。上手く使えば、その欠点以上の効果が得られるでしょう。2次元データなどから生成するという手法もあるようです。

画素のデータ量は膨大

VolumeTexture
きれいな四面体を2つ

ソースコードは、2Dだった部分が3Dに変わっています。

まず引数の比較のために、今まで使ってきたTexImage2Dを確認します。

			//Texture3Dの許可
			GL.Enable(EnableCap.Texture3DExt);

			//テクスチャ用バッファの生成
			texture = GL.GenTexture();

			//テクスチャ用バッファのひもづけ
			GL.BindTexture(TextureTarget.Texture3D, texture);

			//テクスチャの設定
			GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge);
			GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
			GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
			GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
			GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);

			//テクスチャの色情報を作成
			int size = 8;
			float[,] colors = new float[size * size * size, 4];
			for (int i = 0; i < size; i++)
			{
				for (int j = 0; j < size; j++)
				{
					for (int k = 0; k < size; k++)
					{
						int index = size * size * i + size * j + k;
						colors[index, 0] = (float)i / size;
						colors[index, 1] = (float)j / size;
						colors[index, 2] = (float)k / size;
						colors[index, 3] = 1.0f;
					}
				}
			}

			//テクスチャ用バッファに色情報を流し込む
			GL.TexImage3D(TextureTarget.Texture3D, 0, PixelInternalFormat.Rgba, size, size, size, 0, OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.Float, colors);

いままでTexture2Dのような2Dという名前がついた関数やenum値は、Texture3Dのような3Dという名前がついた関数やenum値に変わります。

注意すべき点は、データの次元が増えたので、設定すべき項目が増えたものがあることです。例えば、143行目にあるTextureWrapTや、166行目にsizeを3回(幅/高さ/奥行)指定しているTexImage3Dなどです。

			GL.TexCoord3(1, 0, 0);
			GL.Vertex3(1, -1, -1);
			GL.TexCoord3(0, 1, 0);
			GL.Vertex3(-1, 1, -1);
			GL.TexCoord3(0, 0, 1);
			GL.Vertex3(-1, -1, 1);

2DのテクスチャではTexCoord2を使っていましたが、ここではTexCoord3を使います。引数の数は3つになります。

さまざまな角度から。すべて1つの同じボリュームテクスチャで描画されています。

VolumeTexture1VolumeTexture2VolumeTexture3VolumeTexture4

記事

外部リンク

Thanks