テクスチャー
■ 課題
今回の課題は以下の通り。
  • テンプレートをコンパイルし、四角のポリゴンにテクスチャを正しく貼ってください。

  • テクスチャのデータを生成する部分を修正し、円状のグラデーションを作ってください。

  • ライトを当ててシェーディング効果を出し、テクスチャの上に反映させて下さい。

  • テクスチャの拡大縮小時のフィルター効果がわかるプログラムを書いてください。

  • glpng のライブラリを用いてテクスチャをロードし、楽しいアニメーションを作って下さい。 回転や拡大をするだけではテクスチャの利点を活かしているとは判断できません。
  • ■ 今回のヒント
    円状グラデーションのテクスチャを作るには、各ピクセル単位の明度としてテクスチャの中心からの距離を利用することができます。距離がそのまま明度になるなら、中心から遠くにいくほど白い、といった感じですね。ちなみに、ある二点 (x1, y1), (x2, y2)の間の距離をだすには、

    sqrt((x1-x2)×(x1-x2)+(y1-y2)×(y1-y2))

    です。平方根をとる関数 sqrt() をつかうには math.h をインクルードする必要があります。中心(テクスチャの幅/2, テクスチャの高さ/2)からの距離を出すわけですから、さきほどのある二点のうち、どちらかを中心として、もう片方をテクスチャの各ピクセル位置にして距離を計算すればよいですね。出てきた距離は適当な範囲に収めるようにするとよいでしょう。unsigned char なら 0〜255 みたいな。

    また、ライトを当ててシェーディング効果をテクスチャの上に反映させたい場合は、glTexEnv*() を利用して、ポリゴンの上にどうテクスチャを重ねるかを指定しなくてはいけませんし、前回の演習同様に、ライトを設定し、ポリゴンに法線を持たせなくては正しく表現されません。

    テクスチャの拡大縮小時のフィルター効果は、文字通り拡大縮小されたテクスチャのピクセルがどのように補間されるかを決めるものです。 従って、違うフィルターを使ったテクスチャを並べて表示しておくなどして、テクスチャの拡大と縮小した際に「どう変化するか」を観察できるようなプログラムが望ましいと思います。

    下記の関数についても調べてみるとよいでしょう。

  • glGenTextures() / glDeleteTextures()
  • glBindTexture()
  • glTexParameter*()
  • glTexEnv*()
  • glTexImage*()

  • glEnable() / glDisable()
  • glTexCoord*()
  • Demo: Texture Animation

    [ 戻る ]

    Written by Yasuhiro Yamazaki, 2001.
    Modified by Youhei Nishidate, 2003.