lesson6.pyでは、bmp画像を読み込みテクスチャとして、立方体に貼り付けている。よりシンプルな形やpng画像の読み込み方法も確認したいが、ひとまず、NeHeのlessonに沿って進める。
テクスチャを読み込む
ここでflip()しているのは、bmpがファイルフォーマットの都合で、上下が反転してしまうため。詳しくはこちらを確認してください。
from PIL import Image, ImageOps
def LoadTextures():
#global texture
image = Image.open("NeHe.bmp")
image = ImageOps.flip(image)
ix, iy = image.size
image = image.tobytes()
glBindTexture(GL_TEXTURE_2D, glGenTextures(1))
glPixelStorei(GL_UNPACK_ALIGNMENT,1)
glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGB, GL_UNSIGNED_BYTE, image)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
この関数はInitGL()の初めで呼び出されている。直後にGL_TEXTURE_2Dを有効にする。
def InitGL(Width, Height):
LoadTextures()
glEnable(GL_TEXTURE_2D)
# 省略
描画時にテクスチャをマップする
glBegin(GL_QUADS)
# 前面(テクスチャーの角が立方体の角と一致していなければならない)
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # テクスチャと四角の左下
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # テクスチャと四角の右下
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # テクスチャと四角の右上
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # テクスチャと四角の左上
# 背面
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) # テクスチャと四角の右下
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # テクスチャと四角の右上
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # テクスチャと四角の左上
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) # テクスチャと四角の左下
# 上面
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # テクスチャと四角の左上
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0) # テクスチャと四角の左下
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0) # テクスチャと四角の右下
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # テクスチャと四角の右上
# 底面
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0) # テクスチャと四角の右上
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0) # テクスチャと四角の左上
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # テクスチャと四角の左下
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # テクスチャと四角の右下
# 右面
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) # テクスチャと四角の右下
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # テクスチャと四角の右上
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # テクスチャと四角の左上
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # テクスチャと四角の左下
# 左面
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) # テクスチャと四角の左下
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # テクスチャと四角の右下
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # テクスチャと四角の右上
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # テクスチャと四角の左上
glEnd();