2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

テクスチャマッピング

Last updated at Posted at 2018-06-03

概要

テクスチャマッピングの記事は多くあるけど
以下みたいな形でテクスチャ座標がないモデルに対してのレンダリング方法について書いてる記事が見当たらなかったので書こうと思います。
textureMapping.png

考えたら結構単純な実装ですんだためここでは具体的なテクスチャマッピングの手法は書きません。

  • 他のサイトでたくさん解説記事あるので

きれいなテクスチャマッピングの方法についても書きません。

  • 詳しく知らないので書けません。
  • テクスチャマッピングを計算する論文読まないといけない?良いやり方あれば教えてください。

上図のBunnyを上から見たらこんな感じのマッピング結果になってます。
textureMapping2.png

こういったレンダリングどうやってるんだろーと軽く思った人向けの記事になります。

やること

  • テクスチャの用意

まずはレンダリングするのに必要なテクスチャを用意する必要があります。
画像としてあらかじめ用意してもいいし、簡単なのでコードで書いてもよいです。
uv.png
コードの場合は以下のような感じになります。

code

        /// <summary>
        /// UVテクスチャの生成
        /// </summary>
        /// <param name="size">サイズ</param>
        /// <returns>テクスチャ</returns>
        public float[,,] CreateUVTexture(int size)
        {
            float[,,] rgba = new float[size, size, 4];
            float halfSize = size / 2;

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if (halfSize < i && halfSize < j ||
                        halfSize > i && halfSize > j)
                    {
                        rgba[i, j, 0] = 255;
                        rgba[i, j, 1] = 255;
                        rgba[i, j, 2] = 255;
                        rgba[i, j, 3] = 255;
                    }
                    else
                    {
                        rgba[i, j, 0] = 0;
                        rgba[i, j, 1] = 0;
                        rgba[i, j, 2] = 0;
                        rgba[i, j, 3] = 255;
                    }
                }
            }

            return rgba;
        }

code

  • サンプラの設定

サンプラのWrapパラメータはRepeatにしておきます。

code

            GL.BindTexture(TextureTarget.Texture2D, textureId);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, Convert.ToInt32(TextureWrapMode.Repeat));
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, Convert.ToInt32(TextureWrapMode.Repeat));
            GL.BindTexture(TextureTarget.Texture2D, 0);

code

  • テクスチャ座標の設定

きれいにテクスチャマッピングしたい場合はここが一番の肝になる部分ですが分からないので
今回(概要に乗せた図)は頂点座標のxyの座標に10を掛けた値をテクスチャ座標としています。
(Bunnyを-0.5から0.5の大きさに正規化しているため)

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?