Python PyOpenGL读回缓冲区颜色

Python PyOpenGL读回缓冲区颜色,python,opengl,pyqt5,pyopengl,Python,Opengl,Pyqt5,Pyopengl,我的Pyqt5窗口中有一个由PyOpenGL绘制的球体: 然后,我使用self.swapBuffers()切换到后缓冲区,然后再次使用不同的颜色绘制到后缓冲区 用鼠标点击,我试图读取后缓冲区的颜色 但它给了我前缓冲区的值。这里的问题是,是否可以从后面读取值,如果可以,这里到底出了什么问题 用链接中的答案生成的小示例 以下顺序 永远不会去上班。交换缓冲区后,后缓冲区的内容将变得未定义 我的Pyqt5窗口中有一个由PyOpenGL绘制的球体。那么,我是 使用self.swapBuffers()切换到

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

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

用鼠标点击,我试图读取后缓冲区的颜色

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

用链接中的答案生成的小示例

以下顺序

永远不会去上班。交换缓冲区后,后缓冲区的内容将变得未定义

我的Pyqt5窗口中有一个由PyOpenGL绘制的球体。那么,我是 使用
self.swapBuffers()
切换到后缓冲区,然后绘制 再次返回到后缓冲区,但颜色不同

嗯,不,你不能那样做。只需渲染一次,然后在
paintGL
的末尾使用
self.swapBuffers()
呈现渲染内容。后缓冲区的内容现在未定义。单击鼠标,再次交换缓冲区,使未定义的内容作为前缓冲区可见,而后缓冲区再次未定义,并将其读回。你甚至从未尝试过用不同的颜色画画

当然,GPU很有可能在内部使用某种交换链,因此“未定义”的内容通常是先前帧的内容,而不仅仅是前一帧的内容

你的整个计划毫无意义。如果要使用简单的渲染方法进行拾取,则根本不会使用
SwapBuffers
。只需渲染到后缓冲区,然后从后缓冲区读取。当您渲染下一个要显示的帧时,您将再次覆盖同一后台缓冲区的内容,最后交换缓冲区以显示它。

以下顺序

永远不会去上班。交换缓冲区后,后缓冲区的内容将变得未定义

我的Pyqt5窗口中有一个由PyOpenGL绘制的球体。那么,我是 使用
self.swapBuffers()
切换到后缓冲区,然后绘制 再次返回到后缓冲区,但颜色不同

嗯,不,你不能那样做。只需渲染一次,然后在
paintGL
的末尾使用
self.swapBuffers()
呈现渲染内容。后缓冲区的内容现在未定义。单击鼠标,再次交换缓冲区,使未定义的内容作为前缓冲区可见,而后缓冲区再次未定义,并将其读回。你甚至从未尝试过用不同的颜色画画

当然,GPU很有可能在内部使用某种交换链,因此“未定义”的内容通常是先前帧的内容,而不仅仅是前一帧的内容


你的整个计划毫无意义。如果要使用简单的渲染方法进行拾取,则根本不会使用
SwapBuffers
。只需渲染到后缓冲区,然后从后缓冲区读取。当渲染下一个要显示的帧时,再次覆盖同一后台缓冲区的内容,最后交换缓冲区以显示它。

再次检查
mousePressEvent()
是否有当前GL上下文,建议它可能没有。再次检查
mousePressEvent()
是否有当前GL上下文,建议可能不会。谢谢你的评论。我还在学习,所以你的评论肯定给了我一个非常好的看法。这里的一个问题是如何“只渲染到后台缓冲区”?在这个例子之前我也试过,但我做不到。提前谢谢你的帮助@谢谢你的评论。我还在学习,所以你的评论肯定给了我一个非常好的看法。这里的一个问题是如何“只渲染到后台缓冲区”?在这个例子之前我也试过,但我做不到。提前谢谢你的帮助@德哈斯
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, 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, 0, 0, 1)
        glClearDepth(1.0)
        glEnable(GL_DEPTH_TEST)

    def resizeGL(self, width, height):
        #glViewport is needed for proper resizing of QGLWidget
        glViewport(0, 0, width, height)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(0, width, 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, h/2, -w/2*0.1)
        # print(GlWidget.joint_nodes[i][1], GlWidget.joint_nodes[i][2])
        glColor3f(1.0, 1.0, 0.5)

        gluSphere(Q, w/2*0.1, 32, 32)
        glTranslatef(-w/2, -h/2, 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, 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_()
    self.swapBuffers()
    glReadBuffer(GL_BACK)
    c= glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT)