#region OpenTK

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

テクスチャの置き換え

バッファを変えずにテクスチャを変える

今まで、貼るテクスチャはプログラムが終わるまで同じものでした。

もしプログラム中に変える場合、今までの関数を使って実装するなら、使ったテクスチャ用バッファを削除して、新しいバッファを生成、ひも付けするという流れになるでしょう。

しかしバッファの作成と削除は負担になります。そこで、現在使っているテクスチャ用バッファの内容を部分的に上書きするという関数があります。

また、現在の描画結果をバッファにコピーするというものもあります。

今回は左の画像をメインに、縦横のサイズが半分な右の画像を一部として上書きします。

Texture1Texture2

切り替えは効果的に

Replace
テクスチャのアニメで役立つ

ソースコード。処理を分かりやすくするため、背景色が変わるようにしています。

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

			//初期テクスチャを設定
			GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, textureWidth, textureHeight,
				0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, textureData[0]);

前から対象、ミップマップのレベル、OpenGL内フォーマットの順になり、6番目も0にしろとなっていますが、ここでは関係無いので置いておきます。

4、5番目は、テクスチャの横と縦のサイズ、7、8番目はデータのフォーマット、最後はデータ本体です。

下の関数を実行する前はこの描画結果とします。

TexImage2D

GL.CopyTexImage2D関数は、現在画面に映している結果の一部をテクスチャユニットに上書きコピーします。

				GL.CopyTexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, 0, 0,
					textureWidth, textureHeight, 0);

4、5番目は、出力画面の中でコピーしたい部分の左下の座標xとyです。6、7番目は、コピーしたい部分の横と縦のサイズです。8番目は0としてください。

このプログラムでは、左下から480px四方の結果をテクスチャユニットへ上書きしています。

CopyImage2D

GL.TexSubImage2D関数は、指定のデータをテクスチャユニットの一部へ上書きします。

				GL.TexSubImage2D(TextureTarget.Texture2D, 0, textureWidth / 4, textureHeight / 4,
					textureWidth / 2, textureHeight / 2, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, textureData[1]);

3、4番目は、上書きしたい部分の左下の座標xとyです。6、7番目は、上書きしたい部分の横と縦のサイズです。

このプログラムでは、テクスチャユニットの中央へ小さな画像データを上書きしています。

TexSubImage2D

GL.CopyTexSubImage2D関数は、現在画面に映している結果の一部をテクスチャユニットの一部へ上書きします。

				GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, textureWidth / 4, textureHeight / 4,
					this.Width - textureWidth / 2, this.Height - textureHeight / 2, textureWidth / 2, textureHeight / 2);

3、4番目は、上書きしたい部分の左下の座標xとyです。5、6番目は、コピー元の左下の座標xとyです。7、8番目は、横と縦のサイズです。

このプログラムでは、右上から240px四方の結果を小さな画像データをテクスチャユニットの中央へ上書きしています。

TexSubImage2D

TexSubImage2Dはよく使うかもしれませんが、その他は特殊な場面でよく使うかもしれません。

なお、コピーしたい部分の場所とサイズは、コピー先のテクスチャの領域を超えないようにしてください(領域外に上書きや、コピー元データが足りないなど)。そうしないと、正しい結果が得られず、テクスチャ用バッファもおかしくなってしまいます。

また、このコードを実際にテストするときの注意点として、キーを推すとが複数押されたと判定されることがありますので気をつけてください。

記事

外部リンク

Thanks