PyOpenGL 读回缓冲区颜色

问题描述

我的 Pyqt5 窗口中有一个由 PyOpenGL 绘制的球体:

然后,我使用 self.swapBuffers() 切换到后台缓冲区,然后再次绘制到后台缓冲区,但使用不同的颜色。

通过单击鼠标,我正在尝试读取后台缓冲区颜色,

但它给了我前端缓冲区的价值。这里的问题,是否可以从后面读取值,如果可以,这里到底有什么问题?

使用链接中的答案生成的小示例 https://stackoverflow.com/a/46259752/3870250

from OpenGL.GL import *
from OpenGL.GLU import *
from PyQt5 import QtGui
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import *
from PyQt5.QtOpenGL import *
import sys

class MainWindow(QWidget):

    def __init__(self):
        super(MainWindow,self).__init__()
        self.widget = GLWidget(self)
        self.statusbar = QStatusBar()
        self.statusbar.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Fixed)
        self.statusbar.showMessage("Click anywhere on the QGLWidget to see a pixel's RGBA value!")
        layout = QVBoxLayout()
        layout.addWidget(self.widget)
        layout.addWidget(self.statusbar)
        layout.setContentsMargins(5,5,5)
        self.setLayout(layout)

class GLWidget(QGLWidget):

    def __init__(self,parent):
        QGLWidget.__init__(self,parent)
        self.setMinimumSize(640,480)
        #LMB = left mouse button
        #True: fires mouseMoveEvents even when not holding down LMB
        #False: only fire mouseMoveEvents when holding down LMB
        self.setMouseTracking(False)

    def initializeGL(self):
        glClearColor(0,1)
        glClearDepth(1.0)
        glEnable(GL_DEPTH_TEST)

    def resizeGL(self,width,height):
        #glViewport is needed for proper resizing of QGLWidget
        glViewport(0,height)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(0,height,-1,1)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

    def paintGL(self):
        w,h = self.width(),self.height()
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        Q = gluNewQuadric()

        glTranslatef(w/2,h/2,-w/2*0.1)
        glColor3f(1.0,1.0,1.0)
        gluSphere(Q,w/2*0.1,32,32)
        glTranslatef(-w/2,-h/2,+w/2*0.1)
        self.swapBuffers()
        glTranslatef(w/2,-w/2*0.1)
        # print(GlWidget.joint_nodes[i][1],GlWidget.joint_nodes[i][2])
        glColor3f(1.0,0.5)

        gluSphere(Q,w/2*0.1)
        self.swapBuffers()

    def mousePressEvent(self,event):
        x,y = event.x(),event.y()
        self.swapBuffers()
        glReadBuffer(GL_BACK)
        c= glReadPixels(x,y,1,GL_RGB,GL_FLOAT)
        print('c = ',c)

    def mouseMoveEvent(self,event):
        pass

    def mouseReleaseEvent(self,event):
        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.setWindowTitle("Color Picker Demo")
    window.show()
    app.exec_()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)