3DCG

Python3で「OpenGL」を学ぶ 「PyOpenGL」NeHe Lesson6

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();

実行結果