

# 症状

PyOpenGL(3.1.1a1) +Python3.7で画像の上に四角形を表示したいが、挙動がおかしい。

## 実現しようとしていること

PNG画像をテクスチャ化し、その上に半透明の黒の四角形を表示する。  
四角形は一回り小さくしてあります。

## 発生する症状

四角形の表示は正常にできるものの、マウスを左クリックすると、表示がおかしくなります。

### 左クリック前

[![左クリック前](https://i.stack.imgur.com/pn8qP.png)](https://i.stack.imgur.com/pn8qP.png)

### 左クリック後

[![左クリック後](https://i.stack.imgur.com/xrH7c.png)](https://i.stack.imgur.com/xrH7c.png)

以下、ソースコード

[code]

    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()##変換行列に保存ｌ再描画イベント発生時に動かないようにする。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()
    
[/code]


CC BY-SA 4.0
2019-01-23T00:44:10.310
52222
2020-07-03T08:07:15.597
2020-06-17T08:14:45.997
-1
31881
question
python python3 anaconda opengl
Python、OpenGLで四角形のブレンドが上手くできません。


問題点は再現しませんでしたが、以下の修正ではいかがでしょうか？

  1. `glutSwapBuffers()` を `display()` の最後の行に移動して、他をコメントアウトします。
  2. `ScreenShort()` 内では、 Blend を行う必要がないので、コメントアウトします。


CC BY-SA 4.0
2020-01-23T08:25:35.267
62489
2020-01-23T08:39:46.983
2020-01-23T08:39:46.983
32986
37562
52222
answer