2019年8月11日日曜日

pyopengl opengl 四角形にチェッカー模様のテクスチャを貼り付ける





#!/usr/bin/env python
#coding:utf-8
# [2019-08-02]

#参考サイト
#グラフィックス科学演習 #テクスチャ
#http://web.wakayama-u.ac.jp/~wuhy/GSS/07.html#8.1
#PyOpenGL 6 テクスチャ
#http://www.not-enough.org/abe/manual/api-aa09/pyopengl6.html
#テクスチャマッピング
# http://www.oit.ac.jp/is/L231/~whashimo/Article/OpenGL/Chapter7/index.html

#テクスチャマッピング(Texture Mapping)
#http://www.oit.ac.jp/is/L231/~whashimo/Article/OpenGL/Chapter7/index.html

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys


TEX_HEIGHT = 16
TEX_WIDTH   = 16
#テクスチャサイズの16×16とその一つ一つの画素にRGBAの4バイトを割り当て
#ている
image = [[[0 for i in range(4)] for j in range(TEX_WIDTH)]
            for k in range(TEX_HEIGHT)]

#テクスチャの準備
#テクスチャのサイズは縦横とも2の累乗になっていなければならない
def initTexture():
    for i in range(TEX_HEIGHT):
        for j in range(TEX_WIDTH):
            #2で割り切れる場合1そうでない場合0
            #以下ビット演算だからi=1,2,3,4,....
            #i&0x01 は 1,0,1,0.....  ^排他的論理和 1^1=0 0^0=1
            #故に i=1 ならc=0,1,0,1....
            #故に i=0 ならc=1,0,1,0....
            c = ( ((i&0x01)==0)^((j&0x01)==0) )
            #RGBには0か255の値、Aには255を入れる
            image[i][j][0]= image[i][j][1]= image[i][j][2]=c*255
            image[i][j][3]=255

def displayTexPolygon():
    glEnable(GL_TEXTURE_2D)
    glBegin(GL_QUADS)
    glTexCoord2f(0.0, 0.0)
    glVertex3f(-5.0,-5.0, 0.0)
    glTexCoord2f(0.0, 1.0)
    glVertex3f(-5.0, 5.0, 0.0)
    glTexCoord2f(1.0, 1.0)
    glVertex3f( 5.0, 5.0, 0.0)
    glTexCoord2f(1.0, 0.0)
    glVertex3f( 5.0,-5.0, 0.0)
    glEnd()
    glDisable(GL_TEXTURE_2D)


def display():
    spin=0.0
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    glTranslatef(0.0, 0.0,-20.0)
    glRotatef(spin, 0.0, 1.0, 0.0)
    glColor3f(1.0, 1.0, 1.0)
    displayTexPolygon()

    spin+=1.0
    glPopMatrix()
    glFlush()
    glutSwapBuffers()

def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glDepthFunc(GL_LEQUAL)
    glEnable(GL_DEPTH_TEST)
    initTexture()
    #以下一行コメントアウトしても問題なかった
    #glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    #imageのリストの設定では画素はRGBAで表しているので
    #引数は4ではないか 4でもなんら問題なかった。
    #glPixelStorei(GL_UNPACK_ALIGNMENT, 4)
    #glPixelStorei(GL_UNPACK_ALIGNMENT, 4)
    #別のコードでも1でも4でもglPixelStoreiがなかろうが関係なしだっ#た。 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    #配列の内容をテクスチャバッファに格納する
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT,
             0, GL_RGBA, GL_UNSIGNED_BYTE, image)

def reshape(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(-5.0, 5.0,-5.0, 5.0, 5.0, 500.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode (GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA)
    glutInitWindowSize (250, 250)
    glutInitWindowPosition (100, 100)
    glutCreateWindow ("テクスチャ")
    init()
    glutIdleFunc(display)
    glutDisplayFunc(display)
    glutReshapeFunc(reshape)
    glutMainLoop()

if __name__ == "__main__":
    main()
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                                                             
~                                           

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts