Python、OpenGLで四角形のブレンドが上手くできません。
症状
PyOpenGL(3.1.1a1) +Python3.7で画像の上に四角形を表示したいが、挙動がおかしい。
実現しようとしていること
PNG画像をテクスチャ化し、その上に半透明の黒の四角形を表示する。
四角形は一回り小さくしてあります。
発生する症状
四角形の表示は正常にできるものの、マウスを左クリックすると、表示がおかしくなります。
左クリック前
左クリック後
以下、ソースコード
import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from win32api import GetSystemMetrics
from PIL import Image
def load_texture():
img = Image.open("PIL_capture.png")
w, h = img.size
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img.tobytes())
def ScreenShort():
glPushMatrix()
glClearColor(1.0, 1.0, 0.0, 0.0)#背景の色##glの初期化
glClear(GL_COLOR_BUFFER_BIT)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable(GL_BLEND)##glの初期化#ブレンドの有効か
glEnable(GL_TEXTURE_2D)##glの初期化##テクスチャを有効化
glBegin(GL_QUADS)
glTexCoord2d(0.0, 1.0)
glVertex3d(-1.0, -1.0, 0.0)
glTexCoord2d(1.0, 1.0)
glVertex3d( 1.0, -1.0, 0.0)
glTexCoord2d(1.0, 0.0)
glVertex3d( 1.0, 1.0, 0.0)
glTexCoord2d(0.0, 0.0)
glVertex3d(-1.0, 1.0, 0.0)
glEnd()
glDisable(GL_TEXTURE_2D)
glDisable(GL_BLEND)
glFlush()
glPopMatrix()
def sikakukei():
##四角形
glutSwapBuffers()
glPushMatrix()
glColor4f(0.0,0.0,0.0,0.4)#テクスチャの色指定##黒##透過率##用調整
glEnable(GL_BLEND)##ブレンド有効
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glBegin(GL_POLYGON)
glVertex2d(-0.9,-0.9)##テクスチャの頂点指定
glVertex2d(0.9,-0.9)
glVertex2d(0.9,0.9)
glVertex2d(-0.9,0.9)
glEnd()
glPopMatrix()
glFlush()##強制実行
# def haikei():
# glClearColor(1.0, 1.0, 1.0, 0.0)##背景の色##白
##バッファ削除
def display():#図形描画
#glClear(GL_COLOR_BUFFER_BIT)
glPushMatrix()
ScreenShort()
glPopMatrix()
glPushMatrix()##変換行列に保存l再描画イベント発生時に動かないようにする。glPopMatrix()とくみあわせる。
#glRotated(1.0,1.0,1.0,1.0)
sikakukei()
glPopMatrix()#
def main():##GLUTの設定
glutInit(sys.argv)##GLUT 初期化
glutInitDisplayMode(GLUT_RGBA)##OpenGL の描画時に利用するモードを指定
w = GetSystemMetrics(0)#横ピクセル数取得
h = GetSystemMetrics(1)#縦ピクセル数取得
glutGameModeString (str(w)+"x"+str(h)+":32@60")##ゲームモード時の画面設定
# glutGameModeString ("1920x1080:32@60")##ゲームモード時の画面設定
glutEnterGameMode()##glutEnterGameMode
##glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glutSwapBuffers()
load_texture()
glutDisplayFunc(display)#描画処理 glutMainLoop()よりも前に書く
##テクスチャを拡大・縮小する方法の指定 */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
##glutIdleFunc(glutPostRedisplay())
glutKeyboardFunc(keyboard)
glutMainLoop()
##インポートされた際にプログラムが動かないようにするための文
##http://blog.pyq.jp/entry/Python_kaiketsu_180207
if __name__ == '__main__':
main()